2015/06/10

Wiresharkを用いてHTTPリクエストをキャプチャして表示・整理

ここでは、他のプログラムがHTTPサーバに送信する要求(リクエスト)をネットワーク・プロトコル・アナライザのWiresharkを用いてキャプチャする方法についてを扱う。

(2016/6/23)バージョン2.0系の新しいGUIに合わせて内容を大幅に書き直した。
  1. 作業の流れ
    1. パケットのキャプチャを開始
    2. Webブラウザなどでサーバにアクセス
    3. キャプチャを停止
    4. パケットを絞り込む
    5. リクエストの詳細を参照
    6. 絞り込んだパケットの一覧をファイルに書き出す
  2. Debian/Ubuntuの場合の注意点

作業の流れ

パケットのキャプチャを開始

Wireshark(GUI)を起動してキャプチャを開始するか、同ソフトウェアの一部であるdumpcapコマンドを実行する。

Wireshark(GUI)の場合はメニュー “キャプチャ - オプション” を選択し、ネットワークインターフェースの項目(“eth[数字]” や “enp[数字1]s[数字2]” など)が選択されている状態で “キャプチャフィルタ” の欄に “port http” (全てのサーバが対象の場合)や “port http and host [特定のサーバ]” と入力して “開始” を押す。

下はキャプチャオプションのダイアログ。ここでのキャプチャフィルタの指定は必須ではないが、キャプチャするパケットを必要最小限にすることができるため、付けたほうがよい。

キャプチャオプションのダイアログ

dumpcapコマンドを実行する場合、キャプチャフィルタは-fオプションで指定可。

(コマンドでパケットをキャプチャする)
$ dumpcap (-i [インターフェース名]) -f "port http and host www.example.com" -w /path/to/outfile.pcapng

(Ctrl-cで終了)

パケットのキャプチャは権限の関係で一般ユーザではそのままではできない場合が多く、ディストリごとの方法で対処する必要がある。

Debian/Ubuntuの場合は見出し:Debian/Ubuntuの場合の注意点を参照。

Webブラウザなどでサーバにアクセス

WebブラウザなどでHTTPサーバにアクセスし、ファイルのリクエストを送信する。

キャプチャを停止

Wireshark(GUI)上でキャプチャしている場合は停止ボタンを押す。

dumpcapコマンドを実行している場合はCtrl-cなどで止めてからWiresharkを起動[1]して出力ファイルを開く。

パケットを絞り込む

表示フィルタの入力欄に “http.request” を入力してEnterを押すとHTTPリクエストの通信のみが表示される。

リクエストの詳細を参照

絞り込まれたパケット一覧内の項目を選択し、一覧の下にあるツリー形式の情報の中にある “Hypertext Transfer Protocol” を展開することで、リクエストの詳細やHTTPヘッダの中身を見ることができる。

  • Hypertext Transfer Protocol
    • GET [パス] HTTP/[バージョン]\r\n
    • Host: www.example.com\r\n
    • User-Agent: [ユーザエージェント]

上のような形で項目が並ぶ。

絞り込んだパケットの一覧をファイルに書き出す

メニュー “統計 - HTTP - 要求” を選択するとHTTPのリクエストがサーバごとにツリー表示されたダイアログが出るので、必要に応じて表示フィルタに “http.request.uri contains "[検索したい文字列]"” などを指定して絞り込んだ後に “...として保存” ボタンを押して指定した場所に任意の名前で保存する。

一覧を加工したい場合、ファイル形式は “カンマ区切りテキスト” が処理しやすい。

Debian/Ubuntuの場合の注意点

Debian/Ubuntuではセキュリティをより高める目的で既定の設定では一般ユーザでWiresharkのGUI上でパケットのキャプチャを行ったりdumpcapコマンドをそのまま実行したりすることはできなくなっており

  1. sudoを用いて管理者権限でdumpcapコマンドを実行してパケットをキャプチャする
  2. そのままでは一般ユーザが出力ファイルを開けないため、同ファイルに対して、管理者権限で所有者を変更したり[2]パーミッションを一般ユーザから読み込めるものにしたり[3]する
  3. 一般ユーザでWiresharkからファイルを開く

としてからキャプチャ結果を用いて処理を行うことが推奨されている。dumpcapはlibcapというライブラリを用いてこれを有効にしてビルドされている場合[4]、管理者権限で実行したときにパケットのキャプチャに関係した権限(CAP_NET_RAWとCAP_NET_ADMIN)以外の権限を破棄する作りになっており、このコマンドだけを管理者権限で実行する分にはセキュリティレベルが高い。

上の方法以外では、設定によっては一般ユーザを “wireshark” グループに含めることで一般ユーザ権限でWiresharkdumpcapコマンドを実行したときにパケットのキャプチャが行えるようにできる。[5]

下はその設定のための操作となる。作業は “wireshark-common” パッケージがインストールされた状態で行う。

(一般ユーザ権限でパケットをキャプチャできるようにする)
$ sudo dpkg-reconfigure wireshark-common

“非特権ユーザ (root 以外のユーザ) がパケットをキャプチャできるようにしますか?” の質問に “はい” を選択する[6]と、 “wireshark” グループのメンバがパケットのキャプチャが行えるようになる。ただし、この設定を行ってもUSBパケットのキャプチャ(usbmon[数字])は/sys/kernel/debug/[7]以下へのアクセス権の関係で行えない。

グループにユーザを追加するにはGNOME System Toolsusers-adminのようなGUIツールを用いるか下のコマンド行を実行する。

(一般ユーザをwiresharkグループに追加する)
$ sudo gpasswd --add [ユーザ名] wireshark
ユーザ [ユーザ名] をグループ wireshark に追加

(次回ログイン後からキャプチャが可能になる)
使用したバージョン:
  • Wireshark 2.0.2
[1]: もちろん、キャプチャを行うよりも前に起動しておいてもよい
[2]: “sudo chown [ユーザ名 もしくは ユーザ名:グループ名] /path/to/outfile.pcapng” の形でchownコマンドを実行する
[3]: “sudo chmod o+r /path/to/outfile.pcapng” の形でchmodコマンドを実行するなどする
[4]: Debian/Ubuntuのパッケージでは有効になっている
[5]: この機能はセキュリティ上のリスクになる可能性があるとのことで既定では無効になっている
[6]: DebconfがGUIツールを用いるように設定されている場合やdpkg-reconfigure-f gnomeなどのオプションを付けて実行してGUIで設定を行う場合はこの項目にチェックを入れる
[7]: “debugfs” と呼ばれるファイルシステム