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
どうやら,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のディスプレイフィルタで使われる記法に似てるなーと思った