Wiresharkを使った通信監視(前編)――基本的な使い方とパケット解析
外部と不審な通信を行っていないかを調査したり、ソフトウェアが実際に外部とどのような通信を行っているのかを調べたい場合に役立つツールが「Wireshark」だ。今回はこのWiresharkの基本的な使い方や統計・追跡機能について紹介する。
ネットワークトラフィックを手軽に解析できるWireshark
今回紹介するWiresharkは、指定したネットワークインターフェイス上を通過するネットワークパケットをキャプチャして分析するツールだ。 無料で利用でき、かつ一般的な用途には十分な機能を備えているため、ネットワーク解析を行うための定番ツールとなっている。オープンソースで開発されており、WindowsやMac OS X、Linux、各種BSDなど、さまざまなプラットフォームで利用が可能だ(図1)。
パケット監視ツールというとネットワーク専門のエンジニアが使うようなイメージが強いかもしれないが、Wiresharkは一般ユーザーでも使いやすいようになっており、様々な使い道がある。
たとえば、マルウェアなどに感染した可能性のあるPC上で利用することで、不審な通信が行われていないか、また行われていた場合は通信先はどこなのか、どのような内容が送信されているのか、といった情報を確認することができる。
また、クライアント−サーバー型ソフトウェア開発の現場においては、Wiresharkを利用することで手軽に通信内容をチェックしてデバッグ等に役立てることができる。
さらに、最新のWiresharkバージョン2系では、「USBPcap」と呼ばれる、USBの通信内容をキャプチャして分析できるツールも同梱されるようになった。これによって、USBデバイスとの通信内容も解析できるようになっている。
Wiresharkのインストール
Wiresharkは公式サイトのダウンロードページなどからWindowsおよびMac OS X向けのバイナリがダウンロードできる。
インストールは、ダウンロードしたインストーラを実行して指示に従って操作して行けば良い(図2)。
すでにWiresharkやその関連コンポーネントがインストールされている場合、途中でそれらをアンインストールするかどうかの確認が表示される。最新のバージョンがインストールされている場合はアンインストールする必要はないが、インストールされているバージョンが古い場合はアンインストールして再インストールを行うと良いだろう(図3)。
Wireshark LegacyとWireshark
Wiresharkはバージョン2.0でユーザーインターフェイスが大きく刷新された。そのため、それ以前のバージョンに慣れ親しんでいたユーザー向けに旧ユーザーインターフェイスをそのまま利用できる「Wireshark Legacy」が提供されている(図4)。
Wireshark Legacyはバージョン2.2で削除される予定とされていたが、現時点での最新版であるバージョン2.2.1でもまだ利用が可能となっている。とはいえ、今後サポートが廃止される可能性は高いので、今のうちに新ユーザーインターフェイスに移行しておくことをおすすめする。本記事でも、以下では新インターフェイスを使った操作方法を紹介していく。
Wiresharkでパケットキャプチャを実行する
Wiresharkを起動すると、「Wiresharkへようこそ」画面が表示される(図5)。
ここではWiresharkを実行しているPCで利用できるネットワークインターフェイスと、そのインターフェイス上を流れるトラフィック量がリアルタイムでグラフ表示され、簡易的なトラフィックモニタとして利用できるようになっている。また、USBPcapをインストールしていればUSBデバイスを通過するトラフィックも表示される。
パケットキャプチャを実行するには、キャプチャ対象のネットワークインターフェイスをクリックして選択し、続いてツールバーの一番左にある「パケットキャプチャを開始します」ボタン、もしくは「キャプチャ」メニューの「開始」をクリックする(図6)。
キャプチャを開始すると、指定したネットワークインターフェイスを流れるパケットの情報がリスト表示される(図7)。キャプチャは「パケットキャプチャを開始します」ボタンの右にある「パケットキャプチャを停止します」ボタン、もしくは「キャプチャ」」メニューの「停止」をクリックするまで継続される。
リストではパケットの種類ごとに項目が色分けされて表示され、これを目安にして通信内容を区別できるようになっている。また、パケットキャプチャを停止すると、スクロールバー横に色分けたバーも表示される(図8)。
なお、この色分けルールは「表示」メニューの「色分けルール」で設定や確認できる(図9)。ここで独自のルールを追加することも可能だ。
リスト内に表示されている項目を選択すると、そのパケットの詳細と内容を確認できる(図10)。
この画面では選択したパケットの応答パケットが「→」「←」で表示される。たとえば図10で選択されたパケット(No.392のパケット」には「→」マークが付けられている。これに対し、その2つ下のパケット(No.394のパケット)には「←」マークが付けられており、このパケットが選択されているパケットに対する応答パケットであることが分かる。
また、パケットを選択すると画面の最下部に生データが表示され、その上にプロトコルに応じて分かりやすいようにデコードされた内容が表示される。たとえば図11はHTTPによる通信パケットの例だが、このパケットの内容がHTTPによるGETアクセスであることが一目で分かるほか、HTTPヘッダなどの情報についても確認できる。
キャプチャ結果はツールバーの「このキャプチャファイルを保存します」ボタンもしくは「ファイル」メニューの「保存」をクリックすることでファイルに保存できる。保存しておいたキャプチャ結果はいつでも読み込んで再分析を行える。
表示フィルタを使う
Wiresharkのデフォルト設定では、キャプチャされたすべてのパケットの情報が表示される。ここから特定のパケットだけを表示させる機能が、「表示フィルタ(DisplayFilters)」だ。
たとえば、キャプチャしたパケットのうちTCPでやり取りされたものだけを表示するには、「表示フィルタ」部分に「tcp」と入力してEnterキーを押す。するとキャプチャ結果一覧が更新され、TCP関連のパケットのみが表示されるようになる(図12)。
また、「http」と入力すればHTTPによる通信のみが表示される(図13)。
フィルタ入力欄では自動補完機能があり、入力したフィルタ候補から予測したキーワードを表示してくれる。また、フィルタとして適切でない文字列が入力されている場合は背景が薄い赤色で、適切な文字列が入力されている場合は緑色で表示される(図14)。
フィルタでは「and」というキーワードを使って複数の条件を指定することも可能だ。たとえば送信元IPアドレスを指定する「ip.src==IPアドレス」と「http」というフィルタを組み合わせて「ip.src==IPアドレス and http」とすることで、指定したIPアドレスから送信されたHTTPの通信パケットのみを表示できる(図15)。
使用できるフィルタ一覧はオンラインマニュアルで確認できるほか、入力欄右の「書式…」をクリックすると表示される「表示フィルタ式」画面でも確認できる。この画面からフィルタを選んでフィルタを作成することも可能だ(図16)。
キャプチャフィルタを使う
表示フィルタはすでにキャプチャされたデータから必要な情報のみを抜き出して表示するための機能だが、Wiresharkではキャプチャ時にあらかじめ指定しておいた条件に合致するパケットだけを取得する「キャプチャフィルタ(CaputureFilters)」という機能も用意されている。パケットキャプチャしたデータはファイルサイズが大きくなりがちなので、長時間のキャプチャを行う場合はキャプチャフィルタを利用して目的のパケットのみをキャプチャすることで、ファイルサイズを削減できる。
キャプチャフィルタを利用するには、キャプチャの実行時に「このフィルタを利用」欄に文字列でフィルタを入力する(図17)。
ここで入力するフィルタ文字列は表示フィルタとは書式が異なり、「pcap-filter」と呼ばれるルールに従って記述する必要がある点に注意が必要だ。たとえば図17のように「tcp port http」とすると、TCPでポート番号として80(HTTP)を使用するパケットのみを対象にキャプチャを実行できる。
pcap-filterでは「type」(パケットのタイプ)と「dir」(通信方向)、「proto」(プロトコル)という次の3つの要素から構成される。また、HTTPなどのアプリケーションプロトコルを指定してキャプチャすることはできず、TCPやUDPといったプロトコル、ポート番号、IPアドレスといった情報での指定のみが可能となっている。詳細や具体例についてはmanページで詳細な説明がされているので詳しくはそちらを参照して欲しい。よく使われるフィルタの例としては、表1のものが挙げられる。
フィルタ | 対象とするパケット |
---|---|
host <IPアドレス> | 送信元もしくは送信先が指定したIPアドレスに合致する |
dst host <IPアドレス> | 送信先が指定したIPアドレスに合致する |
src host <IPアドレス> | 送信元が指定したIPアドレスに合致する |
port <ポート番号> | 送信元もしくは送信先が指定したポートに合致する |
dst port <ポート番号> | 送信先が指定したポートに合致する |
src port <ポート番号> | 送信元が指定したポートに合致する |
portrange <ポート番号1>-<ポート番号2> | 送信元もしくは送信先ポートがポート番号1〜ポート番号2の範囲内 |
dest portrange <ポート番号1>-<ポート番号2> | 送信先ポートがポート番号1〜ポート番号2の範囲内 |
src portrange <ポート番号1>-<ポート番号2> | 送信元ポートがポート番号1〜ポート番号2の範囲内 |
tcp | TCPパケット |
udp | UDPパケット |
icmp | ICMPパケット |
また、「キャプチャ」メニューの「キャプチャフィルタ」から表示できる「キャプチャフィルタ」画面でもいくつかの例を確認できる(図18)。
「キャプチャ」メニューの「キャプチャフィルタ」から表示できる「キャプチャインターフェイス」画面では、キャプチャに関する各種設定を指定してキャプチャを実行できる。たとえば、「入力」タブでインターフェイスを指定し「プロミスキャスモード」でチェックを入れてキャプチャを実行すると、ネットワークを流れる対象とするインターフェイス宛以外のパケットについても収集が可能になる(図19)。
ただし有線LAN接続の場合、昨今では機器に関係のあるパケットを送信するスイッチングハブ経由でマシンが接続されることが一般的になっているため、これでほかのマシンやネットワーク機器向けのパケットを受信することは難しい点には注意したい。
「出力」タブでは、パケットキャプチャ結果を自動的にファイルに保存する設定が可能だ(図20)。長時間キャプチャを実行する際などに有用だ。
「オプション」タブでは、自動キャプチャ停止などの設定が行える(図21)。パケット数やファイル数、ファイルサイズ、時間などの条件を満たした際に自動的にキャプチャを停止させる機能で、一定期間だけキャプチャを実行したい場合などはここで設定を行えば良い。
分析・統計機能を使う
Wiresharkではキャプチャしたパケットの分析や統計解析を行う機能も用意されている。これらの機能は「分析」メニューや「統計」メニューから利用できる。
「分析」メニューでは表示フィルタの設定など、通信内容を分析するための機能が提供されている。また、分析メニューから呼び出せる「追跡」機能では、選択したパケットに対してプロトコルに応じた通信内容の追跡を行うことができる。たとえば、HTTPのパケットを選択した状態で「分析」-「追跡」-「HTTPストリーム」を選択すると、そのパケットに関連する一連の通信内容をひとまとめに確認できる(図22)。
この画面では文字コードを指定して表示することもでき、送受信されているHTMLなどのデータもチェックできる。
「統計」メニューではキャプチャしたパケットに関する統計情報を確認できる。たとえば「入出力グラフ」では、パケット数などの情報をグラフで表示することができる(図23)。
入出力グラフでは、表示フィルタで指定した対象のパケットについて、その数の時間変化をグラフで表示できる。デフォルトでは「すべてのパケット」と「TCPエラー」が表示されるが、任意のフィルタを指定することが可能だ。
また、「解決したアドレス」では、キャプチャしたパケットで使われているIPアドレスとそれに対応するドメイン名、使用されているポート、MACアドレスなどの情報をまとめて確認できる(図24)。
そのほか「統計」メニューからはプロトコル毎の統計情報や、IPv4/IPv6ごとの統計情報など、さまざまな情報を確認できる。
単にパケットの流れを見るのではなく、その中身をチェックできる点が有用
このようにWiresharkでは単純にネットワークを流れるパケットを観測するだけでなく、プロトコルに応じた解析やその中身の確認を行える点が特徴だ。ユーザーインターフェイスも分かりやすく、アプリケーションのトラブルシューティングからセキュリティ解析まで、さまざまな用途に利用できる。
ただ、GUIを使ったキャプチャや解析は、コンソールからしかアクセスできないLinuxサーバーなどでは利用しにくいケースもある。そこで次回は、Wiresharkのコマンドライン版とも言える「tshark」や、パケットキャプチャツール「tcpdump」について紹介する。