Wi-Fiパケットキャプチャ環境の構築

# はじめに
Wi-Fiパケットのキャプチャを行う環境構築についてまとめてみました。


:::note  alert
本記事の内容は、自分が管理しているWi-Fiネットワークの検証を目的としたものです。「Wi-Fiの仕組みを学びたい」「自宅のネットワーク接続が不安定なので原因を調べたい」といった用途を想定しています。

他人のネットワークを無断でキャプチャする行為は、法律に違反する可能性があるため絶対に行わないでください。また、使用機器や電波に関する法律（電波法など）についても、各自の責任でご確認ください。
:::
## 前置き：キャプチャするパケットについて
Wi-Fiパケットには、
- データフレーム
- 管理フレーム
- 制御フレーム

があります。

このうち、管理フレームをキャプチャできれば通常は十分でしょう。
- 制御フレームはAck（確認応答）などで、解析上はあまり意味を持ちません。
- データフレームは暗号化されているため、キャプチャしても中身を確認することは困難です。データを確認したいなら、アクセスポイントから先の有線LANでキャプチャする方が簡単ですが、データ自体通常はSSLなどで暗号化されている事が多いです。

データフレームは高速化のため様々な処理がされており、キャプチャの難易度が高いです。一方で管理フレームは低速でシンプルなので、比較的簡単にキャプチャできます。Wi-Fiの動作を学ぶとか接続状況の確認などであれば、管理フレームの解析が役に立ちます。

# Macでキャプチャ
近年のMac（Wi-Fi機能付き）では、標準環境でWi-Fiパケットをキャプチャ可能です。操作性はあまり良くないと思います。

https://qiita.com/T3pp31/items/82099588b6ca6271a342
# Windowsでキャプチャ
以前はAirPcapという専用デバイスが定番でしたが製造終了しています。
参考：

https://www.ikeriri.ne.jp/develop/airpcap/airpcapnx.html

現在の主な選択肢は、市販ソフトの CommView for WiFi と対応Wi-Fiアダプタの組み合わせです。
- CommViewは30日間の試用版が利用可能です。
- 試用版は一度にキャプチャ可能なパケット数の制限があります。
- キャプチャ後、ファイルに保存しWiresharkで解析するフローとなるため、リアルタイムでの解析はできません。

参考：

https://www.ikeriri.ne.jp/develop/tamosoft/commviewforwifi.html

利点： 6GHz帯のキャプチャも容易です（今のところLinuxでは6GHzのチャネル指定がCLIのみ）。
# Linuxでのキャプチャ（おすすめ）
現時点でコストパフォーマンスに優れるのがLinux環境でのWi-Fiキャプチャです。
## 使用するハードウェア
 Raspberry Pi でも可能ですが、本格的な運用にはx86系ノートPCやデスクトップPCの方が向いていると思います。
## Wi-Fiアダプタの選定
Wi-Fiパケットをキャプチャするには、モニターモード対応のアダプタと、それをサポートするドライバが必要です。

データシートではわからないため、ネット上の実績報告を元に選定する必要があります。アダプタが使用しているチップセットに依存します。

大きく分けてM.2接続のノートPC向けの内蔵アダプタと、USB接続の外付けのアダプタがあります。下記は一例です。
### M.2接続タイプ（内蔵用）
intel製アダプタ：（全部を確認したわけではありません）
Wi-Fi6 AX200 / AX201 / AX203
Wi-Fi6e AX210 / AX211
Wi-Fi7 BE200 / BE201 / BE202

これらのアダプタをPCI-e接続に変換した製品も市販されています。

intelのシリーズは基本的にLinuxの標準ドライバで動作するので、ベアメタルでLinuxをインストールするならお勧めです。（ノートPCに内蔵されている場合そのまま使えます）

### USB接続タイプ（外付け）
以下のGitHubに多数の情報があります。私が見つけた記事の中では最も包括的かつ更新頻度も高いので、Wi-Fiパケットキャプチャする人は一通り目を通すことをお勧めします。（英語）

https://github.com/morrownr/USB-WiFi


日本で市販されている（いた）もので自分が動作確認した一例：

- [NETGEAR Nighthawk AX3000](https://www.netgear.com/jp/home/wifi/adapters/a8000/)（Wi-Fi 6E対応）
→ 2.4/5/6GHz。Windows11でも使用可能。値段は高いですがお勧め

- [NETGEAR A6210](https://www.netgear.com/jp/home/wifi/adapters/a6210/)（Wi-Fi 5）　販売終了品
→ 2.4/5GHz。現在のWindowsでは使用不可。ベアメタルのLinux専用機では標準ドライバで利用可能。フリマで入手。

- [TP-Link Archer T2U nano](https://www.tp-link.com/jp/home-networking/adapter/archer-t2u-nano/)（Wi-Fi 5）
→ 2.4/5GHz。安い。Linux Kernel 6.14で標準ドライバ対応の予定。それ以前のKernelではドライバの問題でお勧めしない。TP-Linkは製品のチップセットを変更することがあるので動作保証しにくい。

## Linuxのインストール方法
LinuxをPCにインストールするには、ベアメタルでインストールするか、仮想PCとしてインストールするか選択肢があります。それぞれのメリット、デメリットを説明します。
### ベアメタル（直接インストール）
LinuxをPCに直接インストールし、OSとしてLinuxのみを使用する方法です。USBメモリなどにISOファイルを入れたブートメディアからインストールします。

メリット：
- ノートPCの内蔵アダプタがそのまま使える可能性あり
- デスクトップPCの場合はPCI-e接続のWi-Fiアダプタを装着することもできる
- USB接続のアダプタを多数接続してマルチチャネルキャプチャも可能（例：8ch同時）

デメリット：
- Windowsが使えなくなる
- Linuxのディストリビューションをあれこれ試したり、再インストールするのがちょっと手間

本格的な運用を考えている方向けの選択肢です。
### 仮想マシンでのインストール
Windows上にLinuxを仮想マシンとしてインストールする方法です。USB接続のWi-FiアダプタをLinuxからモニターモードで利用します。

- 私は仮想環境にVirtualBoxを使用していますが、VMwareの使用例もあるようです。
- WSL2やHyper-V環境では、USBアダプタをモニターモードにできませんでした（QEMUは未調査）。

メリット：
- Windowsと共存できる
- 仮想マシンのインストール、削除が簡単
- 環境を簡単にバックアップできる
- キャプチャしたファイルをWindows側で解析しやすい（WiresharkはWindows版の方がバージョンが進んでいるので）

デメリット：
- 内蔵Wi-Fiアダプタは（たぶん）モニターモードにできない
- USBアダプタ接続数の上限が少なめ（3つ程度が限界のケースも）
- メモリ・ストレージに余裕が必要

まずはVirtualBoxで試し、必要になったらベアメタルで本格構築というステップがおすすめです。
# おすすめのLinuxディストリビューション
Ubuntu Desktopでもいいのですが、フットプリントが比較的小さく、必要なアプリケーションが初めから揃っているKali Linuxが人気です。

https://www.kali.org/

# VirtualBoxを使ったKali Linux環境設定

## VirtualBoxのインストール
[https://www.virtualbox.org](https://www.virtualbox.org) からWindows hosts用のインストーラーをダウンロードしてインストールしてください。

Tips：VirtualBoxでゲストOSがエラーを起こして実行できなくなった場合は、
- VirtualBoxをアンインストール
- C:¥Program Files¥Oracle¥VirtualBox フォルダを削除
- C:¥Users¥<ユーザ名>¥.VirtualBox フォルダを削除
- C:¥Users¥<ユーザ名>¥VirtualBox VMs フォルダのゲストOSイメージを削除

で一度完全に削除してから再度VirtualBoxをインストールすると直る事があります。
## Kali Linuxのインストールと設定
[https://www.kali.org/get-kali/#kali-platforms](https://www.kali.org/get-kali/#kali-platforms)からVirtual Machinesのリンクをクリックし、[https://www.kali.org/get-kali/#kali-virtual-machines](https://www.kali.org/get-kali/#kali-virtual-machines)のページのVirtalBox用のイメージファイルをダウンロードしてください。
ダウンロードしたら7-Zip形式で圧縮されているファイルを解凍し、適当なフォルダに置いてください。

VirtalBoxを起動したら、仮想マシン＞追加　でKali Linuxのイメージファイルを選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3692824/81980947-d538-43ea-a8ff-d358a482eadd.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3692824/4cd56b78-5a64-4107-84d7-90f3f7775830.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3692824/a11e094c-39e4-414a-87d1-51f3fe59128d.png)

Kali Linuxが追加されたら、設定⚙️のアイコンをクリックし、USBのタブでUSB 2.0もしくはUSB 3.0コントローラを選んで、右側の「＋」アイコンからUSBアダプタを選択

![USB設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3692824/751d28d1-616f-4a7c-a813-68e38f83af61.png)

ネットワークのタブで、アダプター２を有効化して、
割り当て：ブリッジアダプター　を選択
名前：接続しているUSBアダプタ名　を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3692824/dc90662d-47c4-48f8-bd7a-526c50dd6039.png)

OKを押したら、Kali Linuxを起動してください。

注意：Kali Linuxが起動し、USBアダプタを使用し始めた後でUSBアダプタの抜き差しするとシステムクラッシュすることがあります。USBアダプタを抜き差しするのはKali Linuxをシャットダウンした状態で行うのが安全です。
# キャプチャの手順
Kali Linuxが起動したら、
ユーザ名：kali
パスワード：kali
でログインできます。rootパスワードもkaliです。
ユーザ名、パスワードは適宜変更してください。
ログインしたら、ターミナルを開いてrootになってください。（airmon-ngコマンドはroot権限が必要です。sudo実行してもOK）
```
$ sudo su
[sudo] password for kali: 初期値だとkaliと入力
# 
```

USBアダプタが見えているか、確認します。（airmon-ngコマンドが簡単）
```
# airmon-ng

PHY     Interface       Driver          Chipset

phy0    wlan0           iwlwifi         Intel Corporation Wireless 8265 / 8275 (rev 78)
#
```

パケットキャプチャに影響のあるプロセスを止めます。
```
# airmon-ng check kill
Killing these processes:

    PID Name
    763 wpa_supplicant
#
```

Wi-Fiアダプタをモニターモードにします。
```
# airmon-ng wlan0 start
PHY     Interface       Driver          Chipset

phy0    wlan0           iwlwifi         Intel Corporation Wireless 8265 / 8275 (rev 78)
                (mac80211 monitor mode vif enabled for [phy0]wlan0 on [phy0]wlan0mon)
#
```

Wiresharkを立ち上げて、wlan0monを選んでキャプチャします。
無線ツールバーを表示すればキャプチャするチャネルを指定する事ができます。（いまのところ無線ツールバーで指定できるチャネルは2.4/5GHzだけで、6GHzは指定できません。6GHzのチャネルを指定するにはCLIで行います）

# Wi-Fiパケットキャプチャのセットアップスクリプト
シェルスクリプトでWi-Fiパケットキャプチャの準備を行い、複数のWi-Fiアダプタにキャプチャするチャネルを割り振るようにしました。
/usr/local/bin/wifisetup.sh とかにchmod +xして実行形式で置いておくとよいでしょう。
```
#!/bin/bash
# root権限のチェック
if [ "`whoami`" != "root" ]; then
	echo "Require root privilege!!"
	exit 1
fi
# Wi-Fiチャネル設定用の変数
channel[0]=1
channel[1]=6
channel[2]=11
channel[3]=36
channel[4]=40
channel[5]=44
channel[6]=48
channel[7]=52
#
# airmon-ngでWi-Fiアダプタのリストを取得し、行数からアダプタの個数を算出
wifi_count=`airmon-ng|wc -l`
wifi_count=$(($wifi_count - 4))
echo $wifi_count Wi-Fi adaptor exist\(s\)
#
# キャプチャに影響するプロセスを終了
echo "airmon-ng check"
airmon-ng check
airmon-ng check kill
#
# airmon-ngでWi-Fiアダプタをモニターモードにして、それぞれにWi-Fiチャネルを設定
# wlan0からwlan7に、1, 6, 11, 36, 40, 44, 48, 52chを設定
for((i=0;i<$wifi_count;i++))
do
	echo airmon-ng start wlan$i ${channel[i]}
	airmon-ng start wlan$i ${channel[i]}
done
#
# 最後にWiresharkを起動してもよいです
#wireshark > /dev/null &
```

シェルスクリプト実行はrootで。
実行はこんな感じ。内蔵Wi-FiとUSBアダプタの2つを利用する場合。
```
## rootになります
┌──(cohpen㉿Letskali)-[~]
└─$ sudo su
[sudo] password for cohpen: 

## Wi-Fiインターフェースが見えることを確認
┌──(root㉿Letskali)-[/home/cohpen]
└─# airmon-ng              

PHY     Interface       Driver          Chipset

phy0    wlan0           iwlwifi         Intel Corporation Wireless 8265 / 8275 (rev 78)
phy1    wlan1           mt76x2u         NetGear, Inc. A6210

## シェルスクリプト実行           
┌──(root㉿Letskali)-[/home/cohpen]
└─# wifisetup.sh                    
2 Wi-Fi adaptor exist(s)
airmon-ng check

Found 2 processes that could cause trouble.
Kill them using 'airmon-ng check kill' before putting
the card in monitor mode, they will interfere by changing channels
and sometimes putting the interface back in managed mode

    PID Name
    645 NetworkManager
    763 wpa_supplicant


Killing these processes:

    PID Name
    763 wpa_supplicant

airmon-ng start wlan0 1


PHY     Interface       Driver          Chipset

phy0    wlan0           iwlwifi         Intel Corporation Wireless 8265 / 8275 (rev 78)
                (mac80211 monitor mode vif enabled for [phy0]wlan0 on [phy0]wlan0mon)
                (mac80211 station mode vif disabled for [phy0]wlan0)
phy1    wlan1           mt76x2u         NetGear, Inc. A6210

airmon-ng start wlan1 6


PHY     Interface       Driver          Chipset

phy0    wlan0mon        iwlwifi         Intel Corporation Wireless 8265 / 8275 (rev 78)
phy1    wlan1           mt76x2u         NetGear, Inc. A6210
                (mac80211 monitor mode vif enabled for [phy1]wlan1 on [phy1]wlan1mon)
                (mac80211 station mode vif disabled for [phy1]wlan1)

## モニターモードになりました（名前にmonがつかないアダプタもある）
┌──(root㉿Letskali)-[/home/cohpen]
└─# airmon-ng

PHY     Interface       Driver          Chipset

phy0    wlan0mon        iwlwifi         Intel Corporation Wireless 8265 / 8275 (rev 78)
phy1    wlan1mon        mt76x2u         NetGear, Inc. A6210

┌──(root㉿Letskali)-[/home/cohpen]
└─# 
```
複数チャネルをキャプチャする場合、Wiresharkのインターフェースはanyを選ぶのがお勧め。Ctrlを押しながら複数Wi-Fiアダプタを選択した場合、チャネルを順に切り替えるのでパケットの取りこぼしが多くなります。