ARP poisoning (理論編)

友人との勉強会でARP poisoning (ARP 汚染,あるいは arp spoofing や arp cache poisoning とも言う) について話すことにした. 有名かつ単純な攻撃ではあるのだが,最近そのような基本をちゃんと実践して確かめる必要性を感じている.


ARP (Address Resolution Protocol)

ARP (Address Resolution Protocol) は同一サブネット内でのイーサネット通信において アドレス解決を行なうためのプロトコルである. ある IP アドレス i を持つホストに対してイーサネットフレームを送りたい場合, そのホストのイーサネットアドレス (MAC アドレス) m を知る必要がある. この im の変換を行うのが ARP の仕事である.

ARP の仕組みを, 「ホスト Alice が同一ネットワーク内のホスト Bob と通信したい」というシナリオを例にして 説明する. ここで IP_a と表記した場合,これは Alice の IP アドレスを表すとする. MAC_a は Alice のイーサネットアドレス, IP_b は Bob の IP アドレスである.

  1. Alice は「IP_b を持つのは誰?」というメッセージを含むARP要求 (ARP request) パケットをブロードキャストする.ARP要求パケットには問い合わせ元に関する情報 (MAC_aIP_a)も含まれる.

  2. Bob はこの要求に受け取り,「IP_b を持つのは私 MAC_b です」というメッセージを含むARP応答 (ARP reply) パケットを MAC_a に宛てて送る.

  3. この ARP 応答を受け,Alice はARPテーブルに,「IP_b の持ち主は MAC_b である」というキャッシュエントリを作成する.以降,Alice は ARP 要求/応答のやりとり無しに,IP_bMAC_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が横取りする」というシナリオを考えてみる.

  1. Alice は IP_b に対応するイーサネットアドレスを得るために,ARP要求パケットをブロードキャストする.

  2. 通常だとここでBobがARP応答を返すのだが,これよりも早く Oscar が「IP_b に対応するのは私 MAC_o です」という偽のARP応答を返す.

  3. これによって,Alice は IP_bMAC_o という不正な対応エントリをARPテーブルに作成することになり,以降AliceからBobに宛てた通信はOscarへと向かうことになる.

  4. Oscar は横取りした通信を Bob にフォワードする.これにより,Alice から Bob への通信は滞りなく行われる.

上の例は「Alice から Bob への通信を Oscar が横取りする」というシナリオだが, 同じようにして「Bob から Alice への通信を Oscar が横取りする」ことも出来る. この場合,Alice と Bob の間の通信は全て Oscar を経由して行われることになり, 積極的な man-in-the-middle 攻撃 (中間者攻撃) の前提条件が成立する. すなわち,全ての通信を傍受し,それを任意に改竄する攻撃が可能となる.


実践編 に続く.