tcpdump:grepable出力を取得する方法?


13

アプライアンスでtcpdumpしか使用できないという問題をトラブルシューティングしようとしています。tcpdumpを使用してWebトラフィックをフィルタリングし、特定の文字列を含むトラフィックのみを表示したい。

私は次のことを行います:

tcpdump -nei eth0 -X | grep "something interesting"

出力は16バイトpr行のhexviewです。データは複数の行に表示されるため、このデータをgrepできません。

tcpdumpでキャプチャしたデータを1行で表示する方法はありますか?これにより、grepを使用して興味深いパケットを見つけることができます。


1
まあ、私は今これをテストすることはできませんが、複数の行がある場合はできます| TR -d「\ n」のか、前と後のいくつかの行を取得するには、-C 3をgrepする
barlop

@ barlop、grep -Cのように機能しますが、ヘッダーの行数がわからないため、信頼性が低く、一致する行の下に行が表示されません。trコマンドは、すべての出力を1行に変換するため、少し多すぎます。
犬が猫の世界を食べる14

以下はgrepではありませんが、tcpdumpは16進で文字列を照合できます。これは、本質的に正規表現のないgrepです。オフセットを指定できます。私はこれをファイルに書き留めています(windumpで行いましたが、それはtcpdumpの単なるWindowsバージョンですので、tcpdumpを想定しています)tcpdump -nXr zfile "tcp [32:4] = 0x47455420"
barlop

tcpdump -nei eth0 -X | grep --line-buffered "something interesting"理由は私の有効undiscernedために、行います作業答えは削除されました。
sjas

回答:


11

あなたのようなを使用できない人のためにngrep、パケットコンテンツの出力をgrepable awkにするための使用方法をtcpdump以下に示します。

tcpdump -x先にタスクを提示するために、まず、によって提供されるいくつかのサンプル出力:

$ tcpdump -xr dump.pcap 2>/dev/null
12:04:59.590664 IP 10.17.14.93.51009 > 239.194.1.9.51009: UDP, length 370
        0x0000:  4500 018e 0000 4000 fa11 7625 0a11 0e5d
        0x0010:  efc2 0109 c741 c741 017a 6f28 1120 2020
        0x0020:  3337 3030 3039 3031 3835 3635 3430 3130
...

そして、これは出力をパイプすることができるコピーアンドペースト可能なawkスクリプトです

awk '{ if (match($0, /^[0-9]/, _)) { printf (NR == 1 ? "%s " : "\n%s "), $0; fflush() } else { sub(/^\s+0x[0-9a-z]+:\s+/, " "); gsub(" ", ""); printf "%s", $0 } } END { print ""; fflush() }'

次のgrepable出力を取得するため

12:04:59.590664 IP 10.17.14.93.51009 > 239.194.1.9.51009: UDP, length 370 4500018e00004000fa1176250a...
12:04:59.590798 IP 10.17.14.113.51011 > 239.194.1.11.51011: UDP, length 370 4500018e00004000fa11760f...
...

以下は、上記のスクリプトのコメント付きバージョンです。

awk '
{
    # if this is a header line
    if (match($0, /^[0-9]/, _)) 
    {
        # print the header, but:

        # except for the first line,
        # we need to insert a newline,
        # as the preceding data lines
        # have been stripped of theirs

        # we also append a space to
        # separate header info from the
        # data that will get appended
        printf (NR == 1 ? "%s " : "\n%s "), $0
        # enforce line-buffering
        fflush()
    }
    # otherwise it is a data line
    else 
    {
        # remove the data address
        sub(/^\s+0x[0-9a-z]+:\s+/, " ");
        # remove all spaces
        gsub(" ", "");
        # print w/o newline
        printf "%s", $0 
    }
}
END
{
    # print final newline, as
    # the preceding data lines
    # have been stripped of theirs
    print ""
    # enforce line-buffering
    fflush()
}'

2

tcpdumpマンページから:

-A      Print each packet (minus its link level header) in ASCII.  Handy
        for capturing web pages.

また、-s 0オプションを使用して、パケット全体が表示されることを確認してください。


感謝しますが、データはまだ複数行で表示されます-Webページに改行がある場合はどこでも。ヘッダー(および残りのデータ)とgrepさ​​れた出力の関連付けに問題があります。
犬は猫の世界を食べる14

ツールがawk 病棟
犬が猫の世界を食べる

1

あなたは見ていたいかもしれngrepコマンドを:

ngrep -W single -d eth0 'regex to match' 'port 80'

どこ:

  • -W single 単一行フォーマットを指定します
  • regex to match 特定の文字列を含むパケットのみをダンプすることを意味します。
  • 'port 80' ポート80からの、またはポート80へのパケットのみをスニッフィングするpcapフィルターです

1
ngrepの使用したいが、そのようなツールが存在しないだろう-それはアプライアンスです...
犬猫の世界を食べる

ngrepは素晴らしいです。私は、ホストがホストへのHTTPトラフィックを生成している時間を探していました。単一のsudo ngrepで「GET ..」がすぐに答えを見つけました。
バルトスビリッキ

0

出力が16進数である理由は-Xフラグです。試してください:

tcpdump -ni eth1 | grep something_interesting

CLIにダンプされた読み取り可能な出力を取得します。


はい。ただし、パケットのコンテンツは含まれません。
RalfFriedl

0

awkスクリプトを使用して必要な処理を実行できず、ngrepはEthernet over USBで動作しません。そこで、tcpdumpが出力する行をgrep可能にするために小さなCプログラムを作成しました。それはATのhttps://gitlab.com/dargaud/TcpDumpJoin

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.