
Wi-Fi接続を探してスマートフォンが送信するPROBE REQUESTパケットをスニッフィングし、さまざまな種類の情報を抽出するESP32ファームウェア
このプロジェクトは Espressif IoT Development Framework (ESP-IDF) を使用しており、ESP-WROOM-32 モジュールおよび esp-idf v3.2 でテストされています。
プロジェクト全体(ESP32 ファームウェア、サーバー、GUI)の概要はこちらで確認できます。
このファームウェアは、Wi-Fi 接続を探しているスマートフォンが送信する Probe Request パケットをスニッフィングする目的で書かれています。スマートフォンで Wi-Fi 接続が有効になっていると、ブロードキャスト(すべてのチャネル周波数)でプローブリクエストメッセージを送信し、利用可能な Wi-Fi や既知の Wi-Fi(スマートフォンがその Wi-Fi のパスワードを知っている場合など)があるかどうかを問い合わせます。ESP32 はこれをスニッフィングし、さまざまな種類の情報を抽出します。
スニッフィングされた各パケットから以下の情報が取得されます:
1 分ごとに、これらの情報はサーバーに送信され、処理されます。最後に、処理された情報(スマートフォンのリアルタイム位置、スマートフォンの周波数など)を GUI を通じて確認できます。
ファームウェアは 2 つの主要なスレッド/タスクで構成されています:
Sniffer タスク
Wi-Fi タスク
lock が使用されます。ESP32 は WIFI_MODE_APSTA モードに設定されています。つまり、"soft-AP and station control block" を作成し、"soft-AP and station" を起動します。これにより、ESP32 はデータ送信中にパケット情報を失うことなく、スニッフィングとサーバーへの情報送信を同時に行うことができます。
以下は、Probe Request に含まれる可能性のある情報フィールドの完全なリストです(出典 IEEE 802.11-2012):

そして以下は、Wireshark でスニッフィングされたパケットで、各フィールドのビット数とパケット内での位置を確認できます:

このセクションは古くなっている可能性があります。詳細および ESP-IDF を始めるための最新ガイドについては、公式サイトを確認してください。
ツールチェーンのセットアップ
ESP-IDF を取得する
アプリケーションをコンパイル・ビルドするためのプログラムを含むツールチェーンに加えて、ESP32 固有の API / ライブラリも必要です。
cd ~/esp
git clone --recursive https://github.com/espressif/esp-idf.git
バージョン v3.x にチェックアウトする
cd esp-idf
git checkout release/v3.2
ESP-IDF へのパスを設定する
ツールチェーンのプログラムは、IDF_PATH 環境変数を使用して ESP-IDF にアクセスします。
この変数はお使いの PC 上で設定する必要があり、設定しないとプロジェクトはビルドできません。
必要な Python パッケージをインストールする
python -m pip install --user -r $IDF_PATH/requirements.txt
パスをエクスポートしたことを確認する
export IDF_PATH=~/esp/esp-idf
export PATH=$PATH:$HOME/esp/xtensa-esp32-elf/bin
リポジトリをクローンする
git clone https://github.com/ETS-PoliTO/esp32-sniffer.git
cd esp32-sniffer
ESP32 と PC の間にシリアル接続を確立する
make menuconfig
Serial flasher config に移動し、次に Default serial port に移動して、ESP32 が接続されているポートを設定します
ブリッジを使用している場合は、おそらくいくつかのドライバをダウンロードする必要があることに注意してください:
こちらに、ESP32 と PC の間にシリアル接続を確立する方法のガイドがあります。
コードをビルドして ESP32 に書き込む
make all && make flash
ログを確認する
make monitor
ファイル /main/Kconfig.projbuild には 2 つの異なるメニューが含まれています:
SPIFFS (SPI Flash File System)
SPIFFS パーティションに関するいくつかの重要な情報が含まれています:
SPIFFS は、ウェアレベリング、ファイルシステム整合性チェックなどをサポートするファイルシステムです。
設定
さまざまな変数が含まれています:
ESP32_ID: ESP32 の IDWIFI_SSID: WiFi の SSID (ネットワーク名)WIFI_PASS: WiFi パスワード (WPA または WPA2)BROKER_ADDR: MQTT ブローカーの IPBROKER_PSW: MQTT ブローカーのパスワードBROKER_PORT: MQTT ブローカーのポートCHANNEL: ESP32 が PROBE REQUEST をスニッフィングするチャネルSNIFFING_TIME: スニッフィングの時間上記の変数を設定するには:
プロジェクトフォルダ内でターミナルを開き、次を実行します
make menuconfig
変更したいメニューを選択します
変数を好きなように編集します
異なる変数を持つ異なるメニューを追加することもできます:
Kconfig.projbuild を開きます
新しいメニューを開始します
menu YOUR_MENU_NAME
必要な変数を追加します
メニューを終了します
endmenu
SPIFFS
パーティションテーブルを作成する必要があります。
ESP32 MQTT
ESP32 MQTT ライブラリが使用されています。
MD5
一意の識別子を取得するために、スニッフィングされたパケットに使用されるハッシュ関数。
ESP32 がどのように動作するかを確認するには、このデモ 動画 もご覧ください。
教訓による道は長く、模範による道は短くて効果的である