ARP Spoofingのうんちく

ずいぶん昔に書いたARP Spoofingのコードが自宅のcvsサーバから出てきたので、昔を懐かしみつつARP Spoofingネタを書いてみようと思います。
10年くらい経っていますが、未だに通用する攻撃手法です。

スポンサーリンク
スポンサーリンク

ARPってなに?

IPアドレスがあるのに、どうしてMACアドレスが必要なの?という質問は、今までイヤというほど受けてきた。

ひとつ知っておいて欲しいことは、イーサネットで接続されたネットワークでは、IPアドレスでなくMACアドレスで通信する、ということ。これだけ知っていれば大丈夫。

ARP Spoofingで何ができる?

スイッチングハブで接続された環境でパケットキャプチャしたことがある人は判ると思いますが、プロミスキャスモードでキャプチャしても自分宛とブロードキャスト(マルチキャスト)宛てのフレームしか受信できない。

なぜかというと、スイッチングハブは送信先のMACアドレスを見て、このMACアドレスはXX番ポートに送らなきゃ!と判別しているから。その対比がリピータハブ(通称バカハブ)。

リピータハブはすべてのポートにフレームを転送するので、パケットキャプチャをすると全通信が丸見えになる。パケットキャプチャを目的として意図的に使用するSEがたまにいる位で、普通は使わない。

本題に戻ると、さきほどスイッチングハブで接続された環境では自分宛てのフレームとブロードキャスト(マルチキャスト)宛てのフレームしか受信しないと書いたけれど、実は自分宛てでないフレームも受信できる。

ARP Spoofingならば。

はじめに書いたけれど、イーサネットで接続されたネットワーク上ではMACアドレスを使用して通信する。 たとえば192.168.1.1と通信したければ、192.168.1.1のMACアドレスを自分のARPテーブルで検索する。ARPテーブルに192.168.1.1のMacアドレスが登録されていければ、ARPリクエストを送信して192.168.1.1からMACアドレスを得る。

さて、もしもARPテーブルに登録されている192.168.1.1のMACアドレスが192.168.1.2のMACアドレスだったらどうなる思でしょう? そう!192.168.1.1に送信しているつもりが、実は192.168.1.2に送信されてしまう。この理屈を利用すると、ネットワーク上の特定の機器間もしくはすべての機器間の通信を自分に向けることができる。もちろん、それでは通信が切れる。ではどうすれば良いのかというと、本来の通信相手へ転送してやればいい。

ARPテーブルを書き換えるタイミング

ARP Spoofingについて、正規のARPリクエストに対して偽のARPリプライを送信する、と解説しているサイトが非常に多い(昔から変わっていない)。けれどそれは不正確だ。

ARPテーブルは一定時間キャッシュされる。通信するとARPのキャッシュ有効時間はリセットされるから、忙しく通信している場合はいつまで経ってもARPリクエストを投げない。それに、無通信でも数時間キャッシュするネットワーク機器だってある。

ARPテーブルはARPリプライだけで更新されるわけではない。ARPリクエストを受信しただけでも更新される。WindowsでもLinuxでもBSDでもMacでも一緒。ついでに書くと、LinuxはWindowsやBSDよりもARPテーブルを上書きできるARPの通信パターン(ARPヘッダ設定値の組み合わせ)が多い。つまり他のOSと比べてARP Spoofingに弱い。意外と知られていないけれど;)

というわけで、ARP Spoofingをする場合はARPリクエストを待つのではなく、こちらから積極的に偽のARPリクエストを投げた方が効率が良い。 ARPリクエストは通常ブロードキャスト(FF:FF:FF:FF:FF:FF宛て)されるけれど、送信先MACアドレスにユニキャストのMACアドレスを設定することで、好きなタイミングで特定のサーバやネットワーク機器をピンポイントで攻撃できる。

LinuxとBSDにおけるフレーム送信方法の違い

需要があるか判らないけれど、ネタとして書くとLinuxはとにかくsocket(2)を使う。IP Spoofingでも一緒。対して、BSDはとにかくbpf(4)を使う。Linuxはsocket開いてフレーム作ってsendto(2)して、と面倒だけれどBSDはフレーム作って/dev/bpfに書き込めばいい。だから、自前で送信コードを書くときLinuxとBSDの両方に対応させたければ2通りのコードを書く必要がある。面倒な人はライブラリを使った方が簡単だと思う。

百聞は一見にしかず、ということでARP Spoofingを実行する。 特定の相手のARPテーブルを上書きしたい、追加したい場合は、相手のMACアドレスを事前に調べる必要がある。ブロードキャストへ送ると、ネットワーク上のすべての機器のARPテーブルが書き換わってしまう。

例として、同一セグメント上に存在しないIPアドレスを相手のARPテーブルへ追加する。追加するIPアドレスは「1.2.3.4」、MACアドレスは「de:ad:be:ef:de:ad」にする。 ちなみに、追加や上書きをしたいIPアドレスを送信元IPアドレス、MACアドレスを送信元MACアドレスに設定する。

種別 MACアドレス IPアドレス 出力インタフェース
攻撃する側(送信元) de:ad:be:ef:de:ad 1.2.3.4 en1
攻撃される側(送信先) 00:1b:d3:87:96:86 192.168.2.203

ARP Spoofingを受けている側のパケットキャプチャはこのようになる。

ARP Spoofingを受けた後のARPテーブルには1.2.3.4が追加される。

ARP Spoofingをどのように利用するか?

ARP SpoofingによってLAN内の通信経路を制御することができるようになる。これをどのように利用するのか、という点については攻撃者の目的によって異なる。たとえばネットワークを盗聴するだけ、もっと欲張りならば通信内容を書き換える、など。そういば何年か前にさくらインターネットでARP Spoofingを利用した通信の改ざんがあったけれど、あんな感じ。

なんにせよ、かなりヤバイレベルの攻撃になることは間違いない。ARP Spoofingを想定していない企業がこの攻撃をくらったら目も当てられないんじゃないだろうか。ぼくが知る限りではARP Spoofingを想定している企業ネットワークなんて見たことないけれど…

スポンサーリンク
スポンサーリンク