ARPスプーフィング、やる
今回は、ずっとやってみたかった「ARPスプーフィング」を行います
気になるAさんとBさんの通信を覗いてみたいとき。
二人の通信経路の間に自分が割り込めれば良さそうですが、問題は二人の通信にどうやって割り込むかです。
ARPスプーフィングの概要
そこで今回の攻撃「ARPスプーフィング」を行います。ARPポイズニングとも呼ばれるこの攻撃は、ARPプロトコルの仕組みを悪用して通信経路を捻じ曲げ、AさんとBさんが攻撃者の端末を経由して通信するように仕向けます。
攻撃者は、正規の通信相手であると偽って、攻撃者自身のMACアドレスを発信します。
被害者の端末は、その嘘のMACアドレスを宛先としてARPテーブルに保存してしまいます。これはARPプロトコル自体が認証を必要としないためです。(通常はウイルス対策ソフトなどによって防止されます)
こうして被害を受けた端末は、正規の宛先と勘違いして攻撃者の端末にパケットを送信してしまいます。攻撃者は、受け取ったパケットキャプチャすると同時に本物の宛先に転送することで、正常な通信を成立させて被害者が異変に気づかないようにします。
実際に実行していきましょう。
まず今回の検証のために、次のようなLANを構築します。
被害者となるPC1はVLAN10に所属し、攻撃者はこのVLANに侵入できたものとします。(今回はあくまでARPスプーフィングに注目するので、それ以外の部分はガバガバです。)
PC1はVLAN20に所属するPC2と通信していて、その間にL3スイッチが存在します。
攻撃者の端末でパケットキャプチャして、PC1とPC2の通信をキャプチャすることが目標です。今回は単純にpingパケットが見れたらよしとします。
LANの構築
L3スイッチの設定
それではLANを構築していきます。
初めにL3スイッチの設定を行います。機器はcisco catalyst 3750gです。
VLANを作るところから始めます。
Switch(config)#vlan 10
Switch(config-vlan)#name group1
Switch(config-vlan)#exit
Switch(config)#vlan 20
Switch(config-vlan)#name group2
Switch(config-vlan)#exit
1番ポートをトランクポートとして設定します。そこにVLAN10と20を許可します。
Switch(config)#interface Gi1/0/1
Switch(config-if)#switchport trunk encapsulation dot1q
Switch(config-if)#switchport mode trunk
Switch(config-if)#switchport trunk allowed vlan 10,20
VLANインターフェースを設定します。
各VLANセグメントのゲートウェイとなるこのIPアドレスには、慣習に習ってセグメントの最後のアドレスを設定します。
Switch(config)#interface vlan10
Switch(config-if)#ip address 192.168.10.254 255.255.255.0
Switch(config-if)#no shutdown
Switch(config)#interface vlan20
Switch(config-if)#ip address 192.168.20.254 255.255.255.0
Switch(config-if)#no shutdown
L2スイッチの設定
L2スイッチはcisco catalyst 2960-cgです。
VLANを作成します。
Switch(config)#vlan 10
Switch(config-vlan)#name group1
Switch(config-vlan)#exit
Switch(config)#vlan 20
Switch(config-vlan)#name group2
各ポートを各VLANのアクセスポートとして設定します。
Switch(config)#interface Gi0/1
Switch(config-if)#switchport mode access
Switch(config-if)#switchport access vlan 10
Switch(config)#interface Gi0/2
Switch(config-if)#switchport mode access
Switch(config-if)#switchport access vlan 20
ここで攻撃者が繋ぐポートも用意します。本来はすでに設定されているポートに攻撃者が繋ぐ想定です。
Switch(config)#interface Gi0/3
Switch(config-if)#switchport mode access
Switch(config-if)#switchport access vlan 10
攻撃前のARPテーブル
ホストスキャンに進む前に、攻撃前のARPテーブルを確認しておきます。
これからこのARPテーブルを汚染するので、前後でどう変化するか見てみたいと思います。
まずL3スイッチのARPテーブルです。
Switch>show arp
Protocol Address Age (min) Hardware Addr Type Interface
Internet 192.168.10.2 3 ec21.e567.4d41 ARPA Vlan10
Internet 192.168.10.1 13 b025.aa4a.74a4 ARPA Vlan10
Internet 192.168.20.1 0 cc30.803c.5909 ARPA Vlan20
Internet 192.168.20.254 - 9c4e.20d9.01c2 ARPA Vlan20
Internet 192.168.10.254 - 9c4e.20d9.01c1 ARPA Vlan10
次にPC1のARPテーブルです。
> get-netneighbor
ifIndex IPAddress LinkLayerAddress State PolicyStore
------- --------- ---------------- ----- -----------
~snip~
26 192.168.10.255 FF-FF-FF-FF-FF-FF Permanent ActiveStore
26 192.168.10.254 9C-4E-20-D9-01-C1 Stale ActiveStore
26 192.168.10.2 EC-21-E5-67-4D-41 Stale ActiveStore
~snip~
攻撃を実行する
攻撃者の端末で「Ettercap」を起動します。
今回はLinuxの物理マシンで使用しましたがMACでも使えます。Windowsでの動作は公式にサポートされていません。
「Primary Interface」で、ネットワークに接続しているNICを選択します。
右上のチェックマークをクリックすると、画面下部にテキストが出力されます。
右上の設定から「Scan for hosts」を選択すると、同一ネットワークに存在するホストを検出してくれます。
スキャンを実行した後「Hosts list」を選択すると、以下のような画面になります。
同一ドメインに存在するPC1のIPアドレスと、VLAN10インターフェースのIPアドレスが検知できています。
ここでホストのPC1(192.168.10.1)を選択して「Add to Terget 1」を選択します。
次にゲートウェイ(192.168.10.254)を選択して「Add to Terget 2」を選択します。
これでターゲットの設定が完了しました。
右上の「MITM」(Man-In-The-Middle) から「ARPpoisoning」を選択します。
下記のように確認画面があるので「OK」を選択して攻撃を開始します。
攻撃中の挙動
攻撃を開始したら、攻撃を停止するまでの間ずっと、以下のような偽造のARPパケットがブロードキャストされます。これらは攻撃者の端末でキャプチャしたデータです。
標的PCのARPテーブルを汚染する
No. Time Source Destination Protocol Length Info
8 8.408400625 Toshiba_67:4d:41 Private_4a:74:a4 ARP 42 192.168.10.254 is at ec:21:e5:67:4d:41
Frame 8: 42 bytes on wire (336 bits), 42 bytes captured (336 bits) on interface eth0, id 0
Ethernet II, Src: Toshiba_67:4d:41 (ec:21:e5:67:4d:41), Dst: Private_4a:74:a4 (b0:25:aa:4a:74:a4)
Address Resolution Protocol (reply)
上のログについてみていきます。
「Source」として「Toshiba_67:4d:41」と表示されているのは、攻撃者の端末のことです。
「Destination」の「Private_4a:74:a4」は標的のPC1です。
ARPプロトコルで「192.168.10.254 is at ec:21:e5:67:4d:41」という内容が発信されていることがわかります。
192.168.10.254(デフォルトゲートウェイ)のMACアドレスは「ec:21:e5:67:4d:41」ですよということを言っていますが、もちろん嘘の情報で、これは攻撃者PCのMACアドレスです。
これで標的PC1は、PC2と通信するためにVLAN10のデフォルトゲートウェイにパケットを送信する際に、誤って攻撃者の端末に送ってしまうようになります。
攻撃者PCはそのパケットを受け取ったら、キャプチャしたあと、何事もなかったかのようにゲートウェイへ転送します。
ということでPC1からPC2への通信を傍受することに成功しました。今回は攻撃時にTerget 2も設定しているので、同様の手口で逆方向の通信も傍受できるようになります。
ゲートウェイのARPテーブルを汚染する
No. Time Source Destination Protocol Length Info
9 8.408301158 Toshiba_67:4d:41 Cisco_d9:01:c1 ARP 42 192.168.10.1 is at ec:21:e5:67:4d:41 (duplicate use of 192.168.10.1 detected!)
Frame 9: 42 bytes on wire (336 bits), 42 bytes captured (336 bits) on interface eth0, id 0
Ethernet II, Src: Toshiba_67:4d:41 (ec:21:e5:67:4d:41), Dst: Cisco_d9:01:c1 (9c:4e:20:d9:01:c1)
Address Resolution Protocol (reply)
上のログも先ほどと同様です。
「Destination」の「Cisco_d9:01:c1」が、Terget 2のデフォルトゲートウェイです。
ARPプロトコルで「192.168.10.1 is at ec:21:e5:67:4d:41」という内容が発信されていることがわかります。
192.168.10.1(PC1)のMACアドレスは、ec:21:e5:67:4d:41(攻撃者のPCのMACアドレス)ですよと言っています。
これで、PC2からのパケットがVLAN10のゲートウェイに到着したあと、ゲートウェイはPC1に送信するつもりで攻撃者に送ってしまいます。
攻撃者はそれをキャプチャしたあと、元通りPC1に転送して通信を成立させます。
試しにPingパケットを観察してみると、ここまでの「標的PCのARPテーブルを汚染する」と「ゲートウェイのARPテーブルを汚染する」がうまく作用していることが確認できます。
下のログは、PC1からPC2にPingを送り、攻撃者PCでキャプチャを行った際のログです。
No. Time Source Destination Protocol Length Info
47 26.598741383 192.168.10.1 192.168.20.1 ICMP 74 Echo (ping) request id=0x0001, seq=49/12544, ttl=128 (no response found!)
48 26.605472729 192.168.10.1 192.168.20.1 ICMP 74 Echo (ping) request id=0x0001, seq=49/12544, ttl=128 (reply in 49)
49 26.607658397 192.168.20.1 192.168.10.1 ICMP 74 Echo (ping) reply id=0x0001, seq=49/12544, ttl=127 (request in 48)
50 26.613493136 192.168.20.1 192.168.10.1 ICMP 74 Echo (ping) reply id=0x0001, seq=49/12544, ttl=127
ソースが192.168.10.1(PC1)、宛先が192.168.20.1(PC2)のPingパケットですが、これが192.168.10.2の攻撃者PCの元に届いてキャプチャできているうえに、PC2からのリプライがありPC1とPC2双方の通信が成功していることがわかります。
もちろんPC1からゲートウェイに送ったり、PC2からPC1に送っても、同様結果が得られました。
攻撃後のARPテーブル
最後に攻撃後のARPテーブルを確認してみます。
L3スイッチのARPテーブルです。
192.168.10.1の「Hardware Addr」が「ec21.e567.4d41」となっていて、192.168.10.2(攻撃者PC)と同じものになっていることがわかります。
Switch>show arp
Protocol Address Age (min) Hardware Addr Type Interface
Internet 192.168.10.2 1 ec21.e567.4d41 ARPA Vlan10
Internet 192.168.10.1 0 ec21.e567.4d41 ARPA Vlan10
Internet 192.168.20.1 0 cc30.803c.5909 ARPA Vlan20
Internet 192.168.20.254 - 9c4e.20d9.01c2 ARPA Vlan20
Internet 192.168.10.254 - 9c4e.20d9.01c1 ARPA Vlan10
PC1のARPテーブル(MACアドレステーブル)です。
192.168.20.254(ゲートウェイ)の「LinkLayerAddress」が「EC-21-E5-67-4D-41」となっていて、192.168.10.2(攻撃者PC)と同じものになっていることがわかります。
> get-netneighbor
ifIndex IPAddress LinkLayerAddress State PolicyStore
------- --------- ---------------- ----- -----------
~snip~
26 192.168.10.255 FF-FF-FF-FF-FF-FF Permanent ActiveStore
26 192.168.10.254 EC-21-E5-67-4D-41 Stale ActiveStore
26 192.168.10.2 EC-21-E5-67-4D-41 Stale ActiveStore
~snip~
これらARPテーブル、MACアドレステーブルに記録された情報は、設定された時間が経つと消去(更新)されます。通常は数十秒です。
攻撃を停止した直後、テーブルが更新されるまでの間は、PC1とPC2の通信ができなくなります。
一定時間が経って更新されたあとは、PC1とPC2で通信しようとした時に、元の正しいMACアドレスが登録されるので、再び通信ができるようになります。
最後に
今回検証した機器の「PC1」には、ウイルス対策ソフトのESETが入っていて、この攻撃を検知してブロックしてくれていました。ESETの効果を実感しつつ、今回は検証がしたいのでESETもWindowsディフェンダーも無効化して、上記の結果を得ました。
ウイルス対策ソフトってすごいですね〜
Discussion