Raspberry Pi 3 ModelB で2.4GHz無線パケットキャプチャー

## 目的
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.
```

そんな操作には対応していないから変更できない、とエラーが出た
[参考サイト](https://qiita.com/eggman/items/b82c5b85438c1f4e4c86)の情報などからすると、モニタモードに変更するための機能がない状態らしい
そのため、それを追加する方法を実施していく

### モニターモード変更機能の追加

前項に引き続き[参考サイト](https://qiita.com/eggman/items/b82c5b85438c1f4e4c86)を見ると、以下を適用すればいい模様[^1]
[^1]: 一応サポートデバイスなのかをちゃんと確認。https://github.com/seemoo-lab/nexmon のSupported Devicesを確認すると、確かにBCM43438のモニターモードに対応していることが分かる

https://github.com/seemoo-lab/nexmon

その中でも次の手順を実施すればよい

>・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]

[^2]: `wlan0`のインターフェースをdownしないでチャンネル変更できる方法を知っている方がいれば教えてほしい・・

+ チャンネル変更前の準備

`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]

[^3]: `wlan0`そのままでこの変更をすればいいのでは？と思うかもしれないが、`mon0`と`wlan0`は同じ`phy0`経由でインターフェースを作っているので、おそらく`wlan0`が何かしらのチャンネルでWiFi接続している場合、その設定を変更できないものと思われる(予想含む)


例として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で無線パケットキャプチャーをして遊ぶ

課題としては、<b>`チャンネル変更してのパケットキャプチャー`</b>でも触れたが、`wlan0`をdownしないでチャンネルを変更する方法の検討が挙げられる。
(何となく理屈的に無理な気もするが)