
Micrologiciel ESP32 qui renifle les paquets PROBE REQUEST envoyés par les smartphones à la recherche d'une connexion Wi-Fi afin d'extraire différents types d'informations
Ce projet utilise Espressif IoT Development Framework (ESP-IDF) et a été testé sur le module ESP-WROOM-32 et esp-idf v3.2.
Une vue d'ensemble du projet complet (c'est-à-dire le firmware ESP32, le serveur et l'interface graphique) est disponible ici.
Ce firmware est écrit dans le but de sniffer les paquets Probe Request envoyés par les smartphones qui recherchent une connexion Wi-Fi. Lorsque la connexion Wi-Fi est active sur un smartphone, celui-ci envoie en diffusion (sur toutes les fréquences de canaux) un message probe request demandant s'il existe des Wi-Fi libres ou des Wi-Fi connus (c'est-à-dire ceux pour lesquels le smartphone connaît le mot de passe). L'ESP32 les sniffe et en extrait différents types d'informations.
Les informations suivantes sont extraites de chaque paquet sniffé :
Toutes les minutes, ces informations sont envoyées à un serveur et traitées. Enfin, il est possible de consulter les informations traitées (localisation en temps réel des smartphones, fréquence des smartphones, etc.) via une interface graphique.
Le firmware se compose de deux threads/tâches principaux :
Tâche Sniffer
Tâche Wi-Fi
lock est utilisé afin de gérer la section critique pour les opérations d'E/S dans le fichier.L'ESP32 est configuré en mode WIFI_MODE_APSTA : c'est-à-dire qu'il crée le "soft-AP and station control block" et démarre le "soft-AP and station". Grâce à cela, l'ESP32 est capable de sniffer et d'envoyer des informations au serveur en même temps, évitant ainsi de perdre les informations des paquets pendant l'envoi des données.
Voici la liste complète des champs d'information pouvant figurer dans une Probe Request (source IEEE 802.11-2012) :

Et ci-dessous un paquet sniffé avec Wireshark dans lequel vous pouvez voir, pour chaque champ, le nombre de bits et leur position au sein du paquet :

Cette section peut être obsolète, consultez le site officiel pour plus d'informations et pour le guide le plus récent sur la façon de démarrer avec ESP-IDF.
Configuration de la chaîne d'outils (Toolchain)
Obtenir ESP-IDF
En plus de la chaîne d'outils (qui contient les programmes pour compiler et construire l'application), vous avez également besoin des API / bibliothèques spécifiques à l'ESP32.
cd ~/esp
git clone --recursive https://github.com/espressif/esp-idf.git
Basculer vers la version v3.x
cd esp-idf
git checkout release/v3.2
Configurer le chemin vers ESP-IDF
Les programmes de la chaîne d'outils accèdent à ESP-IDF via la variable d'environnement IDF_PATH.
Cette variable doit être configurée sur votre PC, sinon les projets ne se compileront pas.
Installer les packages Python requis
python -m pip install --user -r $IDF_PATH/requirements.txt
Assurez-vous d'avoir exporté le chemin
export IDF_PATH=~/esp/esp-idf
export PATH=$PATH:$HOME/esp/xtensa-esp32-elf/bin
Cloner le dépôt
git clone https://github.com/ETS-PoliTO/esp32-sniffer.git
cd esp32-sniffer
Établir une connexion série entre l'ESP32 et votre PC
make menuconfig
Allez dans Serial flasher config, puis Default serial port et définissez le port sur lequel l'ESP32 est connecté
Notez que, si vous utilisez un pont, vous devrez probablement télécharger un pilote :
Ceci fournit un guide sur la façon d'établir une connexion série entre l'ESP32 et le PC.
Compiler le code et flasher l'ESP32
make all && make flash
Consulter les journaux
make monitor
Le fichier /main/Kconfig.projbuild contient deux menus différents :
SPIFFS (SPI Flash File System)
Il contient des informations importantes sur la partition SPIFFS :
SPIFFS est un système de fichiers qui prend en charge l'usure uniforme (wear leveling), les vérifications de cohérence du système de fichiers, et plus encore.
Configurations
Il contient différentes variables :
ESP32_ID : ID de l'ESP32WIFI_SSID : SSID du WiFi (nom du réseau)WIFI_PASS : mot de passe WiFi (WPA ou WPA2)BROKER_ADDR : IP du broker MQTTBROKER_PSW : mot de passe du broker MQTTBROKER_PORT : port du broker MQTTCHANNEL : canal sur lequel l'ESP32 sniffra les PROBE REQUESTSNIFFING_TIME : durée du sniffing