目的
Raspberry Pi 3 ModelBで無線パケットキャプチャーをして遊ぶ
環境
- Raspberry Pi 3 ModelB
- Wireshark v2.2.6
作業メモ
参考サイト
https://qiita.com/eggman/items/b82c5b85438c1f4e4c86
http://cha-shu00.hatenablog.com/entry/2017/10/24/203112
無線LANのインターフェースをモニターモードに変更する
パケットキャプチャーするには無線LANのインターフェースをモニターモードにする必要がある
ここではその設定を行う
- 無線LAN(ここでは
wlan0
)の現在のモード設定を確認する
$ iwconfig
wlan0 ・・・
Mode:Managed
(以下略)
現在のモードはManaged
となっている。これをmonitor
に変更するのが目的
- モニターモードへの変更を試みる
$ sudo iwconfig wlan0 mode monitor
Error for wireless request "Set Mode" (8B06) :
SET failed on device wlan0 ; Operation not supported.
そんな操作には対応していないから変更できない、とエラーが出た
参考サイトの情報などからすると、モニタモードに変更するための機能がない状態らしい
そのため、それを追加する方法を実施していく
モニターモード変更機能の追加
前項に引き続き参考サイトを見ると、以下を適用すればいい模様1
その中でも次の手順を実施すればよい
・Build patches for bcm43430a1 on the RPI3/Zero W or bcm434355c0 on the RPI3+ using Raspbian (recommended)
・Using the Monitor Mode patch
Build patches for bcm43430a1 on the RPI3/Zero W or bcm434355c0 on the RPI3+ using Raspbian (recommended)
必要なDriverやfirmwareをビルドする
細かい手順は割愛して、特記事項だけ以下に記載していく
- makeに失敗する
以下の手順を行うと、firmwareのインストールに失敗した
Install the patched firmware on your RPI3: make install-firmware
$ make install-firmware
(略)
COPYING brcmfmac43430-sdio.bin => /lib/firmware/brcm/brcmfmac43430-sdio.bin
cp: 通常ファイル '/lib/firmware/brcm/brcmfmac43430-sdio.bin' を作成できません: 許可がありません
Makefile:183: ターゲット 'install-firmware' のレシピで失敗しました
make: *** [install-firmware] エラー 1
Makefileを確認すると、以下のような警告が書かれており、インストールできない場合は手動でコピーが必要になる
$ less Makefile
(略)
else
$(warning Warning: Cannot install firmware on this arch., bcm43430-sdio.bin needs to be copied manually into /lib/firmware/brcm/ on your RPI3)
なので、手動でコピー
$ sudo cp brcmfmac43430-sdio.bin /lib/firmware/brcm/brcmfmac43430-sdio.bin
- Optionについて
以下のように書かれているが、wpa_supplicant以外で無線LANのインターフェースをコントロールする方法などご存じないので、実施していない
Optional: remove wpa_supplicant for better control over the WiFi interface: apt-get remove wpasupplicant
Using the Monitor Mode patch
- Optionの実施
最初にこのOptionを実施した
(再起動時にmakeしたDriverをロードするための設定なので必要)
Optional: To make the RPI3 load the modified driver after reboot:
ちなみにkernelのversionは以下で確認できる
$ less /proc/version
Linux version 4.14.34-v7+ (dc4@dc4-XPS13-9333) (gcc version 4.9.3 (crosstool-NG crosstool-ng-1.22.0-88-g8460611)) #1110 SMP Mon Apr 16 15:18:51 BST 2018
- モニターモードのインターフェース(
mon0
)を追加する
これにより無線LANインターフェースのwlan0
はそのままでパケットキャプチャーできる
つまり、パケットキャプチャーしつつ、WiFiは普通につなげる
モニターモードのインターフェースmon0
を追加(無効状態)
$ sudo iw phy `iw dev wlan0 info | gawk '/wiphy/ {printf "phy" $2}'` interface add mon0 type monitor
モニターモード(Mode:Monitor
)で追加されているか確認
$ iwconfig
(略)
mon0 IEEE 802.11 Mode:Monitor Frequency:2.462 GHz Tx-Power=31 dBm
Retry short limit:7 RTS thr:off Fragment thr:off
Power Management:on
インターフェースを有効にする
$ sudo ifconfig mon0 up
パケットキャプチャーする
- wiresharkでパケットキャプチャー
sudo
してwireshark起動
(sudo
しないとmon0
への権限がないためかパケットキャプチャーできなかった)
$ sudo wireshark
2.4GHzパケットのキャプチャーができていることを確認できた!
チャンネル変更してのパケットキャプチャー
かなり苦戦したのでメモとして残しておく
この方法だとwlan0
のインターフェースをdownするので、パケットキャプチャー中はWiFiが使えない2
- チャンネル変更前の準備
wlan0
のWiFi機能を使って何かやっている場合はその機能を停止しておく
(例えば、SSH接続など)
-
wlan0
のインターフェースをdown
$ sudo ifconfig wlan0 down
- モニターモードのインターフェース
mon0
を追加(無効状態)
$ sudo iw phy `iw dev wlan0 info | gawk '/wiphy/ {printf "phy" $2}'` interface add mon0 type monitor
作成時の状態を確認
チャンネルは1ch(2.412GHz)になっている
$ iwconfig mon0
mon0 IEEE 802.11 Mode:Monitor Frequency:2.412 GHz
Retry short limit:7 RTS thr:off Fragment thr:off
Power Management:on
- チャンネル変更3
例として6ch(2.437GHz)へ変更する
$ nexutil -k6
チャンネルが変更されているか確認
$ iwconfig mon0
mon0 IEEE 802.11 Mode:Monitor Frequency:2.437 GHz
Retry short limit:7 RTS thr:off Fragment thr:off
Power Management:on
- インターフェースを有効にする
$ sudo ifconfig mon0 up
あとは sudo wireshark
してwiresharkで6chのパケットキャプチャーができていることを確認できればOK!
まとめ
チャンネル変更などしつつ無線パケットのキャプチャーができたので目標達成!
Raspberry Pi 3 ModelBで無線パケットキャプチャーをして遊ぶ
課題としては、チャンネル変更してのパケットキャプチャー
でも触れたが、wlan0
をdownしないでチャンネルを変更する方法の検討が挙げられる。
(何となく理屈的に無理な気もするが)
-
一応サポートデバイスなのかをちゃんと確認。https://github.com/seemoo-lab/nexmon のSupported Devicesを確認すると、確かにBCM43438のモニターモードに対応していることが分かる ↩
-
wlan0
のインターフェースをdownしないでチャンネル変更できる方法を知っている方がいれば教えてほしい・・ ↩ -
wlan0
そのままでこの変更をすればいいのでは?と思うかもしれないが、mon0
とwlan0
は同じphy0
経由でインターフェースを作っているので、おそらくwlan0
が何かしらのチャンネルでWiFi接続している場合、その設定を変更できないものと思われる(予想含む) ↩