# tcpdump -X -i eth0 tcp port http
だから、ブラウザでどっかのページをとってくればGET hoge.html HTTP/1.0とかの文字がみえるわけだ。でも、行あたり16バイトしか表示されないのでヘッダーだけ表示するのに何行もかかってしまう。ということでperlを使って其のあたり多少見やすくしてみた。
#!/usr/local/bin/perl
sub readable
{
$num = hex($_[0]);
if(0x0a==$num
|| 0x0d==$num
|| 0x09==$num
|| 0x20<=$num && $num<=0x7F){
return 1;
}else{
return 0;
}
}
my @tmp;
while(<STDIN>){
@tmp = ();
if(m/^\t/){
s/^\t//;
s/^0x[0-9A-Fa-f]+:\s*//;
foreach(split /\s+/){
push @tmp, m/(.{2})(.{2})/;
}
foreach(@tmp){
if(&readable($_)){
print pack("H2", $_);
}else{
print $_;
}
}
}else{
print "\n";
print;
}
}
このスクリプトを適当なファイル名で保存してtcpdumpの出力をパイプする。
# tcpdump -x | perl hoge.pl
tcpdump側で必要なオプションは-x。これで多少見やすくなる。本当に多少だが。perl tcpdumpで検索すると同じようなスクリプトがいくつも見つかる。でもngrepのほうが正解に近いかもしれない。下のような感じ。
# ngrep -d eth1 -W byline port 80
マッチング条件として"HTTP"と指定すれば、HTTPというフレーズが含まれるパケット、つまりリクエストヘッダとレスポンスヘッダを送信したパケットの初め(分割されたパケットの1番目)だけが表示され、それ以外は#で表示される。
# ngrep "HTTP" -d eth1 -W byline port 80