Tahoo!!

自分の勉強していること(コンピュータ関連 / ネットワーク / セキュリティ / サーバ)や趣味について書いていきます

Pythonのdpktモジュールでpcapファイル解析

CTFとかでpcapファイルの問題を解析するとき,基本的にはWiresharkを使う.

しかし,時には複数のパケットにフラグのデータが含まれてたりする場合は,Wiresharkで解析するよりもプログラムとかでデータを抜いて再度構成した方がいいと思うことがある.

そこで,Python(Python弱者だけどw)でpcapファイル解析できるようになるdpktを利用してみる

 dpkt - python packet creation / parsing library - Google Project Hosting

 

 

dpktのインストール

まず,以下からdpktをダウンロード.

https://code.google.com/p/dpkt/downloads/list

今回は最新バージョンの1.8のsorceを選択

次に,落としてきたファイルを展開して,展開したディレクトリで以下のコマンドを実行してインストールを行う.恐らくWindowsでもLinuxでもPythonがインストールされていれば以下の方法で可能

# python setup.py build
# python setup.py install

pcapファイル解析

 以下のサイトを参考にさせてもらった.(というか,このサイト見てdpktの存在を知った訳だが…)

SECCON 2013 横浜大会 Write-up - kusano_kの日記

このサイトを参考にしとりあえず以下のようなコードを書いた

import dpkt,socket

p = dpkt.pcap.Reader(open(filename,'rb'))

for t,buf in p
    eth = dpkt.ethernet.Ethernet(buf)

	ip = eth.data 
	src = ip.src 
	dst = ip.dst 
	src_a = socket.inet_ntoa(src) 
	dst_a = socket.inet_ntoa(dst) 
	print "Sorce IP :%s"%src_a 
	print "Dest IP :%s"%dst_a

各パケットのIPアドレスを表示するスクリプト

どうやら,eth = dpkt.ethernet.Ethernet(buf)のように書くと,Ethernetフレームとして変数に入れられるみたい

IPはEthernetフレームでカプセル化されてるから,Ethernetフレームから見るとdata.よって,eth.dataってやるとIPパケットだけを取り出せる.

さらに,eth.dataをipという変数にいれて,ip.srcにアクセスすると,IPのSorce Addressが入ってた.(変換が必要だが…)

ということは,ip.~というふうにインスタンス変数にアクセスすると,いろいろヘッダの情報にアクセスできるのではないかとdpktのソース見ていたところ,dstとかidとかあるじゃない!!

それで,ip.dstとか表示させると,ちゃんとDestination Addressとか入ってた.

 

なんかWiresharkのディスプレイフィルタで使われる記法に似てるなーと思った