ここでは、他のプログラムがHTTPサーバに送信する要求(リクエスト)をネットワーク・プロトコル・アナライザのWiresharkを用いてキャプチャする方法についてを扱う。
(2016/6/23)バージョン2.0系の新しいGUIに合わせて内容を大幅に書き直した。作業の流れ
パケットのキャプチャを開始
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
コマンドをそのまま実行したりすることはできなくなっており
sudo
を用いて管理者権限でdumpcap
コマンドを実行してパケットをキャプチャする- そのままでは一般ユーザが出力ファイルを開けないため、同ファイルに対して、管理者権限で所有者を変更したり[2]パーミッションを一般ユーザから読み込めるものにしたり[3]する
- 一般ユーザでWiresharkからファイルを開く
としてからキャプチャ結果を用いて処理を行うことが推奨されている。dumpcap
はlibcapというライブラリを用いてこれを有効にしてビルドされている場合[4]、管理者権限で実行したときにパケットのキャプチャに関係した権限(CAP_NET_RAWとCAP_NET_ADMIN)以外の権限を破棄する作りになっており、このコマンドだけを管理者権限で実行する分にはセキュリティレベルが高い。
上の方法以外では、設定によっては一般ユーザを “wireshark” グループに含めることで一般ユーザ権限でWiresharkやdumpcap
コマンドを実行したときにパケットのキャプチャが行えるようにできる。[5]
下はその設定のための操作となる。作業は “wireshark-common” パッケージがインストールされた状態で行う。
(一般ユーザ権限でパケットをキャプチャできるようにする) $ sudo dpkg-reconfigure wireshark-common
“非特権ユーザ (root 以外のユーザ) がパケットをキャプチャできるようにしますか?” の質問に “はい” を選択する[6]と、 “wireshark” グループのメンバがパケットのキャプチャが行えるようになる。ただし、この設定を行ってもUSBパケットのキャプチャ(usbmon[数字])は/sys/kernel/debug/
[7]以下へのアクセス権の関係で行えない。
グループにユーザを追加するにはGNOME System Toolsのusers-admin
のようなGUIツールを用いるか下のコマンド行を実行する。
(一般ユーザをwiresharkグループに追加する) $ sudo gpasswd --add [ユーザ名] wireshark ユーザ [ユーザ名] をグループ wireshark に追加 (次回ログイン後からキャプチャが可能になる)
- Wireshark 2.0.2