Raspberry PiとUSB Wi-Fiアダプターを使ってWi-Fi監視してみる。

# Raspberry PiでWi-Fi Sniffを行ってみる
今回使用したラズパイは3B+なので内臓Wi-Fiがあるが、この内臓Wi-FiはMonitorモードにできないため、Monitorモードに対応したUSB Wi-Fiアダプタを利用してWi-Fi Sniffを行ってみます。

## ネットワークインタフェースの確認
まずは現在のネットワークインタフェースを確認してみます。

```sh:現在のNWインタフェースを確認
$ 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```のどちらかを編集します。
今回は後者を選択しました。


```sh:内臓Wi-Fiを無効化
$ sudo vi /etc/modprobe.d/raspi-blacklist.conf

# ------追記--------
# internal wifi off
blacklist brcmfmac
blacklist brcmutil
# -----------------

# 追記したら再起動します
sudo reboot
```

再起動後に、無効化できたか確認します。

```sh:無効化の確認
$ 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の製品](https://www.buffalo.jp/product/series/WLI-UC-GNM2)を使用しました。現在は販売終了しているみたいです。。。
(※Wi-FiアダプタにはMonitorモードとして起動できるものとそうでないものがあります。)


ラズパイにWi-Fiアダプタを挿して認識してくれているか確認します。

```sh:USBの確認
# 認識されているか確認
$ 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を起動させます。

```sh:Monitorモードでwlan0を起動
# wlan0がupしていたらdownしておく
sudo ifconfig wlan0 down

# Monitorモードの設定を行う
sudo iwconfig wlan0 mode monitor

# wlan0をupする
sudo ifconfig wlan0 up
```

ip link showでwlan0の情報を確認してみます。

```sh:
$ 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です。[ここ](https://uic.jp/mac/)からベンダー検索できます。

![スクリーンショット 2020-11-30 19.44.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393221/acfe6f81-ebbc-cdfc-6f9a-d44468c04492.png)


## パケットキャプチャする
ここまできてやっとパケットキャプチャのフェーズに移ります。
やることは単純で、tcpdumpでインタフェースに先ほどのwlan0を指定するだけです。

```sh:
sudo tcpdump -i wlan0 -w <出力ファイル名>
```

キャプチャ結果はWireSharkで確認するので、ラズパイからWireSharkをインストールした自身のPCにキャプチャファイルを送っておきます。

## キャプチャ結果を確認する
Wi-Fiが暗号化されているとイーサネットフレームを見ることができず、IEEE802.11フレームしか見れないので、通信の中身などを確認することができません。WireShark上で復号の設定を行っていきます。(※ローカルなネットワークで試してください。私は家でやりました。)

設定は、```WireShark-->Prefereces-->Protocols-->IEEE 802.11-->Decryption keysのEdit```から行います。
Editをクリックすると以下のような画面が出てくると思います。

<img width="400" alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393221/38008c7e-bd49-c7eb-97d9-7ce503ceb0eb.png">


KeyTypeでWi-Fiの暗号化方式を選択します。
Keyには、

- wpa-pwdの場合は、```パスワード:SSID```
- wpa-pskの場合は、パスワードとSSIDから生成される```16進の文字列```

を入力します。
16進数の文字列は[WPA key calculation: From passphrase to hex](http://jorisvr.nl/wpapsk.html )から生成します。
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アドレス>```でフィルタリングすると以下のような結果を得られました。

![スクリーンショット 2020-11-30 19.42.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393221/c79e6954-da1c-976e-f2a6-cab8c4320d7c.png)

Infoの欄に```Key```というのがあり、ここに暗号に関わる情報があります。
この情報が入手できれば、通信の中身を覗き見ることもできます。


## まとめ
今回はRaspberry PiとWi-Fiアダプタを利用してWi-Fi Sniffする方法を紹介しました。
盗聴はやってはいけません。**```ご自身の家で試す```**くらいに留めておきましょう。
[このような](https://blog.azunyan1111.com/http-post%E3%83%86%E3%82%B9%E3%83%88%E3%83%9A%E3%83%BC%E3%82%B8/)サイトや、curlからリクエストを飛ばして中身を覗いてみると面白いかもしれません。


# 参考サイト
- [Raspberry Pi 3の無線LAN(内蔵WiFi)をオフにする - Qiita](https://qiita.com/yyano/items/802da53ad8a4a00d00e1)

- [Raspberry Pi 3の内蔵WiFiを無効にしてUSB WiFiアダプタを利用する - Qiita](https://qiita.com/mascii/items/14cccd6c791f43beb492)

- [Capturing Wireless LAN Packets on Ubuntu with tcpdump and Kismet](https://sandilands.info/sgordon/capturing-wireless-lan-with-ubuntu-tcpdump-kismet)

- [OS X での WiFi スニファ \| tech - 氾濫原](https://lowreal.net/2016/01/22/1)