Raspberry PiでWi-Fi Sniffを行ってみる
今回使用したラズパイは3B+なので内臓Wi-Fiがあるが、この内臓Wi-FiはMonitorモードにできないため、Monitorモードに対応したUSB Wi-Fiアダプタを利用してWi-Fi Sniffを行ってみます。
ネットワークインタフェースの確認
まずは現在のネットワークインタフェースを確認してみます。
$ ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
link/ether b8:27:eb:xx:xx:xx brd ff:ff:ff:ff:ff:ff
# ここにwlan0の情報が表示される(はず)
wlan0のMACアドレス部分を覚えておいてください。
MACアドレスの先頭6桁はベンダーを示す識別子で、b8:27:3b
がRaspberry Pi Foundationを表しています。
内臓Wi-Fiを無効化し、Wi-Fiアダプタを有効化するとip link showで表示されるwlan0のMACアドレスが変わっていることを確認できると思います。
内臓Wi-Fiを無効化
内臓Wi-Fiを無効化するには、/boot/config.txt
, /etc/modprobe.d/raspi-blacklist.conf
のどちらかを編集します。
今回は後者を選択しました。
$ sudo vi /etc/modprobe.d/raspi-blacklist.conf
# ------追記--------
# internal wifi off
blacklist brcmfmac
blacklist brcmutil
# -----------------
# 追記したら再起動します
sudo reboot
再起動後に、無効化できたか確認します。
$ ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
link/ether b8:27:eb:xx:xx:xx brd ff:ff:ff:ff:ff:ff
wlan0がなかったら正しく反映されています。
Wi-Fiアダプタの有効化
今回は、BUFFALOの製品を使用しました。現在は販売終了しているみたいです。。。
(※Wi-FiアダプタにはMonitorモードとして起動できるものとそうでないものがあります。)
ラズパイにWi-Fiアダプタを挿して認識してくれているか確認します。
# 認識されているか確認
$ lsusb
Bus 001 Device 008: ID 0411:01ee BUFFALO INC. (formerly MelCo., Inc.) WLI-UC-GNM2 Wireless LAN Adapter [Ralink RT3070]
Bus 001 Device 007: ID 0424:7800 Standard Microsystems Corp.
・
・
・
私の環境ではちゃんと認識してくれていました。
なので、iwconfig
を使用してwlan0に対してMonitorモードの設定を行います。
その後、ifconfig
を使用してwlan0を起動させます。
# wlan0がupしていたらdownしておく
sudo ifconfig wlan0 down
# Monitorモードの設定を行う
sudo iwconfig wlan0 mode monitor
# wlan0をupする
sudo ifconfig wlan0 up
ip link showでwlan0の情報を確認してみます。
$ ip link show
<省略>
3: wlan0: <NO-CARRIER,BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state DORMANT mode DORMANT group default qlen 1000
link/ieee802.11/radiotap cc:e1:d5:xx:xx:xx brd ff:ff:ff:ff:ff:ff
MACアドレス先頭6桁がb8:27:eb
からcc:e1:d5
に変わっているのが確認できます。
ちなむと、cc:e1:d5
はBIFFALO.INCです。ここからベンダー検索できます。
パケットキャプチャする
ここまできてやっとパケットキャプチャのフェーズに移ります。
やることは単純で、tcpdumpでインタフェースに先ほどのwlan0を指定するだけです。
sudo tcpdump -i wlan0 -w <出力ファイル名>
キャプチャ結果はWireSharkで確認するので、ラズパイからWireSharkをインストールした自身のPCにキャプチャファイルを送っておきます。
キャプチャ結果を確認する
Wi-Fiが暗号化されているとイーサネットフレームを見ることができず、IEEE802.11フレームしか見れないので、通信の中身などを確認することができません。WireShark上で復号の設定を行っていきます。(※ローカルなネットワークで試してください。私は家でやりました。)
設定は、WireShark-->Prefereces-->Protocols-->IEEE 802.11-->Decryption keysのEdit
から行います。
Editをクリックすると以下のような画面が出てくると思います。
KeyTypeでWi-Fiの暗号化方式を選択します。
Keyには、
- wpa-pwdの場合は、
パスワード:SSID
- wpa-pskの場合は、パスワードとSSIDから生成される
16進の文字列
を入力します。
16進数の文字列はWPA key calculation: From passphrase to hexから生成します。
Key typeとKeyを設定したらOKを押して反映します。
ここまでの設定を行うと、暗号化されていない通信(HTTPなど)の中身を見ることも可能になります。。。
WPAの鍵を取得してみる
WPAではTemporal Keyと呼ばれる暗号鍵を動的に生成しています。これはWi-Fi接続するタイミングでAPとスマホやPCなどのユーザ端末の間でAuthenticationが行われます。
そこで、スマホなどのWi-FiをOFFにしてから、tcpdumpでパケットキャプチャを開始し、キャプチャ中にスマホなどのWi-FiをONにすると暗号鍵を入手できます。
WireSharkでキャプチャファイルを開き、wlan.sa==<端末のMACアドレス>
でフィルタリングすると以下のような結果を得られました。
Infoの欄にKey
というのがあり、ここに暗号に関わる情報があります。
この情報が入手できれば、通信の中身を覗き見ることもできます。
まとめ
今回はRaspberry PiとWi-Fiアダプタを利用してWi-Fi Sniffする方法を紹介しました。
盗聴はやってはいけません。**ご自身の家で試す
**くらいに留めておきましょう。
このようなサイトや、curlからリクエストを飛ばして中身を覗いてみると面白いかもしれません。