Scapy入門(Scapyを使ったICMP、HTTP(TCP)送信)
はじめに
こんにちは。あかこうです。
前回に引き続き、今回はScapyを作ったパケット送信までをまとめたいと思います。
環境・Scapyの説明等
前回の記事をご覧ください。
今回もscapyを直接起動したインタラクティブシェル上で、一行ずつ実行することを前提としてます。
パケットの作成から送信まで
ICMP(PING)
# googleのサーバに向けたICMPパケットの作成
# IPパケットの上にICMPを積んでいるイメージ
packet = IP(dst='www.google.com')/ICMP()
# パケットの中身を表示
packet.show()
# パケットを送信
# & 返ってきたパケットの表示
sr1(packet)
TCP(HTTP)
コネクションから送信まで
'''TCPにおけるコネクションの流れ'''
'''基本パケットの作成'''
# IPパケットの作成
ip = IP(dst='www.google.com')
# TCP(HTTP)パケットの作成
# sport, seqは適当
# dportは標準である80版ポート, flagは'S'
tcp = TCP(sport=50000,dport=80,flags='S',seq=100)
'''3ハンドシェイクの実装'''
# SYNパケットの作成
syn= ip/tcp
# SYNパケットの送信
# & SYN ACKの受取
syn_ack = sr1(syn)
'''HTTPリクエストの作成(ACKパケットの作成)'''
# ACKパケットの設定
tcp.seq += 1
tcp.ack = syn_ack.seq + 1
# ACKパケットのflagは'A'
tcp.flags = 'A'
# ACKパケット送信
ack = ip/tcp
send(ack)
# HTTP GETのパケットを乗っける
get = 'GET / HTTP/1.1\r\nHost: www.google.com\r\n\r\n'
http = ip/tcp/get
# リクエスト送信
response = sr(http, multi=1, timeout=1)
tcp.seq += len(get)
# レスポンスの表示
response[0][1][1]["Raw"].load
コネクションを切る
'''コネクションを切る'''
# 上記のコードの続き
# FAフラグを持ったFINACKパケットの送信
tcp.flags = 'FA'
fin_ack = sr1(ip/tcp)
tcp.seq += 1
# 最後にACKを返す
tcp.ack = fin_ack.seq + 1
tcp.flags = 'A'
send(ip/tcp)