2017年1月16日月曜日

tcpdumpでHTTPリクエストパケットを表示する方法

tcpdumpコマンドでHTTPリクエストパケットを表示するには以下のような指定をすれば良い。

# tcpdump -i enp5s0 'src host 192.168.000.000 and dst port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)' -A

「ip[2:2]」は、パケット全体の長さ。

「ip[0]&0xf」は、IPパケットのヘッダの長さ(4bit)。

「tcp[12]&0xf0」は、TCPヘッダの長さ(4bit)。

「ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0」の意味は、パケット全体の長さからIPヘッダ長とTCPヘッダ長を引いた結果が0でない。つまりデータが存在するパケット。

実行例は以下のような感じ。

# tcpdump -i enp5s0 'src host 192.168.000.000 and dst port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)' -A
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on enp5s0, link-type EN100MB (Ethernet), capture size 65535 bytes
18:05:33.277701 IP localhost.localdomain.44996 > www.yahoo.co.jp.http: Flags [P.], seq 1905887331:1905887471, ack 295056756, win 229, options [nop,nop,TS val 752892287 ecr 90996223], length 140
E.....@.@........O.|...Pq..c..5t...........
,.9..l}.GET / HTTP/1.1
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; rv:1.7.2)
Host: searchranking.yahoo.co.jp
Accept: */*

この例でのHTTPリクエストはphpからcurlを使って発生させたもの。以下のようなプログラム。

    $url = 'http://searchranking.yahoo.co.jp/';
    $ch = curl_init();
    curl_setopt( $ch, CURLOPT_URL, $url );
    curl_setopt( $ch, CURLOPT_USERAGENT,
        'Mozilla/5.0 (Windows; U; Windows NT 5.1; rv:1.7.2)' );
    curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
    $c = curl_exec( $ch )

ブラウザからのHTTPリクエストとはかなり違うようだ。

0 件のコメント:

コメントを投稿