Wiresharkでリモートホストのパケットをキャプチャする (リモートキャプチャ)

| | コメント(0) | トラックバック(0)

リモートホストのパケットをローカルホストで表示したくなったので、ちょっと調べました。

今までは、WindowsからLinuxのパケットをキャプチャする時は以下のどっちかの方法を使っていました。

  • tcpdumpでファイルに出力してから、ファイルを転送してWindows上で見る
  • LinuxのWiresharkをXで飛ばしてWindows上で見る

これでは不便なので。

使用したバージョンは Wireshark 1.2.5 と WinPcap 4.1.1。

リモートホスト(このホストのパケットをキャプチャする): Windows XP と CentOS 5.4
ローカルホスト(このホストでWiresharkを実行してリモートホストのパケットをキャプチャする): Windows 2000

リモートホスト側の設定
Windowsの場合

Windowsのサービス「Remote Packet Capture Protocol v.0 (experimental)」を起動する。
WinPcapインストール時にインストールされてたみたい。
サービスの本体はWinPcapに含まれる %ProgramFiles%\WinPcap\rpcapd.exe 。

サービスを起動すると、ポート 2002 (デフォルト)で待ち受け始めました。

ローカルホスト側からアクセスした時に、Windows XP の Windows ファイアウォールで弾いてしまうので、「C:\Program Files\WinPcap\rpcapd.exe」を例外として追加しました。必要ならスコープも設定しておく事。

「%ProgramFiles%\WinPcap\rpcapd.ini」で「rpcapd.exe」の設定ができます。
当然、rpcapd.ini の変更を反映するには、サービスの再起動が必要です。

以下を実行すると、デフォルトの設定が rpcapd.ini.sample に書き出されるはず。

C:\Program Files\WinPcap>rpcapd.exe -s rpcapd.ini.sample

ファイルの内容はこんな感じ。

# Configuration file help.
 
# Hosts which are allowed to connect to this server (passive mode)
# Format: PassiveClient = <name or address>
 
 
 
# Hosts to which this server is trying to connect to (active mode)
# Format: ActiveClient = <name or address>, <port | DEFAULT>
 
 
 
# Permit NULL authentication: YES or NOT
 
NullAuthPermit = NO

このファイルを参考に、受け付けるクライアントを指定してみます。
カンマ区切りのリストでも、複数行指定してもOKっぽい。

# Configuration file help.
 
# Hosts which are allowed to connect to this server (passive mode)
# Format: PassiveClient = <name or address>
 
PassiveClient = 192.168.1.1,192.168.1.2,192.168.1.3
PassiveClient = 192.168.1.10
 
 
# Hosts to which this server is trying to connect to (active mode)
# Format: ActiveClient = <name or address>, <port | DEFAULT>
 
 
 
# Permit NULL authentication: YES or NOT
 
NullAuthPermit = NO

NULL認証 (NullAuthPermit = YES) は、認証なしでアクセスできちゃうので、止めておいた方がいいでしょう。

LISTENするポートは rpcapd.ini では指定できないっぽい。
ポートを変更する場合は、レジストリ (HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\rpcapd の ImagePath) で rpcapd.exe のオプションを変更すればいい(-dオプションで指定)。

起動オプションは、WinPcap: Remote Captureの「Configuring the Remote Daemon (rpcapd)」の項を参照のこと。

なお、この設定ファイルの読み込みは ソースコードで言うと「\winpcap\wpcap\libpcap\rpcapd\fileconf.c」の fileconf_read 関数で実行してるっぽいけど、やっぱり「PassiveClient」「ActiveClient」「NullAuthPermit」しか指定できないっぽかった。


Linuxの場合

リモートホストのインターフェイスを取得できたのでこの方法でいいかと思ったけど、実際にキャプチャしてみたらエラーが出てキャプチャ出来なかった・・・時間があったら後日調査します・・・(2010/01/08)

(2010/01/13 追記 ここから)
ローカルホスト側の Wireshark の「Remote Capture Settings」ダイアログで「Use UDP for data transfer」にチェックをつけたらキャプチャできました。
(2010/01/13 追記 ここまで)

(2010/01/10 追記 ここから)

Step 5: Capture traffic using a remote machine
(略)
/WinPcapRemote - using [WinPcap]'s remote capturing feature (rpcapd) - currently not supported
CaptureSetup - The Wireshark Wiki

「現在サポートしてない」って言ってる。最終更新日は 2009-09-16。その後変化はないかな?
(2010/01/10 追記 ここまで)

(2010/01/13 追記 ここから)
よく読んでないけど、

This feature will not work with WinPcap 3.1; it has been tested with with Ethereal 0.10.13 + WinPcap 4.0 alpha 1 using a Cisco MDS 9216 switch's fcanalyzer as the the remote capture device, and does work. It should also work with the current version of Wireshark and WinPcap 4.x.
CaptureSetup/WinPcapRemote - The Wireshark Wiki

ってなってるから、最終更新日の2008/08時点のWiresharkとWinPcap 4.xでは使えるっぽいので、今回の環境でもキャプチャできるっぽいよねぇ。
(2010/01/13 追記 ここまで)

WinPcap は Linux上でもコンパイルできるらしい。
WinPcap: Remote Captureの「Installing the Remote Capture Daemon in UNIX」の項を参考に rpcapd をコンパイルします。
今回は CentOS 5.4 上でコンパイルしました。

WinPcap Developmentからソースコードをダウンロードします。

コンパイルします。

$ wget http://www.winpcap.org/install/bin/WpcapSrc_4_1_1.zip
$ unzip -a WpcapSrc_4_1_1.zip
$ cd winpcap/wpcap/libpcap
$ chmod +x configure
$ ./configure
$ make
$ cd rpcapd
$ make

作成された rpcapd が必要な実行ファイル。
実行方法は「rootユーザで実行する」か「所有者をrootユーザにしてSUIDをセットし(chmod u+s rpcapd)一般ユーザで実行する」のどちらか。
今回はrootユーザで実行する事にしました。

$ su
# cp rpcapd /root/bin/
# cd /root/bin/
# chown root:root rpcapd
 
// rpcapd.ini を作成
# ./rpcapd -4 -l 192.168.1.1,192.168.1.2 -s rpcapd.ini
Press CTRL + C to stop the server...
強制終了      ←CTRL + Cを押した
 
// 出力した rpcapd.ini を確認
# cat rpcapd.ini
# Configuration file help.
 
# Hosts which are allowed to connect to this server (passive mode)
# Format: PassiveClient = <name or address>
 
PassiveClient = 192.168.1.1
PassiveClient = 192.168.1.2
 
 
# Hosts to which this server is trying to connect to (active mode)
# Format: ActiveClient = <name or address>, <port | DEFAULT>
 
 
 
# Permit NULL authentication: YES or NOT
 
NullAuthPermit = NO

次回からは以下の様にデーモンモードで起動すれば良いです。

# rpcapd -d -4 -f ~/bin/rpcapd.ini
New passive host list:  192.168.1.1, 192.168.1.2,
 
 
Child terminated

キャプチャすると、コンソールにログが出力されちゃうので、/dev/null にでもリダイレクトしておいた方がいいかも。

IPv4 と IPv6 両方にbindしようとするとエラーになったから、-4 オプションをつけて IPv4 のみにしてあります。

F/Wを設定してる場合は、ポートを空けることをお忘れなく。

ローカルホスト側

Wiresharkの「Capture Options」ダイアログの Interface の部分で「Local」と「Remote」を切り替えるプルダウンがあります。

Wireshark の Capture Options ダイアログ

「Remote」を選択して、「Remote Interface」ダイアログを表示し、ホスト、ポート、認証を入力してOKします。

Wireshark の Remote Interface ダイアログ

リモートホストのインターフェースが表示されるので、後は、ローカルホストでキャプチャするのと一緒。

(2010/01/13 追記 ここから)
リモートホスト側が Linux の場合、「Capture Options」ダイアログ>「Remote Settings」ボタン>「Remote Capture Settings」ダイアログの「Use UDP for data transfer」にチェックをつけておく必要があるみたい。
(2010/01/13 追記 ここまで)

キャプチャしたデータを転送してるパケット(Remote Packet Capture Protocolのパケット)はキャプチャされません。
キャプチャしたい場合は、「Capture Options」ダイアログ>「Remote Settings」ボタン>「Remote Capture Settings」ダイアログの「Do not capture own RPCAP traffic」のチェックを外せばいい。

Wireshark の Remote Capture Settings ダイアログ

普通はキャプチャされちゃ邪魔でしょうがないけど。

問題

(2010/01/13 追記 ここから)
ローカルホストからアクセスした時に、rpcapd を起動したコンソールに以下のログが出力されました。

*** glibc detected *** rpcapd: free(): invalid next size (fast): 0x0000000003f29c20 ***
======= Backtrace: =========
/lib64/libc.so.6[0x349c0722ef]
/lib64/libc.so.6(cfree+0x4b)[0x349c07273b]
rpcapd[0x412355]
rpcapd[0x404f85]
rpcapd[0x403f6a]
rpcapd[0x4037c6]
rpcapd[0x403543]
rpcapd[0x403347]
/lib64/libc.so.6(__libc_start_main+0xf4)[0x349c01d994]
rpcapd[0x402e19]
======= Memory map: ========
00400000-00439000 r-xp 00000000 08:03 9764998                            /root/bin/rpcapd
00638000-0063a000 rw-p 00038000 08:03 9764998                            /root/bin/rpcapd
0063a000-00656000 rw-p 0063a000 00:00 0
03f28000-03f6b000 rw-p 03f28000 00:00 0                                  [heap]
349bc00000-349bc1c000 r-xp 00000000 08:03 6225990                        /lib64/ld-2.5.so
349be1b000-349be1c000 r--p 0001b000 08:03 6225990                        /lib64/ld-2.5.so
349be1c000-349be1d000 rw-p 0001c000 08:03 6225990                        /lib64/ld-2.5.so
349c000000-349c14d000 r-xp 00000000 08:03 6226194                        /lib64/libc-2.5.so
349c14d000-349c34d000 ---p 0014d000 08:03 6226194                        /lib64/libc-2.5.so
349c34d000-349c351000 r--p 0014d000 08:03 6226194                        /lib64/libc-2.5.so
349c351000-349c352000 rw-p 00151000 08:03 6226194                        /lib64/libc-2.5.so
349c352000-349c357000 rw-p 349c352000 00:00 0
349cc00000-349cc16000 r-xp 00000000 08:03 6226200                        /lib64/libpthread-2.5.so
349cc16000-349ce15000 ---p 00016000 08:03 6226200                        /lib64/libpthread-2.5.so
349ce15000-349ce16000 r--p 00015000 08:03 6226200                        /lib64/libpthread-2.5.so
349ce16000-349ce17000 rw-p 00016000 08:03 6226200                        /lib64/libpthread-2.5.so
349ce17000-349ce1b000 rw-p 349ce17000 00:00 0
34a9e00000-34a9e0d000 r-xp 00000000 08:03 6225977                        /lib64/libgcc_s-4.1.2-20080825.so.1
34a9e0d000-34aa00d000 ---p 0000d000 08:03 6225977                        /lib64/libgcc_s-4.1.2-20080825.so.1
34aa00d000-34aa00e000 rw-p 0000d000 08:03 6225977                        /lib64/libgcc_s-4.1.2-20080825.so.1
34ae600000-34ae609000 r-xp 00000000 08:03 6226092                        /lib64/libcrypt-2.5.so
34ae609000-34ae808000 ---p 00009000 08:03 6226092                        /lib64/libcrypt-2.5.so
34ae808000-34ae809000 r--p 00008000 08:03 6226092                        /lib64/libcrypt-2.5.so
34ae809000-34ae80a000 rw-p 00009000 08:03 6226092                        /lib64/libcrypt-2.5.so
34ae80a000-34ae838000 rw-p 34ae80a000 00:00 0
2b670c6a9000-2b670c6aa000 rw-p 2b670c6a9000 00:00 0
2b670c6bf000-2b670c6c2000 rw-p 2b670c6bf000 00:00 0
2b670c6c2000-2b670c6cc000 r-xp 00000000 08:03 6226168                    /lib64/libnss_files-2.5.so
2b670c6cc000-2b670c8cb000 ---p 0000a000 08:03 6226168                    /lib64/libnss_files-2.5.so
2b670c8cb000-2b670c8cc000 r--p 00009000 08:03 6226168                    /lib64/libnss_files-2.5.so
2b670c8cc000-2b670c8cd000 rw-p 0000a000 08:03 6226168                    /lib64/libnss_files-2.5.so
7fff91068000-7fff9107d000 rw-p 7ffffffea000 00:00 0                      [stack]
ffffffffff600000-ffffffffffe00000 ---p 00000000 00:00 0                  [vdso]
Child terminated

これって、インストール方法がいけないのかなぁ。
rpcapd をコンパイルする時に作成される ライブラリファイル (libpcap.a) を静的にリンクして rpcapd を作ってると思うんだけど、この libpcap.a とリンクして作成ないといけないプログラムが別にあるとか?うーん?分かってません。。。
(2010/01/13 追記 ここまで)

参考になりそうなリンク

・WinPcap: Remote Capture
http://www.winpcap.org/docs/docs_411/html/group__remote.html
winpcap.org の Remote Capture に関するドキュメント (WinPcap 4.1.1 のマニュアル)

・RPCAPによるリモートパケットモニター(1/2):CodeZine
http://codezine.jp/article/detail/219
WinPcap 3.1 における説明 (日本語)

・CaptureSetup - The Wireshark Wiki
http://wiki.wireshark.org/CaptureSetup#head-385a616382462197ae1057aeaaae5a7a45330741
「Step 5: Capture traffic using a remote machine」の章

・CaptureSetup/WinPcapRemote - The Wireshark Wiki
http://wiki.wireshark.org/CaptureSetup/WinPcapRemote

トラックバック(0)

このブログ記事を参照しているブログ一覧: Wiresharkでリモートホストのパケットをキャプチャする (リモートキャプチャ)

このブログ記事に対するトラックバックURL: http://kinshachi.ddo.jp/mt/mt-tb.cgi/528

コメントする


画像の中に見える文字を入力してください。

このブログ記事について

このページは、ikeが2010年1月 8日 03:22に書いたブログ記事です。

ひとつ前のブログ記事は「namebench」です。

次のブログ記事は「sshbl.org - (the SSH blacklist)」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

最近のコメント

Powered by Movable Type 4.261