sonickun.log

備忘録

ARPを利用してプロミスキャスモードの盗聴ホストを特定してみた

 プロミスキャスモードで他人の通信を覗き見してる悪い子を見つけてこらしめてやりましょうb
 
 

プロミスキャスモード

 プロミスキャスモードとは,ネットワークカード(NIC)の動作モードの一つで,同一ネットワーク内を流れるすべてのパケットを受信して読み込むモードのことを言います.

 プロミスキャスモードでは,宛先にかかわらず全てのパケットを受信することができ,他の送信者や受信者に気付かれずにデータを傍受することができます.

 自分のPCをプロミスキャスモードにするのはとても簡単です.方法はいくつかありますが,WiresharkのCapture Optionsで,"Use promiscuous mode on all interfaces"にチェックを入れるだけで,プロミスキャスモードでパケットキャプチャができます.
f:id:sonickun:20140728193656p:plain
 
 

ARP (Address Resolution Protocol)

 ARPは一言で言うと,IPアドレスからMACアドレスを求めるのに使われるプロトコルです.
 ある端末Aが端末Bと通信したいが,端末BのMACアドレスがわからないとき,以下の様な手順で端末BのMACアドレスを取得します.
 

  1. 端末Aは、自分のIPアドレスMACアドレスと端末BのIPアドレスを書き込んだ問い合わせ要求を作成して、ブロードキャストでネットワークに送り出す
  2. ブロードキャストで送られるので、ネットワーク上のすべての端末は問い合わせ要求を受け取るが、端末BのIPアドレスが書いてあるので、端末B以外は無視する
  3. 端末Bは自分に対する問い合わせなので、自分のMACアドレスを書き込んだパケットを、先の問い合わせの送出元である端末Aに送り返す
  4. 端末Aは端末Bからの返事を受け取り、めでたく端末BのIPアドレスMACアドレスの対照表を得ることができる

 
 ARPパケット
f:id:sonickun:20140728200635p:plain
(引用: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応答を送ってしまう事があることが知られています.
 
 頑張って図を作りました.
f:id:sonickun:20140728210532p:plain
 
 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
 f:id:sonickun:20140728215110p:plain

 応答なし.(あたりまえ)
 
 

Case 2: 勘違いアドレスを使った場合

 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

 ARPヘッダーはCase 1の時と同じ.
 
 パケット送信後
 探索側 Wireshark
f:id:sonickun:20140728220231p:plain

 応答キタ━(゚∀゚)━!

 ということで,盗聴者を特定することができました.盗聴ホストのIPアドレスだけでなくMACアドレス(f4:f9:51:xx:xx:xx)やPCのメーカー(Apple)まで判明してしまいました.
 
 
 

最後に

 プロミスキャスモードはもともとネットーワーク管理で必要な大事な機能なので,用法用量を守って正しく使いましょう.
 ARPスプーフィングなどの盗聴技術はプロトコル自体に問題があるため防御対策が難しいですが,このように盗聴者を特定できる場合があります.
 公衆Wi-fiのあるカフェなどで,PCでWiresharkなんかを開いている人がいたら注意しましょう!そんなところでプロミスキャスモードなんかにしてる人は完全にアウトな人です.