
ESP32-Firmware, die PROBE REQUEST-Pakete von Smartphones abfängt, die nach einer Wi-Fi-Verbindung suchen, um verschiedene Arten von Informationen zu extrahieren
Dieses Projekt verwendet das Espressif IoT Development Framework (ESP-IDF) und wurde auf dem ESP-WROOM-32-Modul und mit esp-idf v3.2 getestet.
Eine Übersicht über das gesamte Projekt (d. h. ESP32-Firmware, Server und GUI) findet sich hier.
Diese Firmware wurde mit dem Zweck geschrieben, Probe-Request-Pakete zu sniffen, die von Smartphones gesendet werden, die nach einer Wi-Fi-Verbindung suchen. Wenn die Wi-Fi-Verbindung auf einem Smartphone aktiv ist, sendet es per Broadcast (auf allen Kanalfrequenzen) eine Probe-Request-Nachricht, in der es fragt, ob freie Wi-Fi-Netze oder bekannte Netze vorhanden sind (d. h. das Smartphone kennt das Passwort für dieses Wi-Fi). Der ESP32 sniffet diese Nachricht und extrahiert verschiedene Arten von Informationen.
Die folgenden Informationen werden aus jedem gesnifften Paket entnommen:
Nach jeder Minute werden diese Informationen an einen Server gesendet und verarbeitet. Schließlich ist es möglich, die verarbeiteten Informationen (Echtzeit-Standort des Smartphones, Smartphone-Frequenz usw.) über eine GUI anzuzeigen.
Die Firmware besteht aus zwei Haupt-Threads/Tasks:
Sniffer Task
Wi-Fi Task
lock wird verwendet, um den kritischen Abschnitt für I/O-Operationen in der Datei zu verwalten.Der ESP32 ist im Modus WIFI_MODE_APSTA konfiguriert: d. h. er erstellt einen "soft-AP and station control block" und startet "soft-AP and station". Dadurch ist der ESP32 in der Lage, gleichzeitig zu sniffen und Informationen an den Server zu senden, ohne dass beim Senden von Daten Paketinformationen verloren gehen.
Hier ist die vollständige Liste der Informationsfelder, die in einem Probe Request enthalten sein können (Quelle IEEE 802.11-2012):

Und hier unten ein mit Wireshark gesnifftes Paket, in dem Sie für jedes Feld die Anzahl der Bits und ihre Position innerhalb des Pakets sehen können:

Dieser Abschnitt ist möglicherweise veraltet; besuchen Sie die offizielle Website für weitere Informationen und die neueste Anleitung für den Einstieg in ESP-IDF.
Toolchain einrichten
ESP-IDF herunterladen
Neben der Toolchain (die Programme zum Kompilieren und Erstellen der Anwendung enthält) benötigen Sie außerdem ESP32-spezifische APIs / Bibliotheken.
cd ~/esp
git clone --recursive https://github.com/espressif/esp-idf.git
Zur Version v3.x wechseln
cd esp-idf
git checkout release/v3.2
Pfad zu ESP-IDF einrichten
Die Toolchain-Programme greifen über die Umgebungsvariable IDF_PATH auf ESP-IDF zu.
Diese Variable sollte auf Ihrem PC gesetzt sein, andernfalls werden Projekte nicht gebaut.
Die erforderlichen Python-Pakete installieren
python -m pip install --user -r $IDF_PATH/requirements.txt
Stellen Sie sicher, dass Sie den Pfad exportiert haben
export IDF_PATH=~/esp/esp-idf
export PATH=$PATH:$HOME/esp/xtensa-esp32-elf/bin
Das Repository klonen
git clone https://github.com/ETS-PoliTO/esp32-sniffer.git
cd esp32-sniffer
Eine serielle Verbindung zwischen ESP32 und Ihrem PC herstellen
make menuconfig
Gehen Sie zu Serial flasher config, dann zu Default serial port und legen Sie den Port fest, an dem der ESP32 angeschlossen ist
Beachten Sie, dass Sie wahrscheinlich einen Treiber herunterladen müssen, wenn Sie einen Bridge-Adapter verwenden:
Dies bietet eine Anleitung, wie Sie eine serielle Verbindung zwischen ESP32 und PC herstellen.
Code bauen und den ESP32 flashen
make all && make flash
Logs anzeigen
make monitor
Die Datei /main/Kconfig.projbuild enthält zwei verschiedene Menüs:
SPIFFS (SPI Flash File System)
Es enthält einige wichtige Informationen über die SPIFFS-Partition:
SPIFFS ist ein Dateisystem, das Wear Leveling, Konsistenzprüfungen des Dateisystems und mehr unterstützt.
Konfigurationen
Es enthält verschiedene Variablen:
ESP32_ID: ID des ESP32WIFI_SSID: SSID des WiFi (Netzwerkname)WIFI_PASS: WiFi-Passwort (WPA oder WPA2)BROKER_ADDR: IP des MQTT-BrokersBROKER_PSW: Passwort des MQTT-BrokersBROKER_PORT: Port des MQTT-BrokersCHANNEL: Kanal, auf dem der ESP32 PROBE REQUEST sniffen wirdSNIFFING_TIME: Dauer des SniffingsUm die oben genannten Variablen zu konfigurieren: