VirtualBox + Ubuntu24.04 + USB Wi-Fiアダプターで任意のMACアドレスを指定したAPを乱立してみた

# はじめに
前回、Windows 11で、アクセスポイント(以下AP)のBSSIDを偽装する方法を解説しました。

https://qiita.com/kiritannplum/items/56e49471643ae74d85f9

しかし、この方法では一部環境を除きローカルアドレスしか指定できず、ユニバーサルアドレスは指定できませんでした。
そんな中、DiscordコミュニティにてLinuxであれば両方指定できたとの情報を得たので、自分でも調べてBSSIDを偽装したAPを、同時に複数作成する手順を確立したので備忘録も込みで解説します。

かなり久しぶりにUbuntuを触り、手探り独学で作成しましたので間違い、補足情報などありましたらお気軽にどうぞ。

# 環境・使用するもの
私の環境を一例として紹介します。
## OS
**Windows 11 Home**

## Linux対応USB Wi-Fiアダプター
~~※前回使用したTP-Link Archer T2U NanoはLinux非対応のため使用しません。~~
Archer T2U Nanoを使用する方法が判明したので併記します。
**TP-Link TL-WN725N**


https://www.tp-link.com/jp/home-networking/adapter/tl-wn725n/

もしくは、

**TP-Link Archer T2U Nano**

https://www.tp-link.com/jp/home-networking/adapter/archer-t2u-nano/

上記二つで処理・手順が異なる部分は両方解説します。
また、両方併用することはできません。どちらか片方のみを使用します。

## ソフトウェア
**Oracle VM VirtualBox 7.0.20**

***

(要らないと思うが念のために入れておいたもの)
TL-WN725NのWindows用ドライバー

Archer T2U NanoのWindows用ドライバー

## 仮想環境用OS
**Ubuntu 24.04**

## MACアドレス確認用のスマホ or PC
前回と同じです。
解説ではAndroidスマホを使用します。周囲のWi-FiのMACアドレスを調べられるアプリ・ソフトの一例を以下に記載します。（自身の発しているWi-Fiは確認できません）

**Windows**

https://www.netspotapp.com/

**Android**

https://play.google.com/store/apps/details?id=com.vrem.wifianalyzer

**iOS**（所持していないので未確認）

https://apps.apple.com/jp/app/bssid-scan/id1442586100

# 注意事項
仮想環境を作成し、その上でUbuntuを使用する方法となり、Linuxに慣れていない方にはおすすめできない**上級者向けの方法**となります。
可能な限り簡単に説明はしますが、Linuxの基本中の基本まで解説してたらキリがないので、Linuxの経験が十分ある、もしくは、何かあっても大抵のことは自分で調べられる人、そして、自己責任で構わない人は先へお進みください。

# 1.VirtualBoxのインストール
いくつかのサイトの方法を組み合わせて行いましたがおおむねこちらのサイトと同じ方法です。

https://auroralights.jp/entry/2024/06/08/172908

その後、VirtualBox Guest Additionsという、Windowsと仮想環境内でクリップボードを共有したり、共有フォルダを作ったりできる機能を追加するシステムをインストールします。
以下の記事の「**インストール後の作業**」という項から参照してください。

https://qiita.com/HirMtsd/items/d43fc5215a88cbf414c9#%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E5%BE%8C%E3%81%AE%E4%BD%9C%E6%A5%AD

もしうまくいかない場合は以下の記事の「**VBoxLinuxAdditions.run 実行する上で必要なもの。**」という項が参考になるでしょう。

https://qiita.com/paseri2022/items/b333fa43f48f7e2408e8#vboxlinuxadditionsrun-%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B%E4%B8%8A%E3%81%A7%E5%BF%85%E8%A6%81%E3%81%AA%E3%82%82%E3%81%AE

# 2.前準備
## gitのインストール
コンソール(端末)を起動し、まずgitをインストールしておきます。
パスワードを求められたら入力してください。
```console:Console
sudo apt install git -y
```
## リポジトリの保存フォルダを作成
gitから必要データ(リポジトリ)のクローン(コピー)を保存するためのフォルダを作成します。
特に考えずに保存しているとフォルダで溢れるので整理のために推奨します。
```console:Console
mkdir -p ~/src
```

# 3.Wi-Fiアダプターのドライバーをインストール

## TL-WN725Nの場合
### ドライバーをインストール
gitを使用して以下のドライバーをインストールします。

https://github.com/gglluukk/rtl8188eus

```console:Console
cd ~/src
git clone https://github.com/gglluukk/rtl8188eus.git
cd rtl8188eus
make && sudo make install
```
### 類似ドライバーをブラックリスト登録
ドライバー``rtl8188eus``を使用するために他の類似ドライバーをブラックリストに登録します。
```console:Console
echo 'blacklist r8188eu' | sudo tee -a '/etc/modprobe.d/realtek.conf'
echo 'blacklist rtl8xxxu' | sudo tee -a '/etc/modprobe.d/realtek.conf'
```
### 類似ドライバーの停止と、再起動
先ほどインストールしたドライバー及び類似ドライバーの停止と、このドライバーのみの再起動を行います。
※類似ドライバーが起動していなければERRORが出ますが無視していいです
Ubuntuの再起動でも可
```console:Console
sudo rmmod r8188eu rtl8xxxu 8188eu
sudo modprobe 8188eu
```

## Archer T2U Nanoの場合
以下のドライバーを使用します。
手順もドライバーの説明に書いてある方法を使います。
**Ubuntu以外のLinux**を使用している人はリンク先に細かく説明が書いてあるのでそちらに従ってください。

https://github.com/morrownr/8821au-20210708

### 依存パッケージのインストール
必要なパッケージをインストールします。既にインストール済みのパッケージもあるかもしれませんが、そのまま進めて問題ありません。
```console:Console
sudo apt install -y build-essential dkms git iw
```
### リポジトリのクローン
gitを使用してドライバーのリポジトリをダウンロードし、そのディレクトリに移動します。
```console:Console
cd ~/src
git clone https://github.com/morrownr/8821au-20210708.git
cd 8821au-20210708
```
### gccのバージョンの確認
ドライバーのコンパイルを行う前に、gccの現在のバージョンと、カーネルのコンパイル時のバージョンが一致しているか確認します。
必須ではありませんが、メジャーバージョンが一致していない場合、コンパイルに失敗する可能性があるそうです。

1行目がカーネルのコンパイル時のバージョンを取得するコマンドで、
2行目が現在のバージョンを取得するコマンドです。
```console:Console
cat /proc/version
gcc --version
```

```console:結果
$ cat /proc/version
Linux version 6.8.0-39-generic (buildd@lcy02-amd64-112) (x86_64-linux-gnu-gcc-13 (Ubuntu 13.2.0-23ubuntu4) 13.2.0, GNU ld (GNU Binutils for Ubuntu) 2.42) #39-Ubuntu SMP PREEMPT_DYNAMIC Fri Jul  5 21:49:14 UTC 2024

$ gcc --version
gcc (Ubuntu 13.2.0-23ubuntu4) 13.2.0
Copyright (C) 2023 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
```
この場合はどちらも13.2.0なので問題ありません。

```text:良い例
gcc 12.2 (コンパイル時のバージョン)
gcc 12.1 (現在のバージョン)
```
メジャーバージョンが一致していれば、マイナーバージョンが一致していなくてよいようです。

```text:悪い例
gcc 12.1 (コンパイル時のバージョン)
gcc 10.3 (現在のバージョン)
```
メジャーバージョンが一致していない場合は合わせることが推奨されます。

#### gccのバージョンをそろえる方法(例)
```console:Console
sudo apt install gcc-12
```

### ドライバーインストール
コンソールの現在のディレクトリが``~/src/8821au-2021070``であることを確認してから行ってください。
```console:Console
sudo ./install-driver.sh
```
インストールが完了すると、設定ファイルを今すぐ編集するかどうかを聞かれますが、**No**でいいです。
その後すぐにUbuntuを再起動するかを聞かれますが、こちらも**No**を選択してください。

# 4.MDK4をインストール
依存パッケージと、MDK4パッケージをインストールします。

https://github.com/aircrack-ng/mdk4

```console:Console
sudo apt install pkg-config libnl-3-dev libnl-genl-3-dev libpcap-dev -y
sudo apt install mdk4 -y
```

インストールが完了したら**必ず再起動**をかけてください。

# 5.UbuntuにUSB Wi-Fi アダプターを認識させる
再起動が完了したらUbuntuにアダプターを認識させます。
## TL-WN725Nの場合
仮想環境画面上部のメニューバーから、
``デバイス``→``USB``→``Realtek 802.11n NIC``をクリックして✓を付けます、
これでUbuntuがTL-WN725Nを認識してくれます。

## Archer T2U Nanoの場合
仮想環境画面上部のメニューバーから、
``デバイス``→``USB``→``Realtek 802.11ac WLAN Adapter``をクリックして✓を付けます、
これでUbuntuがArcher T2U Nanoを認識してくれます。

***

以下のようにWi-Fiの項目が現れていればOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3850759/c19c059a-c889-c000-81b8-83130a66f2ba.png)
※メニューバーに表示されるデバイスの表示名は、アダプターによって変わるかもしれません。

# 6.AP作成前の下準備
再度コンソール(端末)を起動し、
先ほど接続したデバイスの名前を調べます。
以下のコマンドを実行し、TL-WN725N/Archer T2U Nanoのものと思われるデバイス名をメモします。
Ubuntu 24.04なら``wlx************``(*はMACアドレス)
Kali Linuxとかなら``wlan0``とかの名前で出てくると思います。
```console:Console
iwconfig
```
```console:結果
lo        no wireless extensions.

enp0s3    no wireless extensions.

wlx************  unassociated  Nickname:"<WIFI@REALTEK>"
          Mode:Auto  Frequency=2.412 GHz  Access Point: Not-Associated   
          Sensitivity:0/0  
          Retry:off   RTS thr:off   Fragment thr:off
          Power Management:off
          Link Quality:0  Signal level:0  Noise level:0
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:0  Invalid misc:0   Missed beacon:0
```
***
BSSID(MACアドレス)とSSIDを指定するファイルの作成します。
以下のコマンドで``/home/(ユーザー名)/APList.lst``が作成されます。
※中身がテキストファイルなら名前も拡張子も何でもいいです。
```console:Console
cd ~
touch APList.lst
```
以下を例に作成したAPList.lstの中身を編集します。
BSSIDは``:``無しや、英字が小文字でも問題ありません。
リストの数も自由です。
一度に出現するキャラの数が10体までなので、多くても10個程度がいいでしょう。
```text:APList.lst
70:77:77:77:77:77 LinuxAP_00
72:77:77:77:77:77 LinuxAP_01
74:77:77:77:77:77 LinuxAP_02
76:77:77:77:77:77 LinuxAP_03
78:77:77:77:77:77 LinuxAP_04
7A:77:77:77:77:77 LinuxAP_05
7C:77:77:77:77:77 LinuxAP_06
7E:77:77:77:77:77 LinuxAP_07
```
上から2桁目に指定できるのは16進数で偶数となる数字のみです。
ユニバーサルアドレスもローカルアドレスも指定可能です。
奇数のAPは存在しないはずなので指定できませんが特に問題はありません。

# 7.MDK4起動
MDK4を以下のコマンドで起動し、偽のアクセスポイントを作成します。
Ctrl + Cで終了できます。
```console:Console
sudo mdk4 (デバイス名) b -w a -h -c 11 -s 80 -v '/home/(ユーザー名)/APList.lst'
```
## 各パラメータ解説
``b``
Beacon Floodingモード
偽のアクセスポイントを作成するモード

``-w <type>``
暗号化設定
n = 暗号化なし, w = WEP, t = TKIP (WPA), a = CCMP (WPA)
複数指定可 例:``-w wta``
暗号化なしだとiPhoneなど、フリーWi-Fiの接続提案のダイアログが出る端末に影響が出るかもしれないので念のため設定します。

``-h``
-cオプションで指定したチャンネル情報に合わせて電波の周波数を合わせます。
AndroidのBSSID確認アプリはこのオプションを付けないと表示されません。
switchはこのオプションが無くてもAPを掴むため、APの正確な確認が不要の場合は外しても構いません。

``-c <channel>``
チャンネル情報を指定値に偽装します。
-hオプションが無いと実際の周波数は変わりません。
11に設定してるのは私の自宅近くのWi-Fiで比較的空いてるチャンネルだったからです。各自で調整してください。

``-s <pps>``
1秒間にビーコンを飛ばす回数
デフォルトは50
リストの数に対して少なすぎると表示されたりされなかったりコロコロ変わってしまいます。
リストの数×10くらいがおすすめです。

``-v <path>``
ファイルの内容からBSSIDとSSIDを指定します。

# 8.APが稼働しているか確認する
WiFi Analyzerを起動してAPのビーコンが受信できるか確認します。
※MDK4のコマンドに-hオプションが付いていない場合、WiFi Analyzerに表示されません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3850759/22fcd7be-e713-82c3-dbd2-a9a5c3556072.png)

# 備考
+ 作成されるAPはダミーです。接続はできません
+ MDK4のログ出力が邪魔な場合はコマンドの末尾に
  `` 1>/dev/null``を追加すれば何も出力されなくなります。ただしAPList.lstにミスがあってエラーが出ても表示されないので注意
+ BSSIDを変更したい場合は、APList.lstを変更して保存すれば即時反映されます