綾小路龍之介の素人思考

tcpdumpを見やすく

下のようにしてtcpdumpの-Xオプションでパケットの16進ダンプとascii表示できる。

# 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
  1. Passive Network Traffic Analysis: Understanding a Network Through Passive Monitoring

ソーシャルブックマーク

  1. はてなブックマーク
  2. Google Bookmarks
  3. del.icio.us

ChangeLog

  1. Posted: 2006-09-24T23:35:40+09:00
  2. Modified: 2006-09-24T07:16:42+09:00
  3. Generated: 2017-07-08T23:09:20+09:00