ある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をインストールします。
Webサーバのpost_dataをscpなどでローカルのPCにコピーし、wiresharkで確認します。
するとHTTPのBodyの部分にcurlで指定したPOSTデータが確認できました。
おまけ
tcpdumpのコマンド実行時の「0x504f5354」という数字は何だろうかというのが気になったのでWiresharkでHTTPヘッダを見てみるとRequestメソッドでPOSTを示すのが「0x504f5354」ということのようですね。
同じようにGETメソッドだけ、PUTメソッドだけtcpdumpをとるなどもできそうですね