tcpdumpを使用したhttpヘッダーの可読形式


69

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

ウィキペディアによると、

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

次の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)。

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


Tcpdumpはパケット全体を表示します。これには、IPおよびTCPヘッダーが含まれます。私の知る限り、TCPペイロードだけを表示することはできません。
ゾレダチェ

回答:


93

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コマンドのみを認識しますが、ほとんどの場合はこれで十分です。

編集:応答性を高めるために、すべてのステップでバッファを削除するように修正しました。今けれどもPerlとstdbufを必要とするので、あなたがそれらを持っていない場合は、元のバージョンを使用します。 EDIT:ポートに到着した代わりに、直接の外部トラフィックのため、実際にはすでにapacheのを経由したトラフィックをリッスンするために、80から4080までのスクリプトポートのターゲットを変更80:

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は、すべての新しい要求または応答の開始前に改行を追加します

1
よく働く。そのtcpdump式がどのように機能するかについての詳細を追加してください。
ビベックトーマス14年

1
ここでは、括弧の「ip」部分について説明します。例:stackoverflow.com/questions/11757477/…–
Kibber

あなたは私をとても頭痛から救った。恥iは+1しかできません。
アーロンドビング

19

を使用すると-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、ヘッダーをインタラクティブに表示するために使用できます。


1
しようとしました-A-s 0、同じ出力を得ました。
アダムマタン

2
なしで試してください-X
フラップ

tcpdump -s 0 -A dst port 4080与えるE..e..@.?.$bb...b....:......w........Q.....G..1.b..HEAD /dapper_serving/AdMonkey?ping=1 HTTP/1.0
アダムMatan

...これはあなたが望むものに近いものです。「HEAD」から読み取る-これはHTTPペイロードです。使用-s 0したことがありHTTP/1.0、その後に何もない場合は、リクエストにHTTPヘッダーがありません。
フラップ

ありがとう。バイナリペイロードなしで、テキストヘッダーのみを印刷する方法はありますか?
アダムMatan

-1

http://justniffer.sourceforge.net/を使用してみてください。 それは「Follow TCP Flow」オプションのあるWiresharkの優れたツールです。ヘッダー(リクエスト/レスポンス)を見るにはtcpdumpよりも優れたオプションがたくさんあります。


1
たぶん、これを動作させる方法の例も追加して
ください-vikas027

たぶんあなたはマニュアルページを読むことができますか?justniffer.sourceforge.net/#!/man_page
ダニララドナー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.