2016-02-04

tcpdumpでHTTP通信を覗く

まず、前提として
TCPヘッダのヘッダ長は先頭から 12[Byte] offset された後の4[bit] に記述されており、そのbit値を4倍することでヘッダ長になる

TCPヘッダ長を得るために
tcp[12:1]
で、12[Byte]オフセットしたところから1[Byte](8[bit])を取得し
& 0xf0
で、その後半を0にするために0xf0 (1111 0000)との積を採る
後半の0000を捨てて(右に4[bit]シフト)、4倍する(左に2[bit]シフト)をまとめて実行→右に2[bit]シフト
>> 2
その、TCPのヘッダ長をオフセットとしてデータ部からMETHODが書かれている先頭部分を取得(ここでは4[Byte])
tcp[((tcp[12:1] & 0xf0) >> 2):4]
これが、"GET "であればtrueとする
= 0x47455420

"GET "のASCIIコード表現は次のように取得
$ echo "GET "|hexdump -C
00000000  47 45 54 20 0a        |GET .|
00000005

これにより、GETメソッドだけフィルタするには
sudo tcpdump -s 0 -A 'tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420'

■POSTだけフィルタ
sudo tcpdump -s 0 -A 'tcp dst port 80 and (tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x504f5354)'

■リクエスト、レスポンス、ボディだけフィルタ
sudo tcpdump -A -s 0 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'

0 件のコメント:

コメントを投稿