【c言語】ARPポイズニングの解説と実装


ARPポイズニング(ARPスプーフィング)を検証してみたいと思います。
ARPポイズニングによって隣接ノードのルーティングを制御することができます。
こういうテクニックを試していると、物事の仕組みを知ることは大切なんだなぁと思います。
ハッキングというものに興味がある人は試してみてはいかがでしょうか。

もちろん内部的な環境での動作確認です。
公共の場でやったらいろいろまずいので。


ARP


このテクニックはarpプロトコルの動作を利用します。
arpはipアドレスからmacアドレスを解決するためのプロトコルです。
(厳密には利用できるアドレスはipアドレスとmacアドレスだけではないようですが)

ipアドレスとmacアドレスをつかって通信するべき相手を特定しいろいろやり取りするわけですが、ipアドレスだけわかっていてmacアドレスがわからないという状態があります。
そんな時、送信元のマシンAは送信先のマシンBのipアドレスを指定し、
「このipアドレスを持ってるマシンはmacアドレスを教えてください」
というarpパケットを同一セグメント内のすべてのマシンに向けて送信します。

このパケットに指定されたipアドレスを持つマシンは、
「私のmacアドレスはxx:xx:xx:xx:xx:xxです」
というパケットを送り返します。

このパケットを受け取ったマシンAは、マシンBのipアドレスと送られてきたmacアドレスを紐づけるかたちでARPテーブルを更新します。

arpテーブルの内容はarpコマンドで確認することができます。

ARPポイズニングの原理


192.168.11.1には34-3d-c4-5e-60-04というmacアドレスが紐づけられています。
ですからこのマシンと通信するときはイーサネットフレームの送信先macアドレスにこの値を指定して送信します。


たとえば以下の三つのマシンがあると想定します。
マシンA ip:192.168.1.5, mac: 11-11-11-11-11-11
マシンB ip:192.168.1.6, mac: 22-22-22-22-22-22
マシンC ip:192.168.1.7, mac: 33-33-33-33-33-33

マシンAがマシンBと通信すとき、
マシンAは自身のarpテーブルを見て、マシンBのipアドレスとそれに紐づくmacアドレスを指定してマシンBと通信を開始します。

Arpポイズニングはこのipアドレスとmacアドレスの紐づきを強制的に書き換えるテクニックです。
例えばマシンAに対して、
「192.168.1.6に紐づくmacアドレスは33-33-33-33-33-33(マシンCのmacアドレス)でございます」
というパケットを送信するとマシンAのARPテーブルは送られてきたパケットの通りに書き換わります。
するとマシンAはマシンBと通信する際すべてのパケットをマシンCに送信することになります。
ここではマシンCのmacアドレスを指定しましたが、別に存在しないmacアドレスでもいいのです。


このテクニックの本質は正当な相手との通信を不可能にさせることにあると思います。

実装


このテクニックを実現できるツールはいくつかあると思うのですが、自分でプログラムを組んでみたいと思います。
ARPポイズニングと言っても単に対象マシンのARPテーブルを書き換えるだけなので数十行のソースで実現することができます。
すこし粗い作りですが、大体こんな感じになるかと思います。


このソースコードをコンパイルして下記のように実行すると対象のarpテーブルを書き換えることができます。
ちなみにこのプログラムの動作する環境はlinuxです。
raw socketを使用しているためroot権限が必要です。


このテクニックをうまいこと使うと通信を覗き見ることができるようです。
それを以下の記事でやりました。