ARP poisoning (理論編)
友人との勉強会でARP poisoning (ARP 汚染,あるいは arp spoofing や arp cache poisoning とも言う) について話すことにした. 有名かつ単純な攻撃ではあるのだが,最近そのような基本をちゃんと実践して確かめる必要性を感じている.
ARP (Address Resolution Protocol)
ARP (Address Resolution Protocol) は同一サブネット内でのイーサネット通信において
アドレス解決を行なうためのプロトコルである.
ある IP アドレス i
を持つホストに対してイーサネットフレームを送りたい場合,
そのホストのイーサネットアドレス (MAC アドレス) m
を知る必要がある.
この i
→ m
の変換を行うのが ARP の仕事である.
ARP の仕組みを,
「ホスト Alice が同一ネットワーク内のホスト Bob と通信したい」というシナリオを例にして
説明する.
ここで IP_a
と表記した場合,これは Alice の IP アドレスを表すとする.
MAC_a
は Alice のイーサネットアドレス,
IP_b
は Bob の IP アドレスである.
Alice は「
IP_b
を持つのは誰?」というメッセージを含むARP要求 (ARP request) パケットをブロードキャストする.ARP要求パケットには問い合わせ元に関する情報 (MAC_a
とIP_a
)も含まれる.Bob はこの要求に受け取り,「
IP_b
を持つのは私MAC_b
です」というメッセージを含むARP応答 (ARP reply) パケットをMAC_a
に宛てて送る.この ARP 応答を受け,Alice はARPテーブルに,「
IP_b
の持ち主はMAC_b
である」というキャッシュエントリを作成する.以降,Alice は ARP 要求/応答のやりとり無しに,IP_b
→MAC_b
の変換を行なうことが出来るようになる.
また,動的にIPアドレスとイーサネットアドレスの対応関係を解決するのではなく,あらかじめ静的に対応関係を設定しておくことも出来る.
arp
コマンド
システムが現在保持している ARP テーブルを修正・表示するために,arp
というコマンドが用意されている.
ARP テーブルの表示 (
-a
オプションは BSD スタイルで表示)localhost:~# arp Address HWtype HWaddress Flags Mask Iface Kuro-Box ether 00:0D:0B:69:11:43 C eth0 localhost:~# arp -a Kuro-Box (192.168.0.100) at 00:0D:0B:69:11:43 [ether] on eth0
ARP テーブルへの静的エントリの追加/削除
localhost:~# arp -s kuro-box 00:0D:0B:69:11:43 localhost:~# arp -s 192.168.0.1 00:30:13:77:D4:3A localhost:~# arp Address HWtype HWaddress Flags Mask Iface 192.168.0.1 ether 00:30:13:77:D4:3A CM eth0 Kuro-Box ether 00:0D:0B:69:11:43 CM eth0 localhost:~# arp -d kuro-box localhost:~# arp Address HWtype HWaddress Flags Mask Iface 192.168.0.1 ether 00:30:13:77:D4:3A CM eth0 Kuro-Box (incomplete) eth0
また,静的エントリはファイルから一気に読み込むことも出来る.
localhost:~# cat /etc/ethers 00:30:13:77:D4:3A 192.168.0.1 00:0D:0B:69:11:43 Kuro-Box localhost:~# arp -f /etc/ethers
ARP poisoning
ARP poisoning はその名の通り,攻撃者が偽のARP replyを送ることでARPテーブルを"汚染"する攻撃である. ここで,「ARP poisoningを使ってAliceからBobへの通信をOscarが横取りする」というシナリオを考えてみる.
Alice は
IP_b
に対応するイーサネットアドレスを得るために,ARP要求パケットをブロードキャストする.通常だとここでBobがARP応答を返すのだが,これよりも早く Oscar が「
IP_b
に対応するのは私MAC_o
です」という偽のARP応答を返す.これによって,Alice は
IP_b
→MAC_o
という不正な対応エントリをARPテーブルに作成することになり,以降AliceからBobに宛てた通信はOscarへと向かうことになる.Oscar は横取りした通信を Bob にフォワードする.これにより,Alice から Bob への通信は滞りなく行われる.
上の例は「Alice から Bob への通信を Oscar が横取りする」というシナリオだが, 同じようにして「Bob から Alice への通信を Oscar が横取りする」ことも出来る. この場合,Alice と Bob の間の通信は全て Oscar を経由して行われることになり, 積極的な man-in-the-middle 攻撃 (中間者攻撃) の前提条件が成立する. すなわち,全ての通信を傍受し,それを任意に改竄する攻撃が可能となる.
実践編 に続く.