Linux: tcpdumpコマンドによる通信パケットのキャプチャ(スニッフィング)

先日tcpdumpの復習をしたので、備忘録として使い方を下記にまとめておく。

tcpdumpとは

tcpdumpはほとんどのLinuxディストリビューション、及びWindows(Windowsバージョンではwindumpという)で使用できるパケットキャプチャー、基本的なフィルタリングが出来るコマンドベースのFreewareツール。sniffer(スニッファー)ツールにカテゴライズされ、スニッフィングの対象プロトコルはIP, TCP, UDP, ICMP。
(参考) Wikipedia : tcpdump – Wikipedia, the free encyclopedia

公式サイト

実行環境

今回はホストMac OSのVMware fusion上のBackTrack5 R3のrootユーザーで実施。ネットワーク環境は以下の通り。

eth0はVM設定でhost-only。IPv6はdisable。今回は手軽さを考慮しeth0は使用せずlo (loopbackアドレス)を使用。

使い方

ターミナル上でtcpdump -helpかman tcpdumpを実行すれば基本的な使い方は記述されている。詳しく確認したい場合は公式のドキュメントを参照する。

通信トラフィックのキャプチャ

手始めにlocalhostに対してpingを送出し、その通信をキャプチャする。確認の際は下図のようにターミナルを2画面開いておくと良い。(下図はTerminatorというBT5に標準で導入されているターミナルを使用している。これはショートカットで画面分割や画面移動が可能で中々便利。オススメです。)
terminator_2screen
一方の画面でtcpdump -i loを実行し、もう一方の画面でping 127.0.0.1を実行すると実行結果は下記のようになる。

上記はpingを4回送出後に両ターミナル上でCtrl-Cを実行してpingの送出の終了、tcpdumpの終了をしている。
下記の行がpingのICMP echoリクエストの送出を表示しており、

その次の行がechoリクエストに対する応答を表示。

今回は送信元と送信先が同じlocalhostである為、localhost > localhostとなっている。
tcpdumpのオプションの一つである-iオプションはキャプチャするインターフェイスの指定。仮に指定しなかった場合には、tcpdump側がシステム上のインターフェイスリスト上から一番低いナンバーのものを選択。(但しloopbackアドレスは除く)すなわち、今回の環境で-iオプションを省略した場合はeth0が選択されることになる(下記参照 〜on eth0〜の記述)。

インターフェイス(NIC)が複数ある環境で、キャプチャ対象を指定したい場合は-iオプションを使用する。

-nオプション

-nオプションを使用した場合は、送信・受信アドレス、ポートの名前解決をしない。先ほどのpingキャプチャを-nオプションを使用すると下記のようになる。

-nオプションを指定してないときはアドレスはlocalhostだったが、指定した場合は上記の通り127.0.0.1が直接表示される。

-c [数値] オプション

-c [数値]オプションはキャプチャするパケット数の指定。-c 5とした場合の実行結果は下記の通り。

この場合、Ctrl-Cを押下しなくとも5パケットのキャプチャ後にtcpdumpが終了しプロンプトを返す。

-v オプション

-vオプションを指定した場合は表示される情報量が少し増える。(vはverboseの略)

追加情報としてttl(time to live), identification, total length, IPパケットのオプションなどがある。IP, ICMPヘッダーのチェックサムの検証等に活用可能。

-x オプション

-xオプションはパケットの内容(リンクレベルヘッダは除く)を16進数(hex)で表示する。

16進数の各4文字のグループは2 Bytesのデータに相当。8bits (1 Byte)は16進数の2文字で、16進数の1文字は4 bitsで表示。そうすると、0から数えて9 Bytes目(4500 0054 0000 4000 4001)はIPv4ヘッダ使用上プロトコルを表すもので、1はICMPとなる。20, 21 Bytes目の0800はType=8, Code=0となりEchoリクエストと分かる。

-X オプション

-Xオプションは16進数表記の隣に、そのデータのASCIIテキストを表示する。

これを見ると、pingコマンドはデータとして記号と数字を送受していることが分かる。(個人的にはトリビアぽい。)

host [ホスト名 or IPアドレス]オプション

フィルタリングする送信・受信hostを指定。例えば、下記のコマンドでキャプチャを開始しても、ping 127.0.0.1コマンドではhostが異なる為、キャプチャされない。

勿論、下記のコマンドであれば、ping 127.0.0.1コマンドでキャプチャされる。

因みにhostオプションへの組み合わせとしてand, or , not, ()等のキーワードがあり、フィルタリング範囲を指定できる。

Netcatでtelnetの通信をキャプチャ

これまでは、pingのリクエスト・レスポンスをキャプチャしたが、ここでは、Netcatコマンドでtelnetの待ち受けport 23番をリッスンしtelnetクライアントの通信をキャプチャする。(ターミナル画面をNetcat用に1つ追加して3画面で実施)

実行コマンド

  1. # tcpdump -i lo -X
  2. # nc -l -p 23
  3. # telnet 127.0.0.1 23

実行結果

tracerouteコマンドのパケットデータ

上述でpingのデータが記号と数字であったが、tracerouteの結果は下記のようになる。

一部の記号と英大文字であることが分かる。

ApacheにFirefoxでアクセス

BT5上でApacheを立ち上げ、ブラウザFirefoxでアクセスした際のパケットデータは下記の通り。

お馴染みのGET〜の文言に続いてUser-Agentと等色々送出していることが分かる。ただ、ここまで来るとコマンドライン上で読むのはきつくなってくる。実際にはファイルに書き出しの上、WireSharkで解析する。書き出しする際は以下の-s, -wオプションを付加する。

コメント

  1. TCP(Transmission Control Protocol)プロトコル より:

    […] http://www.yukun.info/blog/2013/09/linux-tcpdump-sniffer.html […]