web-dev-qa-db-ja.com

tcpdumpを使用した人間が読める形式のhttpヘッダー

Linuxマシンで、Apache(ポート80でリッスン)からTomcat(ポート4080で)に送信されるHTTPヘッダーを表示したいと思います。

Wikipedia によると、

ヘッダーフィールドは、コロンで区切られた名前と値のペアで、クリアテキストの文字列形式です。

私は次の tcpdump コマンドのいくつかのバリエーションを試しました:

$ Sudo tcpdump -lnX dst port 4080 -c 10

11:29:28.605894 IP SOME_IP.33273 > SOME_IP.4080: P 0:49(49) ack 1 win 23 <nop,nop,timestamp 1191760962 509391143>
    0x0000:  4500 0065 3a9f 4000 3f06 0084 628a 9ec4  E..e:.@.?...b...
    0x0010:  628a 9c97 81f9 0ff0 9e87 eee0 144b 90e1  b............K..
    0x0020:  8018 0017 fb43 0000 0101 080a 4708 d442  .....C......G..B
    0x0030:  1e5c b127 4845 4144 202f 6461 7070 6572  .\.'HEAD./dapper
    0x0040:  5f73 6572 7669 6e67 2f41 644d 6f6e 6b65  _serving/AdMonke
    0x0050:  793f                                     y?

結果は常に同じでした-意味不明な言葉と英語の単語の奇妙な組み合わせ(例:HEAD)。

人間が読める形式でヘッダーを表示するにはどうすればよいですか?

73
Adam Matan

これは、tcpdumpを使用してリクエストとレスポンスのHTTPヘッダーを表示するために思いついた1行です(これはあなたのケースでも機能するはずです)。

Sudo tcpdump -A -s 10240 'tcp port 4080 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)' | egrep --line-buffered "^........(GET |HTTP\/|POST |HEAD )|^[A-Za-z0-9-]+: " | sed -r 's/^........(GET |HTTP\/|POST |HEAD )/\n\1/g'

これはパケットを10Kbで制限し、GET、POSTおよびHEADコマンドのみを認識しますが、ほとんどの場合それで十分です。

[〜#〜] edit [〜#〜]:各ステップでバッファを削除して応答性を高めるように変更しました。ただし、今はPerlとstdbufが必要なので、ない場合は元のバージョンを使用します:[〜#〜] edit [〜#〜]:スクリプトポートターゲットを80から4080に変更し、外部トラフィックがポート80に到着するのではなく、Apacheを通過したトラフィックを実際にリッスンするようにしました。

Sudo stdbuf -oL -eL /usr/sbin/tcpdump -A -s 10240 "tcp port 4080 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)" | egrep -a --line-buffered ".+(GET |HTTP\/|POST )|^[A-Za-z0-9-]+: " | Perl -nle 'BEGIN{$|=1} { s/.*?(GET |HTTP\/[0-9.]* |POST )/\n$1/g; print }'

いくつかの説明:

  • sudo stdbuf -oL -eLは、tcpdumpを行バッファーで実行します
  • tcpdumpマジックフィルターについては、ここで詳しく説明します。 https://stackoverflow.com/questions/11757477/understanding-tcpdump-filter-bit-masking
  • grepは、GET、HTTP /、またはPOSTを含む行を探しています。またはヘッダーのように見える行(文字と数字の後にコロンが続く)
  • BEGIN {$ | = 1}は、Perlにラインバッファを実行させます
  • s /.*?(GET | HTTP/[0-9。] * | POST)/\n $ 1/gは、すべての新しい要求または応答の先頭の前に改行を追加します
97
Kibber

-Aを使用すると、目的のものに近いものを取得できます。

E....c@.@...
.....Ng.d.P..Ch.).....s.......
.A...u.BHEAD / HTTP/1.1
User-Agent: curl/7.29.0
Host: www.google.com
Accept: */*

パケット全体を確実に取得するには、必ず-s 0を使用してください。

または、wiresharkを使用して、ヘッダーをインタラクティブに表示することもできます。

20
Flup

使用してみてください http://justniffer.sourceforge.net/ 「フォローTCPフロー」オプションを備えた優れたツールまたはWiresharkです。ヘッダー(リクエスト/レスポンス)を表示するtcpdump

0
Danila Ladner