Scapy入門②(Scapyを使ったICMP、HTTP(TCP)送信)

More than 1 year has passed since last update.


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)