SlideShare a Scribd company logo
tcpdump
    と
 tcpreplay
    と
tcprewrite
と他。



    #ssmjp 2013/03/29 @togakushi
パケット好きですか?
●   tcpdump ってコマンドで好きなだけみれま
    す!
●   要 root
    –   NIC が promiscuous mode へ
    –   流れてきたパケットは無差別に拾うモード
    –   通常は自分宛てのパケットしか処理しない
切り分けに超役立つ
●   ちゃんと相手から届いてるかわかる
●   誰から送られてきてるかわかる
●   暗号化されてるかわかる
インテリジェントなスイッチ
●   MAC アドレスの学習
    –   接続されたポートの先に何が繋がってるか知って
        いる
    –   tcpdump を動かすマシンから見ると、自分宛のパ
        ケットしか流れてこない><
●   気になるあの子 ( サーバ ) のパケットも見た
    い!
    (注:他人の通信を覗くのはダメですよ)
こんなこともあろうかと!
●   ミラーポート
    –   超賢いスイッチはパケットをコピーして複数のポ
        ートに流せる
●   タップ
    –   物理的に出力を 2 つに分ける
タップの仕組み
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 までなら簡単に自作できる!
ハニーネットで大活躍ですね!

      1:TD+           1:TD+
  H   2:TD-            2:TD-




                               Sniffer
  U
  B   3:RD+           3:RD+
      6:RD-            6:RD-

            受信専用ケーブル
       ※ 賢くない HUB に繋いで使います
自分宛てのが見れれば十分です
●   全部見ると大変→フィルタを使う
    # 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 ダンプだけ
    大文字:アスキー付き
キャプチャサイズがデカいと疲れる
●   自動分割(出力先ファイルの切り替え)
    –   サイズ分割
        # 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 ...
取ったあとに分けたい
●   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
別れたけどよりを戻したい
●   mergecap
    –   くっつけたい pcap を順番に並べて出力ファイル
        名を指定するだけ
        % mergecap -w <outfile> <infile> [<infile> ...]
ペイロードで絞りたい?
●   そんなときは「 ngrep 」
    –   条件にマッチしたパケットだけ表示する grep のネ
        ットワーク版
    –   オプションも grep とだいたい共通
        ●   -i :大文字小文字の無視
        ●   -w :単語にマッチ
        ●   -v :マッチしないものを表示
        ●   -X : 16 進数のストリングで指定
# ngrep [option] < match expression > < bpf filter >
# ngrep -q -d eth0 '' port 80
ngrep
●   -K < 回数 >
    –   マッチしたパケットに RST を投げる ( 通信の切
        断)
    –   簡単な L7FW に
    –   リモートのサーバで「 ngrep -K 1 」ってやると死
        ぬ
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 に転送
         双方向のパケットでルールに基いて書き換え
GUI で見たいよね
●   wireshark の出番
でもやっぱり 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=...
パケット好きですか(再)
●   あの素晴らしいパケットをもう一度
tcpreplay
●   tcpdump で取得したパケット (pcap) の内容を
    ネットワークに流す
    –   FW や IDS のテストで使用
    –   全部まとめて流したり、 1 パケットずつ(選択し
        て)流したり、帯域を絞って流したり、繰り返し
        流したり
tcprewrite
●   pcap の内容を書き換える
●   tcpreplay の補助ツール
    –   IP アドレスの書き換え(送信/受信)
    –   MAC アドレスの書き換え ( 〃 )
    –   VLAN タグの書き換え(削除/追加)
参考文献
●   http://wiki.wireshark.org/CaptureSetup/Ethernet
●   man tcpdump
●   man tcpreplay / tcprewrite

More Related Content

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 に転送  双方向のパケットでルールに基いて書き換え
  • 15. GUI で見たいよね ● wireshark の出番
  • 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=...
  • 17. パケット好きですか(再) ● あの素晴らしいパケットをもう一度
  • 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