アプライアンスでtcpdumpしか使用できないという問題をトラブルシューティングしようとしています。 tcpdumpを使用してWebトラフィックをフィルタリングし、特定の文字列を含むトラフィックのみを表示したい。
私は以下を行います:
tcpdump -nei eth0 -X | grep "something interesting"
出力は、行ごとに16バイトのhexviewです。データが複数行に表示されているため、このデータをgrepできません。
Tcpdumpがキャプチャしたデータを1行で表示する方法はありますか?これにより、grepを使用して対象のパケットを見つけることが可能になります。
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()
}'
tcpdump
マンページから:
-A Print each packet (minus its link level header) in ASCII. Handy
for capturing web pages.
-s 0
オプションを使用して、パケット全体が表示されるようにします。
ngrep
コマンドを確認することをお勧めします。
ngrep -W single -d eth0 'regex to match' 'port 80'
どこ:
-W single
は、単一行のフォーマットを指定しますregex to match
は、特定の文字列を含むパケットのみをダンプすることを意味します。'port 80'
は、ポート80との間のパケットのみを傍受するpcapフィルターです。出力が16進数である理由は-X
国旗。試してください:
tcpdump -ni eth1 | grep something_interesting
読み取り可能な出力がCLIに直接ダンプされます。
Awkスクリプトで必要なことを実行できず、ngrepがUSB経由のイーサネットで機能しないため、tcpdumpによって出力された行に結合するための小さなCプログラムを作成して、それらをgrepできるようにしました。 https://gitlab.com/dargaud/TcpDumpJoin にあります