🕷️

ARPスプーフィング、やる

2023/06/04に公開

今回は、ずっとやってみたかった「ARPスプーフィング」を行います

気になるAさんとBさんの通信を覗いてみたいとき。
二人の通信経路の間に自分が割り込めれば良さそうですが、問題は二人の通信にどうやって割り込むかです。

ARPスプーフィングの概要

そこで今回の攻撃「ARPスプーフィング」を行います。ARPポイズニングとも呼ばれるこの攻撃は、ARPプロトコルの仕組みを悪用して通信経路を捻じ曲げ、AさんとBさんが攻撃者の端末を経由して通信するように仕向けます。

攻撃者は、正規の通信相手であると偽って、攻撃者自身のMACアドレスを発信します。
被害者の端末は、その嘘のMACアドレスを宛先としてARPテーブルに保存してしまいます。これは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での動作は公式にサポートされていません。
ettercap
「Primary Interface」で、ネットワークに接続しているNICを選択します。
右上のチェックマークをクリックすると、画面下部にテキストが出力されます。
scan for hosts
右上の設定から「Scan for hosts」を選択すると、同一ネットワークに存在するホストを検出してくれます。
スキャンを実行した後「Hosts list」を選択すると、以下のような画面になります。
同一ドメインに存在するPC1のIPアドレスと、VLAN10インターフェースのIPアドレスが検知できています。
host list
ここでホストのPC1(192.168.10.1)を選択して「Add to Terget 1」を選択します。
次にゲートウェイ(192.168.10.254)を選択して「Add to Terget 2」を選択します。
これでターゲットの設定が完了しました。
arp poisoning
右上の「MITM」(Man-In-The-Middle) から「ARPpoisoning」を選択します。
下記のように確認画面があるので「OK」を選択して攻撃を開始します。
mitm start

攻撃中の挙動

攻撃を開始したら、攻撃を停止するまでの間ずっと、以下のような偽造の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