SlideShare a Scribd company logo
@takahoyo
§ Pythonで書かれた対話型のパケット操作プログラム
-‐‑‒ Pythonのライブラリとしてimportして使うことも
-‐‑‒ ドキュメント(英語)が充実している
§ http://www.secdev.org/projects/scapy/
§ http://www.secdev.org/projects/scapy/doc/index.html
§ 何ができる?
-‐‑‒ パケットの⽣生成
-‐‑‒ パケットの送受信
-‐‑‒ pcapファイルの読み込み、書き込み
-‐‑‒ など
§ 読み⽅方は、「すけいぴー」「すきゃっぴー」?
-‐‑‒ http://yomikata.org/word/scapy
2015/9/30 2
§ Python 2系がインストールされてる環境で試した
-‐‑‒ 3系は⾮非公式で対応してるらしい
§ Linux
-‐‑‒ Kali Linuxならデフォルトでインストール
-‐‑‒ Ubuntu : sudo apt-get install python-scapy
§ Mac
-‐‑‒ brew : brew install libdnet scapy
§ 他のインストール⽅方法について
-‐‑‒ 公式のドキュメントを参照(情報が少し古い
-‐‑‒ http://www.secdev.org/projects/scapy/doc/installation.html
2015/9/30 3
2015/9/30 4
§パケットを作る
§パケットを送る
§パケットを解析する
2015/9/30 5
2015/9/30
§ まずはこういうパケットを作ってみよう
2015/9/30
Ethernet IP TCP
§ プロトコルがクラスとして定義されている
-‐‑‒ Ex. Ethernet → Etherクラス
§ “/”を使うことで、複数のレイヤのパケットを作る
-‐‑‒ こういうパケットを作る場合
-‐‑‒ Ether()/IP()/TCP()
2015/9/30 8
Ethernet IP TCP
§ 次は各プロトコルフィールドに値を指定
-‐‑‒ Ethernet
§ Src MAC Addr: 00:00:00:00:00:00
§ Dst MAC Addr: 11:11:11:11:11:11
-‐‑‒ IP
§ Src IP Addr: 192.168.1.1
§ Dst IP Addr: 192.168.1.2
-‐‑‒ TCP
§ Src port: 1234
§ Dst port: 4321
§ Flag: SYN
2015/9/30 9
§ 引数を指定して、フィールドを特定の値で初期化
§ フィールドに対応してる変数を調べる
-‐‑‒ ls(クラス名)
-‐‑‒ Ex. Etherクラス → ls(Ether)
2015/9/30 10
§ 前述のパケットを作ると次のようになる
-‐‑‒ Ether(src="11:11:11:11:11:11",
dst="00:00:00:00:00:00”)/IP(src="192.168.1.1",
dst="192.168.1.2")/TCP(sport=1234, dport=4321, flags="S")
2015/9/30 11
§ 変数packetにパケットを保存
§ 変数packetの中⾝身を表⽰示
§ 変数packetの中⾝身をWiresharkで表⽰示
-‐‑‒ wireshark(packet)
§ 変数packetの中⾝身をexample.pcapに書き込み
-‐‑‒ wrpcap(‘example.pcap’,packet)
2015/9/30 12
§ Wiresharkで表⽰示
2015/9/30 13
§ ここまで、”Ether/IP/TCP”のパケットを作った
§ 他のプロトコルにも対応している
-‐‑‒ ls()でどのようなプロトコルが対応しているか表⽰示できる
-‐‑‒ L1~L4のプロトコルであればほぼ対応
-‐‑‒ L5~L7は、あまり対応してない雰囲気…
2015/9/30 14
2015/9/30 15
2015/9/30 16
§ まずパケットを作る
-‐‑‒ “ICMP Echo Request”パケットを作る
§ そのパケットを送る
-‐‑‒ send()で送信することができる
-‐‑‒ send()の場合、L2のプロトコルは⾃自動で調整
§ Wiresharkで⾒見見てみる
2015/9/30 17
§ 送るだけでなく、返ってきたパケットも⾒見見る
-‐‑‒ sr()を使う
-‐‑‒ sr1()を使うと最初に返ってきた⼀一つのパケットだけ⾒見見る
2015/9/30 18
§ 返ってきたパケットを変数に保存する
-‐‑‒ sr()やsr1()の戻り値は、返ってきたパケットの情報
2015/9/30 19
§ 他にもいろいろな送信⽅方法
2015/9/30 20
function (引数は初期値,  N:None) 説明
send(pkt, count=1,inter=1,iface=N) L3レベルでのパケット送信
sendp(pkt, count=1, inter=1, iface=N) L2レベルでのパケット送信
sendfast(pkt, pps=N, mbps=N, iface=N) tcpreplayを使って送るらしい
sr(pkt, filter=N, iface=N) : L3
srp(pkt, filter=N,iface=N) : L2
パケット送信
返答をすべて受信
sr1(pkt, filter=N, iface=N) : L3
srp1(pkt, filter=N, iface=N) : L2
パケット送信
返答を1つだけ受信
srflood(pkt, filter=N, iface=N) : L3
srpflood(pkt, filter=N, iface=N): L2
パケットを⼤大量量に送信(Flood)
返答をすべて受信(危なそう)
§ パケット送信の応⽤用例例
§ Pythonでデータを処理理して送信する
-‐‑‒ JPEGファイルをpythonで読み込む
-‐‑‒ 読み込んだファイルを分割する
-‐‑‒ ICMPのデータ部に分割したデータを⼊入れたパケットを作る
-‐‑‒ そのパケットを送信する
-‐‑‒ https://www.cloudshark.org/captures/48a2a5e3d98e
-‐‑‒ このように変なパケットも作ることが出来る
§ 応⽤用すればもっと変なパケットを作ることも…
2015/9/30 21
2015/9/30 22
2015/9/30 23
§ pcapファイルを読み込む
-‐‑‒ rdpcap()を使う
-‐‑‒ 変数packetsに、pcapファイル内のパケットが読み込まれる
-‐‑‒ packets[n]でn-1番⽬目にあるパケットにアクセスできる
2015/9/30
§ WiresharkとScapyでパケットを⾒見見⽐比べてみる
2015/9/30 25
§ 各フィールドへのアクセス
-‐‑‒ 変数packetsにパケットが読み込まれている場合
-‐‑‒ packets[n][‘layername’].fieldname
-‐‑‒ 例例1: 1番⽬目のパケットの送信元IPアドレスを表⽰示
-‐‑‒ 例例2: 1番⽬目のパケットのICMPデータを表⽰示
2015/9/30 26
§ 処理理を⼯工夫することで様々な処理理が可能
-‐‑‒ for⽂文を使った複数のパケットの処理理
2015/9/30 27
§ これを出来ると何が嬉しい?
-‐‑‒ Wiresharkで⼿手が届かない処理理が出来る
§ 例例.
-‐‑‒ https://www.cloudshark.org/captures/20532c9a3305
-‐‑‒ ptunnelのパケット
§ 参考 : http://mrt-k.hateblo.jp/entry/2014/02/02/205332
-‐‑‒ TCPなら、Wiresharkで”Follow TCP Stream”を使える
-‐‑‒ ICMPの場合、それに該当する機能がWiresharkにない
-‐‑‒ ScapyならICMPのデータ部分を繋げることが出来る
-‐‑‒ さらにそのデータを処理理出来る
2015/9/30 28
§ まずWiresharkで⾒見見てみる
2015/9/30 29
28byteのヘッダ
29byte⽬目以降降は
HTTPのデータ
§ まずWiresharkで⾒見見てみる
2015/9/30 30
JPEGのヘッダ
§ まずWiresharkで⾒見見てみる(結果)
-‐‑‒ ICMPのデータ部分にptunnel使ったデータ
-‐‑‒ データの最初の28byteはヘッダ、それ以外はHTTP通信
-‐‑‒ “GET /flag.jpg”からflag.jpgを取得してるパケットと推測
-‐‑‒ 複数のパケットを⾒見見ると、JPEGのデータが確認できる
§ Scapy使って何をやるか
-‐‑‒ ICMPのデータを抽出
-‐‑‒ 28byteのヘッダを取り除いて、それ以外のデータをつなげる
-‐‑‒ そのデータからJPEGデータを抽出する
-‐‑‒ pythonなので、これをすべて⼀一緒にできる
2015/9/30 31
2015/9/30 32
§ ちなみに…
§ packets[n].timeでタイムスタンプにアクセスできる
2015/9/30 33
2015/9/30 34
§ 対話型であること
-‐‑‒ ⼿手軽に使える、試せる
§ Pythonであること
-‐‑‒ 他の便便利利なライブラリと⼀一緒に使える
-‐‑‒ Python最⾼高
§ 他のソフトウェアとの連携
-‐‑‒ Wireshark
-‐‑‒ nmap
-‐‑‒ p0f
§ 他のツールよりも柔軟に処理理が出来る
2015/9/30 35
§ インストールがやや⾯面倒くさい
§ Python使えないとつらい
§ 開発が⽌止まってる?
§ L5~L7レイヤに対応してくれたらなあ…
§ Pythonなのでやや遅い
-‐‑‒ その辺りはCで実装されたツールが良良いかも
§ PcapNgに対応してない
-‐‑‒ editcapで変換すれば良良いが…
2015/9/30 36
§ Scapyの公式ドキュメント
-‐‑‒ http://www.secdev.org/projects/scapy/doc/index.html
§ Scapy Cheat Sheet
-‐‑‒ http://packetlife.net/media/library/36/scapy.pdf
§ scapy でソケット通信
-‐‑‒ http://nigaky.hatenablog.com/entry/20110716/1310813250
§ Scapyでのパケットの扱い⽅方
-‐‑‒ http://mrt-
k.github.io/scapy,nw/2015/02/16/Scapy%E3%81%A7%E3%81
%AE%E3%83%91%E3%82%B1%E3%83%83%E3%83%88%E3
%81%AE%E6%89%B1%E3%81%84%E6%96%B9/
§ Scapy presentation
-‐‑‒ http://www.slideshare.net/reonnishimura5/scapy-presentation
2015/9/30 37

More Related Content

Scapyで作る・解析するパケット