Posted at

tcpdumpでHTTPのPOSTメソッドのBodyを確認する

More than 3 years have passed since last update.

あるWebサーバーで送信されるHTTPのPOSTメソッドのBodyに何が設定されているか確認する必要があり、tcpdumpを使ってやってみたのでメモ


参考


環境


  • Amazon Linux AMI 2015.09.2


tcpdumpを使う

ApacheのモジュールでアクセスログにPOSTのBodyを表示されるものもあるらしいですが、今回はtcpdumpを使ってパケットキャプチャをするようにします。

まずtcpdump自体のインストールをします。

sudo yum install tcpdump

次にtcpudumpコマンドを指定して取得したパケットだけキャプチャします

$sudo tcpdump -i eth0 -Z root -C 1 -A 'tcp dst port 80 and (tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x504f5354)' -w post_data



  • -iオプションでキャプチャするネットワークインターフェースを指定


  • -Zオプションで実行ユーザーを指定(指定しないとtcpdumpユーザーで実行しようとしてファイル書き出しができない)


  • -Cオプションでで結果を出力するファイルをMByte単位でファイルをローテートする

  • ``の間でキャプチャする条件を指定。Webサーバーに対するTCPの80ポートのキャプチャを行う。また、


  • -wオプションで結果を出力するファイルを指定

0x504f5354はHTTPヘッダでPOSTメソッドのリクエストを示すことらしいです(後述のおまけ参照)

では上記をWebサーバーで実行させキャプチャを行っている状態で、クライアントからPOSTデータを送ってみましょう

$curl http://52.69.124.73/ -X POST -d "age=1" -d "hoge=10"

データ送信後、キャプチャを停止させてみるとファイルにデータが追記されているのが確認できます。

$tcpdump -r post_data

reading from file post_data, link-type EN10MB (Ethernet)
21:57:50.412781 IP h101-111-248-034.hogefuga.60341 > ip-172-31-27-43.ap-northeast-1.compute.internal.http: Flags [P.], seq 3588214777:3588214938, ack 2341038372, win 4104, options [nop,nop,TS val 838113355 ecr 7283418], length 161

ただこの状態だとPOSTデータは確認できなかったのでデータの解析にはWiresharkを使います


Wiresharkを使って確認する

クライアントPCにWiresharkをインストールします。

WIRESHARK

Webサーバのpost_dataをscpなどでローカルのPCにコピーし、wiresharkで確認します。

Screen Shot 2016-03-04 at 7.19.40 AM.png

するとHTTPのBodyの部分にcurlで指定したPOSTデータが確認できました。


おまけ

tcpdumpのコマンド実行時の「0x504f5354」という数字は何だろうかというのが気になったのでWiresharkでHTTPヘッダを見てみるとRequestメソッドでPOSTを示すのが「0x504f5354」ということのようですね。

Screen Shot 2016-03-05 at 5.35.01 PM.png

同じようにGETメソッドだけ、PUTメソッドだけtcpdumpをとるなどもできそうですね