Guide de Fonctionnement Complet
FIRMWARE v2.2Ce projet est destine exclusivement a des fins educatives et de test de securite autorise. L'envoi de trames deauth, la creation de faux points d'acces et la capture de mots de passe sans autorisation sont illegaux dans la plupart des pays. Utilisez ce systeme uniquement sur des reseaux dont vous etes proprietaire ou pour lesquels vous avez une autorisation ecrite.
Le systeme est compose de deux parties qui communiquent via le reseau WiFi local : le Dashboard web (Next.js) et le firmware ESP32 (Arduino).
Next.js 16 • Port 3000 • Votre PC
HTTP API
WiFi LAN
Arduino • AP+STA Mode
L'ESP32 fonctionne en mode AP+STA : il cree un faux point d'acces (Evil Twin) tout en restant connecte au reseau WiFi local pour communiquer avec le Dashboard. Le Dashboard envoie des commandes via une file d'attente HTTP. L'ESP32 interroge cette file toutes les 5 secondes. Les resultats sont envoyes au Dashboard via des requetes POST HTTP.
| Fichier | Role | Taille |
|---|---|---|
esp32_wifi_auditor.ino | Fichier principal - setup/loop/commandes | 9.5 KB |
wifi_scanner.h | Scan des reseaux WiFi | 3.8 KB |
packet_capture.h | Capture promiscuous + PCAP + deauth | 6.2 KB |
captive_portal.h | Portail captif + capture mots de passe | 7.0 KB |
password_verifier.h | Verification contre le vrai reseau + NAT | 4.8 KB |
api_client.h | Communication HTTP avec le Dashboard | 4.5 KB |
La communication repose sur un modele pull : l'ESP32 interroge le Dashboard pour obtenir des commandes, puis envoie les resultats.
POST /api/esp32/heartbeatGET /api/esp32/commandsPOST /api/networks, /frames, /passwordsPATCH /api/esp32/commandsL'ESP32 envoie son statut complet. Si aucun heartbeat pendant 60s, le Dashboard marque l'ESP32 hors ligne.
| Action | Intervalle | Direction |
|---|---|---|
| Heartbeat | 30 secondes | ESP32 → Dashboard |
| Poll de commandes | 5 secondes | ESP32 → Dashboard |
| Stats de capture | 5 secondes | ESP32 → Dashboard |
| Stats de trames | 10 secondes | ESP32 → Dashboard |
| Trames individuelles | Temps reel | ESP32 → Dashboard |
Le firmware est divise en 5 modules independants, chacun dans un fichier .h.
Scanne les reseaux WiFi. Collecte SSID, BSSID, canal, RSSI et type de chiffrement (Open, WEP, WPA, WPA2, WPA3). Utilise WiFi.scanNetworks().
Mode promiscuous pour capturer les trames 802.11. Accumule au format PCAP. Envoie les metadonnees en temps reel. Envoie des trames deauth via esp_wifi_80211_tx().
Cree un faux AP avec page de connexion. Intercepte les DNS, redirige vers le portail, capture les mots de passe. Compatible Android, iOS, Windows.
Teste les mots de passe par connexion reelle au reseau cible. Si correct, configure un bridge NAT AP+STA pour donner au client l'acces Internet.
Classe APIClient pour toutes les communications HTTP : heartbeat, reseaux, captures, mots de passe, activites, trames, resultats de commandes.
| Type | Code | Description |
|---|---|---|
| Beacon | 0x0080 | Trames de diffusion du point d'acces |
| Probe Request | 0x0040 | Demande de recherche de clients |
| Probe Response | 0x0050 | Reponse du point d'acces |
| Authentication | 0x00B0 | Demande d'authentification |
| Deauthentication | 0x00C0 | Deconnexion forcee (deauth) |
| Data | 0x0008 | Donnees utilisateur |
| QoS Data | 0x0088 | Donnees avec qualite de service |
L'ESP32 passe par differents etats en fonction des commandes recues et des evenements.
scancapture_startevil_twin| Etat | LED | Comportement |
|---|---|---|
| IDLE | Off | LED eteinte |
| SCANNING / CAPTURING | Clignotement rapide | 200ms on/off |
| EVIL_TWIN / CAPTIVE_PORTAL | Clignotement lent | 1000ms on/off |
| CONNECTED | Allumee fixe | LED constamment allumee |
L'attaque Evil Twin cree un faux point d'acces avec le meme SSID que le reseau cible.
L'utilisateur clique "Scan". L'ESP32 detecte les reseaux et envoie la liste au Dashboard.
L'utilisateur selectionne un reseau (SSID, BSSID, canal) et lance l'attaque Evil Twin.
L'ESP32 cree un AP avec le meme SSID : WiFi.softAP(ssid, "", channel). DNS intercepte tout.
Optionnel : trames deauth broadcast via esp_wifi_80211_tx() pour deconnecter les clients du vrai AP.
Le client est redirige vers le portail captif. Son navigateur affiche une page de connexion.
Le client entre son mot de passe. L'ESP32 le teste immediatement contre le vrai reseau.
Le portail captif intercepte les clients et capture les mots de passe en les verifiant en temps reel contre le vrai reseau.
http://192.168.4.1/WiFi.begin(ssid, password) sur le vrai reseauWL_CONNECTED : le mot de passe est correct !WL_CONNECT_FAILED ou WL_WRONG_PASSWORD : incorrect
Si le mot de passe est verifie, l'ESP32 configure un bridge : mode WIFI_AP_STA (connecte au vrai reseau + faux AP actif).
Le client obtient l'acces Internet via le NAT de l'ESP32. IP du faux AP : 192.168.4.1.
L'ESP32 agit comme routeur entre le client et le vrai reseau.
| OS | Endpoint | Redirection |
|---|---|---|
| Android | /generate_204 | 302 vers le portail |
| iOS | /hotspot-detect.html | 302 vers le portail |
| Windows | /ncsi.txt | 302 vers le portail |
| Windows | /fwlink | 302 vers le portail |
Le module de capture enregistre les trames WiFi brutes au format PCAP standard, analysable avec Wireshark.
esp_wifi_set_channel() - Definit le canal d'ecouteesp_wifi_set_promiscuous(true) - Active le mode moniteuresp_wifi_set_promiscuous_rx_cb() - Enregistre le callbackesp_wifi_set_promiscuous_filter() - Filtre MGMT + DATA + CTRLIRAM_ATTROptimisation : Seules les trames non-beacon sont envoyees en temps reel. Les trames Beacon (10/sec/AP) sont filtrees : 1 sur 10 seulement. Toutes les trames deauth, auth, probe, data sont envoyees.
Tous les echanges entre l'ESP32 et le Dashboard passent par l'API HTTP.
| Methode | Endpoint | Description |
|---|---|---|
| POST | /api/esp32/heartbeat | Heartbeat + statut complet |
| GET | /api/esp32/commands | Commandes en attente |
| PATCH | /api/esp32/commands | Resultat d'une commande |
| POST | /api/esp32/frames | Metadonnees de trames |
| POST | /api/networks | Reseaux decouverts |
| POST | /api/passwords | Mots de passe verifies |
| POST | /api/activity | Logs d'activite |
| Commande | Parametres | Effet |
|---|---|---|
scan | - | Lance un scan WiFi |
capture_start | channel, captureId | Demarre la capture PCAP |
capture_stop | - | Arrete la capture |
evil_twin | ssid, bssid, channel | Lance l'Evil Twin + Portail |
deauth | bssid, channel | Envoie des trames deauth |
captive_portal | ssid, channel | Active le portail captif |
stop_attack | - | Arrete l'attaque |
verify_password | password, ssid | Teste un mot de passe |
set_channel | channel | Change le canal de capture |
restart | - | Redemarre l'ESP32 |
Suivez ces etapes pour installer et configurer le systeme complet.
| Parametre | Valeur |
|---|---|
| Board | ESP32 Dev Module |
| Upload Speed | 115200 |
| Flash Frequency | 80MHz |
| Flash Mode | QIO |
| Partition Scheme | Default 4MB with spiffs |
L'ESP32 et le PC doivent etre sur le meme reseau WiFi local. Verifiez que le Dashboard
est accessible depuis un autre appareil : http://IP_DU_PC:3000
| Commande | Description | Exemple |
|---|---|---|
scan | Scanner les reseaux WiFi | scan |
capture <channel> | Demarrer capture sur un canal | capture 6 |
stop | Arreter la capture | stop |
evil_twin <ssid> <ch> | Lancer l'Evil Twin | evil_twin MonWiFi 6 |
status | Afficher le statut actuel | status |
Ajoutez #include <esp_wifi.h> au debut du fichier .ino. Necessaire pour les fonctions ESP-IDF de bas niveau.
N'existe pas dans ESP32 Arduino Core 2.x. Le firmware v2.2 inclut un #ifndef WL_WRONG_PASSWORD / #define WL_WRONG_PASSWORD 7 pour la compatibilite.
Verifiez DASHBOARD_IP (IP de votre PC). Verifiez que le Dashboard est lance. Testez avec curl http://IP:3000/api/status.
Certaines versions ESP-IDF requierent de desactiver PMF (Protected Management Frames) dans menuconfig. Sur les AP modernes avec PMF, le deauth peut etre ignore.
Le NAT depend de IP_FORWARD=1 dans lwIP. Recompilez avec make menuconfig et activez IP forwarding.
| Carte | Scan | Capture | Evil Twin | Deauth |
|---|---|---|---|---|
| ESP32 (original) | Oui | Oui | Oui | Oui |
| ESP32-S2 | Oui | Oui | Oui | Partiel |
| ESP32-S3 | Oui | Oui | Oui | Partiel |
| ESP32-C3 | Oui | Oui | Oui | Non |