web-dev-qa-db-ja.com

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

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

私は以下を行います:

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

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

Tcpdumpがキャプチャしたデータを1行で表示する方法はありますか?これにより、grepを使用して対象のパケットを見つけることが可能になります。

13

ngrepを使用できないあなたのために、パケットコンテンツのawk出力をgrep可能にするために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
...

そして、これは出力をパイプ処理できるcopy-and-pastable 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()
}'
11

tcpdumpマンページから:

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

-s 0オプションを使用して、パケット全体が表示されるようにします。

2
Flup

ngrepコマンドを確認することをお勧めします。

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

どこ:

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

出力が16進数である理由は-X 国旗。試してください:

tcpdump -ni eth1 | grep something_interesting

読み取り可能な出力がCLIに直接ダンプされます。

0
DaveA

Awkスクリプトで必要なことを実行できず、ngrepがUSB経由のイーサネットで機能しないため、tcpdumpによって出力された行に結合するための小さなCプログラムを作成して、それらをgrepできるようにしました。 https://gitlab.com/dargaud/TcpDumpJoin にあります

0
dargaud