ARPを利用してプロミスキャスモードの盗聴ホストを特定してみた
プロミスキャスモードで他人の通信を覗き見してる悪い子を見つけてこらしめてやりましょうb
プロミスキャスモード
プロミスキャスモードとは,ネットワークカード(NIC)の動作モードの一つで,同一ネットワーク内を流れるすべてのパケットを受信して読み込むモードのことを言います.
プロミスキャスモードでは,宛先にかかわらず全てのパケットを受信することができ,他の送信者や受信者に気付かれずにデータを傍受することができます.
自分のPCをプロミスキャスモードにするのはとても簡単です.方法はいくつかありますが,WiresharkのCapture Optionsで,"Use promiscuous mode on all interfaces"にチェックを入れるだけで,プロミスキャスモードでパケットキャプチャができます.
ARP (Address Resolution Protocol)
ARPは一言で言うと,IPアドレスからMACアドレスを求めるのに使われるプロトコルです.
ある端末Aが端末Bと通信したいが,端末BのMACアドレスがわからないとき,以下の様な手順で端末BのMACアドレスを取得します.
- 端末Aは、自分のIPアドレス、MACアドレスと端末BのIPアドレスを書き込んだ問い合わせ要求を作成して、ブロードキャストでネットワークに送り出す
- ブロードキャストで送られるので、ネットワーク上のすべての端末は問い合わせ要求を受け取るが、端末BのIPアドレスが書いてあるので、端末B以外は無視する
- 端末Bは自分に対する問い合わせなので、自分のMACアドレスを書き込んだパケットを、先の問い合わせの送出元である端末Aに送り返す
- 端末Aは端末Bからの返事を受け取り、めでたく端末BのIPアドレスとMACアドレスの対照表を得ることができる
ARPパケット
(引用:http://atnetwork.info/ccna2/arp05.html )
ちなみに,ARPを悪用してLAN上で通信機器のなりすましをして盗聴をするARPスプーフィングというハッキング技法があります.具体的には,端末Aのブロードキャストに対して,攻撃者が自分のMACアドレスを返すことで,以降はそのMACアドレスを宛先として通信が行われることになります.つまり,攻撃者側のホストがルーターになりすませば,端末Aに気付かれずに全ての通信を傍受できるようになるわけです.
プロミスキャスモードのホスト(盗聴者)を特定する原理
プロミスキャスモードの「全てのパケットを受信する」という機能を逆手に取って,プロミスキャスモードのホストを特定します.
上の例に加えて,プロミスキャスモードの端末Cがあるとして,端末Cを特定することにします.(A,Bはノーマルモード)
ARPブロードキャストをする時の宛先MACアドレスは"FF-FF-FF-FF-FF-FF"になります.このパケットは端末A,B,Cのいずれも受け取ることになります.
ここで,宛先MACアドレスを"00-00-00-00-00-01"と言ったデタラメ数字にしたらどうなるでしょうか.端末A,Bは宛先が自分のアドレスではないのでパケットを無視します.一方,プロミスキャスモードの端末Cは全てのパケットを受信するのでこのパケットも受信します.
ただし,端末Cでは,ARPの機能である自分のMACアドレスを応答するということはしません.何故かと言うと,端末CのOSの中にはソフトウェアによるフィルタが存在するからです.出入口でパケットは受け取るものの,中のOSが「これは自分宛てのARP要求ではない」と判断して応答を返さないのです.
ここでミソとなるのは,「OSのフィルタはチェックが甘い」ということです.
どういうことかというと,OSは宛先アドレスの一部のバイト列だけをチェックするだけで,宛先アドレス全体を自分のアドレスと照らし合わせているわけではないのです.例えば,宛先MACアドレスを"FF-FF-FF-FF-FF-FE"などとすると,OSが自分宛てのパケットであると勘違いして,ARP応答を送ってしまう事があることが知られています.
頑張って図を作りました.
OSのチェックを通り抜ける宛先MACアドレス一覧(勘違いアドレス)
MACアドレス | Windows9x/Me | Windows NT系 | LINUX |
---|---|---|---|
FF:FF:FF:FF:FF:FE | ○ | ○ | ○ |
FF:FF:00:00:00:00 | ○ | ○ | ○ |
FF:00:00:00:00:00 | ○ | ○ | ○ |
01:00:00:00:00:00 | ○ | - | ○ |
01:00:5E:00:00:00 | ○ | - | ○ |
01:00:5E:00:00:01 | ○ | - | ○ |
これでノーマルモードとプロミスキャスモードの差異が生まれました.
つまり,「勘違い宛先MACアドレス」に向けて,対象のIPアドレスを格納したARP要求を送って,応答が返ってきたらそれはプロミスキャスモードのホスト(盗聴者)ということになります.
実験
盗聴ホストと探索ホストの2つのコンピュータを用意しました.どちらもWiresharkでパケットキャプチャをしています.
盗聴ホスト | 探索ホスト | |
---|---|---|
OS | OS X | Windows8.1 |
NIC | プロミスキャスモード | ノーマルモード |
IPアドレス | 10.1.2.112 | 10.1.2.110 |
MACアドレス | ??:??:??:xx:xx:xx | 00:0a:de:xx:xx:xx |
盗聴ホストのMACアドレスはまだ内緒です.
今回ARPパケットを作るのに「ostinato」というパケット生成ツールを使いました.
ostinato - Packet/Traffic Generator and Analyzer - Google Project Hosting
Wiresharkでキャプチャしたパケットを編集し送信 - Ostinato
GUI上でヘッダー情報をポチポチ指定してあげるだけでパケットを送れます.
Case 1: 勘違いアドレスを使わない場合
ARPパケット
送信元MACアドレス | 送信元IPアドレス | 目標MACアドレス | 目標IPアドレス |
---|---|---|---|
11:22:33:44:55:66 | 10.1.2.110 | 00:00:00:00:00:00 | 10.1.2.112 |
送信先MACアドレスはテキトーでおk.目標MACアドレスはわからないのでデフォルトでは0.
パケット送信後
探索側 Wireshark
応答なし.(あたりまえ)