tcpdumpとtcpreplayとtcprewriteと他。1. tcpdump
と
tcpreplay
と
tcprewrite
と他。
#ssmjp 2013/03/29 @togakushi
2. パケット好きですか?
● tcpdump ってコマンドで好きなだけみれま
す!
● 要 root
– NIC が promiscuous mode へ
– 流れてきたパケットは無差別に拾うモード
– 通常は自分宛てのパケットしか処理しない
3. 切り分けに超役立つ
● ちゃんと相手から届いてるかわかる
● 誰から送られてきてるかわかる
● 暗号化されてるかわかる
4. インテリジェントなスイッチ
● MAC アドレスの学習
– 接続されたポートの先に何が繋がってるか知って
いる
– tcpdump を動かすマシンから見ると、自分宛のパ
ケットしか流れてこない><
● 気になるあの子 ( サーバ ) のパケットも見た
い!
(注:他人の通信を覗くのはダメですよ)
5. こんなこともあろうかと!
● ミラーポート
– 超賢いスイッチはパケットをコピーして複数のポ
ートに流せる
● タップ
– 物理的に出力を 2 つに分ける
6. タップの仕組み
1つの送信 (TD) を 2 つの受信 (RD) に繋ぐだけ!
1:TD+ 1:TD+
HOST-B
HOST-A
2:TD- 2:TD-
3:RD+ 3:RD+
6:RD- 6:RD-
3:RD+ 6:RD- 3:RD+ 6:RD-
eth0 eth1
HOST-C(tcpdump)
100BASE までなら簡単に自作できる!
7. ハニーネットで大活躍ですね!
1:TD+ 1:TD+
H 2:TD- 2:TD-
Sniffer
U
B 3:RD+ 3:RD+
6:RD- 6:RD-
受信専用ケーブル
※ 賢くない HUB に繋いで使います
8. 自分宛てのが見れれば十分です
● 全部見ると大変→フィルタを使う
# tcpdump -i any -nn port 80
# tcpdump -i any -nn host 192.168.1.1 and port 80
# tcpdump -i any -nn not port 22 and not port 3389
● ペイロードまで見たい
# tcpdump -i any -nn -x
# tcpdump -i any -nn -X
小文字: Hex ダンプだけ
大文字:アスキー付き
9. キャプチャサイズがデカいと疲れる
● 自動分割(出力先ファイルの切り替え)
– サイズ分割
# tcpdump -i eth0 -C 10 -Z root -w tcpdump.pcap
-C file_size(MB) -Z root を指定する
# ls tcpdump*
tcpdump.pcap tcpdump.pcap.1 tcpdump.pcap.2 ...
– 時間分割
# tcpdump -i eth0 -G 60 -Z root -w tcpdump_%Y%m%d-%H%M%S.pcap
-G rotate_seconds -w strftime の書式文字列を含める
# ls tcpdump*
tcpdump_20120909-000740.pcap tcpdump_20120909-000840.pcap
tcpdump_20120909-000940.pcap ...
10. 取ったあとに分けたい
● tcpslice
– 指定時間の範囲で切り出し
● キャプチャされてる時間の確認( 3 種類)
% tcpslice -r tcpdump.pcap
tcpdump.pcap Wed Mar 27 11:44:11 2013 Wed Mar 27 11:44:23 2013
% tcpslice -t tcpdump.pcap
tcpdump.pcap 2013y03m27d11h44m11s817661u 2013y03m27d11h44m23s174956u
% tcpslice -R tcpdump.pcap
tcpdump.pcap 1364352251.817661 1364352263.174956
● 開始時間から相対的に指定も可能
% tcpslice 1364352251.817661 +10 -w new.pcap tcpdump.pcap
11. 別れたけどよりを戻したい
● mergecap
– くっつけたい pcap を順番に並べて出力ファイル
名を指定するだけ
% mergecap -w <outfile> <infile> [<infile> ...]
12. ペイロードで絞りたい?
● そんなときは「 ngrep 」
– 条件にマッチしたパケットだけ表示する grep のネ
ットワーク版
– オプションも grep とだいたい共通
● -i :大文字小文字の無視
● -w :単語にマッチ
● -v :マッチしないものを表示
● -X : 16 進数のストリングで指定
# ngrep [option] < match expression > < bpf filter >
# ngrep -q -d eth0 '' port 80
13. ngrep
● -K < 回数 >
– マッチしたパケットに RST を投げる ( 通信の切
断)
– 簡単な L7FW に
– リモートのサーバで「 ngrep -K 1 」ってやると死
ぬ
14. grep があるなら sed だって
● netsed
– ネットワークストリームエディタ
– 条件にマッチしたペイロードの文字列を書き換え
# netsed [<proto>] <lport> <rhost> <rport> <rule1> [<rule2> ...]
# netsed 8080 192.168.1.1 80 's/google/yahoo'
→localhost:8080 に繋ぐと 192.168.1.1:80 に転送
双方向のパケットでルールに基いて書き換え
16. でもやっぱり CLI だよね
● tshark の出番
– wireshark に付属
– wireshark の CLI 版
% tshark -r x.pcap
1 0.000000 192.168.100.101 -> 192.168.100.102 TCP 74 49924 > http [SYN] Seq=0 Win=...
2 0.000567 192.168.100.101 -> 192.168.100.102 TCP 66 49924 > http [ACK] Seq=1 Ack=...
3 0.000697 192.168.100.101 -> 192.168.100.102 HTTP 223 GET / HTTP/1.1
4 0.007204 192.168.100.101 -> 192.168.100.102 TCP 66 49924 > http [ACK] Seq=158 Ack=...
5 0.007224 192.168.100.101 -> 192.168.100.102 TCP 66 49924 > http [ACK] Seq=158 Ack=...
6 0.007320 192.168.100.101 -> 192.168.100.102 TCP 66 49924 > http [ACK] Seq=158 Ack=...
7 0.007517 192.168.100.101 -> 192.168.100.102 TCP 66 49924 > http [ACK] Seq=158 Ack=...
8 0.007580 192.168.100.101 -> 192.168.100.102 TCP 66 49924 > http [FIN, ACK] Seq=158 ...
9 0.007625 192.168.100.101 -> 192.168.100.102 TCP 66 49924 > http [ACK] Seq=159 Ack=...
18. tcpreplay
● tcpdump で取得したパケット (pcap) の内容を
ネットワークに流す
– FW や IDS のテストで使用
– 全部まとめて流したり、 1 パケットずつ(選択し
て)流したり、帯域を絞って流したり、繰り返し
流したり
19. tcprewrite
● pcap の内容を書き換える
● tcpreplay の補助ツール
– IP アドレスの書き換え(送信/受信)
– MAC アドレスの書き換え ( 〃 )
– VLAN タグの書き換え(削除/追加)
20. 参考文献
● http://wiki.wireshark.org/CaptureSetup/Ethernet
● man tcpdump
● man tcpreplay / tcprewrite