注意: この記事はLLMによって英語から翻訳されたものです。正確性については保証いたしかねますので、あらかじめご了承ください。英語の原文はこちら。
ARPスプーフィング攻撃は、ARPポイズニングとも呼ばれ、ローカルネットワークを攻撃するために使用される技術です。2台のマシン間の通信を傍受することが可能になります。この記事では、その仕組み、使用方法、そして身を守る方法について解説します。
ARPプロトコル#
まず、ARPプロトコルとは何かを定義する必要があります。ARPは「Address Resolution Protocol」の略で、TCP/IPモデルのインターネット層で動作します。TCP/IPの詳細には立ち入りませんが、この層では2種類のアドレスが使用されることを知っておく必要があります:
- IPv4アドレスは、ネットワーク上のマシンを識別するための抽象概念です。A.B.C.Dの形式で4バイトで構成されます。IPv6が使用される場合、ARPの代わりにNDPプロトコルが使用されることに注意してください。
- MACアドレスは、ネットワークカードの物理アドレスです。一意であることが前提で、6バイトで構成され、AF:43:3E:54:FF:42のように表記されます。
同一ネットワーク内の2台のマシンが通信するために使用されるのはMACアドレスです。ここでARPプロトコルの出番となります。ARPはIPアドレスからマシンのMACアドレスを見つける役割を担っています。そのために2つの方法があります。マシンが既にキャッシュにエントリを持っていて、どのMACアドレスがどのIPに対応するか知っている場合と、そうでない場合です。知らない場合、マシンはネットワーク上にブロードキャストリクエストを送信します(つまり、すべてのアドレスがリクエストを受信します)。探しているマシンだけがリクエストの送信者に返信することになっています。
これはうまく機能しますが、さまざまなリクエストに対する検証が行われないため、プロトコルは安全ではありません。
攻撃のワークフロー#
理論#
ARPスプーフィングの目的は、ある相手のマシンに対して、自分のマシンが通信相手であると思い込ませることです。そのために、前のセクションでブロードキャストされるリクエスト(ルーターになりすましたもの)を偽造し、被害者に送信します。
このリクエストは正規のものと非常に似ていますが、MACアドレスを変更します。ルーターのMACアドレスの代わりに、自分のマシンのMACアドレスを設定します(ルーターになりすます場合。他のMACアドレスを設定することも可能です)。被害者のマシンがパケットを受信すると、誤った情報でキャッシュが更新され、以後、被害者がルーターに送信するものはすべて自分のマシンに届くようになります。もちろん、偽造パケットを定期的に送信して、被害者のキャッシュの誤った情報が書き換えられないようにする必要があります。
実践#
免責事項:以下の攻撃を実行することは、自分の機器でテストする場合、またはネットワークおよびマシンの所有者の許可を得ている場合を除き、違法です。
理論は良いですが、少し実践してみましょう。ARPスプーフィングを使って中間者攻撃を行います。簡単に言うと、この攻撃は2台のマシン間の通信を傍受するものです。BobとAliceが通信している場合、Bobはパケットをルーターに送り、ルーターはパケットをAliceに送り、という具合です。攻撃を行うと、各パケットは目的地に到達する前に攻撃者のコンピュータを経由するようになります。BobとAlice間の通信を傍受するだけでなく、パケットの内容を変更する(例えばマルウェアを埋め込む)ことも可能です。
このために、EttercapとWiresharkという2つのツールを使用します。前者はARPポイズニングを担当し、後者は通過するパケットを確認するために使用します。
まず、IPフォワーディングを有効にする必要があります。有効にしないと、傍受したパケットが自分のマシンで止まってしまい、BobとAliceの間の通信が途切れてしまいます。以下のコマンドを入力します。この変更は永続的ではなく、次回コンピュータを再起動すると無効になります。
sudo echo 1 > /proc/sys/net/ipv4/ip_forward完了したら、Ettercapを起動し、「Sniff / Unified sniffing」に移動して、ネットワークへの接続に使用しているインターフェースを選択します(例:eth0)。次に、ターゲットを選択します。そのために、「Hosts / Hosts List」を開き、ネットワークに接続されているホストを見つけるためにスキャンを実行します。以下のスクリーンショットのような画面が表示されるはずです。

次に、ルーター(192.168.1.1)を最初のターゲット、ネットワークに接続されているコンピュータ(192.168.1.105)を2番目のターゲットとして定義します。どちらが最初のターゲットでどちらが2番目かは、ここでは重要ではありません。
攻撃を続ける前に、ターゲットマシンでシェルを開き、キャッシュの状態を表示するarp -aコマンドを実行しましょう。正しいMACアドレスが正しいIPに関連付けられていることが確認できます。

次に、攻撃を開始するために「Mitm / ARP Poisoning」に移動します。その前に、Wiresharkを起動してネットワークを通過するARPリクエストを確認できるように設定しておきます。

Wiresharkで確認できるように、偽造ARPパケットが送信されています。被害者のARPキャッシュを再度確認して、攻撃が成功したか見てみましょう。

予想通り、被害者のARPキャッシュにはルーターのMACアドレスではなく、攻撃者のMACアドレスが含まれていることが確認できます。
これで、攻撃対象のマシンがパケットを送信する際、ルーターに直接送られるのではなく、まず攻撃に使用しているデバイスを経由するようになります。次に、Wiresharkを使用して被害者のHTTPトラフィックを検査します。
ターゲットマシンを使用してSSLを使用していないウェブサイトにログインすると、見事に成功です!以下のスクリーンショットで確認できるように、接続IDが傍受され、被害者がユーザー名/パスワード「Moi」と「MonMotDePasse」でサービスにアクセスしようとしていることが分かります。

この攻撃から学べること#
この攻撃を実践することで、いくつかのことが分かりました:
- この攻撃は非常に簡単に実行できる
- 公共WiFiには気をつけろと言っていた人は正しかった
- 暗号化されていないトラフィックは危険である
攻撃が提供するその他の可能性#
この例では、HTTPを使用してマシンを通過するパケットを盗聴しただけですが、HTTPSトラフィックの盗聴も(より困難ではありますが)完全に可能です。
より困難である理由は、HTTPSトラフィックが署名付き証明書を使用しているためです。悪意のある個人は証明書の秘密鍵を盗む必要があります。盗めない場合、被害者のコンピュータに証明書が無効であるという警告が表示されます(ただし、被害者はこの警告を無視することもできます)。
攻撃者はまた、悪意のあるFlashやJavaScriptコードを使って、ユーザーが閲覧しているページを改ざんし、被害者のマシンにマルウェアを感染させたり、DNSスプーフィングを行って被害者を攻撃者が選択したサーバーにリダイレクトしたりすることもできます。
身を守る方法#
ARPには欠陥がありますが、幸いにも身を守る方法はあります。
VPNの使用#
公共ネットワーク(空港、ホテルなど)にコンピュータを接続する際が最も危険にさらされる場面でしょう。この場合、最善の選択肢は、すべてのパケットがVPNを通過するようにするキルスイッチ付きのVPNを使用することです。これにより、トラフィックは暗号化され、潜在的な攻撃者は何もできなくなります。「HTTPSウェブサイトにのみ接続していれば大丈夫では?」と思うかもしれません。答えはノーです。まず、DNSポイズニングの被害を受ける可能性があります。次に、多くのウェブサイトがHTTPSを使用しながらJavaScriptをHTTP経由でロードしているため、リスクは依然として同じです!
静的ARPテーブルの使用#
もう一つの解決策は、この例のような動的なARPテーブルの代わりに、静的なARPテーブルを使用することです。これはうまく機能しますが、必ずしも最も便利な選択肢ではありません。
ネットワークの監視#
ARP攻撃の検出は非常に簡単です(先ほどのWiresharkのスクリーンショットでお気づきかもしれません)。Arpwatch、Prelude-IPS、Etherwallなどのツールを使用して検出できます。さらに良いのは、NIPS(ネットワーク侵入防止システム)を使用すれば、攻撃を自動的に阻止することができます。