Utilizziamo il nostro piccolo ESP32 come un potente strumento di networking, trasformandolo in un grazioso scanner tascabile per reti wi-fi.
Una delle principali caratteristiche della polimorfica board ESP32, è la capacità di collegarsi in rete wireless senza difficoltà, o addirittura creare access point per computer terzi. Contrariamente ad Arduino, infatti, questa scheda possiede un chip predisposto per la connessione in rete, ed ha potenza e memoria sufficiente per gestirla a dovere.
Ma le sue minuscole dimensioni lo portano anche ad essere montato su minuscoli PCB, magari con un piccolo display OLED da un pollice. Le caratteristiche di low-power gli consentono di essere facilmente pilotato da una piccola batteria, e nascosto all’interno di un contenitore stampato in 3D. In questa configurazione il nostro ESP32 potrebbe funzionare non già come un client di rete, bensì come uno sniffer in grado di indicarci al volo quali reti wireless siano presenti in un dato momento, e quante siano aperte…
Il setup
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#include "WiFi.h" void setup() { Serial.begin(115200); // Set WiFi to station mode and disconnect from an AP if it was previously connected WiFi.mode(WIFI_STA); WiFi.disconnect(); delay(100); Serial.println("Setup done"); } |
La sezione di setup del programma è semplicissima: si include la libreria per la connessione, quindi si inizializza il monitor seriale, si attiva il sistema ricetrasmittente in modalità station, ci si disconnette da un (eventuale) access point presente nei paraggi, e si stampa un messaggio di successo sul monitor seriale.
Siamo pronti ad esegiuire la nostra scansione.
Il loop
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
void loop() { Serial.println("scan start"); // WiFi.scanNetworks will return the number of networks found int n = WiFi.scanNetworks(); Serial.println("scan done"); if (n == 0) { Serial.println("no networks found"); } else { Serial.print(n); Serial.println(" networks found"); for (int i = 0; i < n; ++i) { // Print SSID and RSSI for each network found Serial.print(i + 1); Serial.print(": "); Serial.print(WiFi.SSID(i)); Serial.print(" ("); Serial.print(WiFi.RSSI(i)); Serial.print(")"); Serial.println((WiFi.encryptionType(i) == WIFI_AUTH_OPEN)?" ":"*"); delay(10); } } Serial.println(""); // Wait a bit before scanning again delay(5000); } |
Iniziamo la scansione annunciandoci con un messaggio sulla console.
il metodo .scanNetworks() riporta il numero di reti rintracciate dal nostro apparato.
Se non troviamo reti nei dintorni scriviamo un messaggio di alert sulla console, in caso contrario, stampiamo un numero sequenziale collegato alla rete, l’SSID, l’RSSI e, se presente, l’indicazione di rete cifrata. Volendo, si potrebbe anche estrapolare il canale di trasmissione WiFi, la stringa PSK, il MAC… Si tratta di informazioni previste dalla libreria utilizzata, ma non inserite (per ragioni di sicurezza) all’interno dell’esempio.
Considerazioni finali
E voila, il progetto è servito. Potremo renderlo indipendente dal monitor seriale utilizzando un piccolo display, o scrivere il nostro programma di “ricerca ed ascolto” non appena trovata la rete accessibile. Con poche righe di codice diventa possibile creare un software MITM (man in the middle) da portare in tasca, in grado di reindirizzare automaticamente i pacchetti, o fingersi qualcun altro, senza nemmeno dover aprire un PC portatile.
Con buona pace dei telefilm americani…
Join our groups on Telegram…