
Tra le caratteristiche più interessanti della scheda ESPertino rientra sicuramente la connettività, che permette alla board di collegarsi a una rete internet e operare come nodo IoT avanzato. L'interfaccia di rete wireless integrata nel modulo ESP32 può inoltre essere programmata in modalità promiscua, consentendo di realizzare un semplice ma versatile sniffer di pacchetti WiFi. Scopriamo in questo articolo in cosa consiste questa funzionalità e come sfruttarla su ESPertino utilizzando uno sketch in ambiente Arduino.
Introduzione
"Sniffare" una rete WiFi significa catturare, monitorare e analizzare (sia in tempo reale che in un secondo tempo, analizzando i log registrati) i pacchetti Ethernet scambiati dai dispositivi posti nelle immediate vicinanze. Realizzare uno sniffer WiFi non è così difficile: se si dispone di un PC dotato di interfaccia di rete wireless, è sufficiente installare un programma come Wireshark (probabilmente il più famoso packet sniffer e analizzatore di rete), che integra tutte le funzionalità sopra menzionate. In ambiente Linux, ma anche sui dispositivi mobile con sistema operativo Android e iOS, esistono inoltre diverse applicazioni in grado di "sniffare" i pacchetti WiFi. In questo articolo ci focalizzeremo tuttavia sul mondo embedded, dimostrando come anche una piccola ma prestante scheda come ESPertino sia in grado operare come sniffer WiFi.
L'utilizzo di uno sniffer WiFi comporta diversi vantaggi, tra cui ricordiamo:
- analisi del segnale fisico della rete, in particolare la sua intensità, identificata dal valore del parametro RSSI (acronimo di Received Signal Strength Indicator). Ciò consente di rilevare come il segnale si distribuisce negli ambienti e determinare se si renda necessaria l'installazione di un repeater per rafforzarne l'intensità;
- protezione della rete: il monitoraggio dei pacchetti permette l'individuazione precoce di possibili tentativi di attacco, operando in incognito senza disturbare il traffico presente in rete. Permette inoltre di testare la vulnerabilità del sistema, simulando attacchi e aiutando a individuare eventuali falle (ad esempio password deboli);
- analisi delle performance: esaminando i pacchetti si possno ricavare informazioni statistiche e prestazionali (tipo e frequenza dei pacchetti scambiati) utili all'amministratore della rete (permette ad esempio di individuare se un utente sta scaricando da internet grandi volumi di dati).
La modalità promiscua
Si tratta di un modo operativo, supportato solitamente da tutte le schede di rete wireless o cablate, che permette di monitorare i pacchetti che transitano sulla rete rendendoli disponibili al processore (o microcontrollore nel nostro caso) per la conseguente memorizzazione ed analisi. Quando opera in modalità promiscua, l'interfaccia di rete non interpreta i pacchetti (come avviene normalmente, a supporto del protocollo di rete IEEE 802.11), ma si limita a catturarli e inoltrarli alla CPU. Nel caso di una rete WiFi, la modalità promiscua presenta inoltre il vantaggio di non richiedere alcuna autenticazione alla rete WiFi: una volta programmata, l'interfaccia cattura i pacchetti in modo non invasivo.
Lo sketch Arduino
Lo sketch che vi proponiamo per impratichirsi conl'"arte" dello sniffing è la rielaborazione, in ambiente IDE Arduino, di un progetto sviluppato da Lukasz Podkalicki. Il progetto originale, sviluppato con l'sdk ESP-IDF, è stato adattato e modificato sino a diventare uno sketch compilabile ed eseguibile sulla scheda ESPertino. Occorrerà ovviamente avere preventivamente installato l'IDE Arduino per ESPertino. Il programma, nato esclusivamente per scopi sperimentali, ha lo scopo di mostrare come si possa creare un semplice sniffer di pacchetti per reti WiFi sfruttando la modalità promiscua offerta dalla scheda di rete. Tutti i pacchetti aderenti allo standard IEEE 802.11 possono pertanto essere catturati, con visualizzazione su seriale del contenuto del frame MAC 802.11. La versione di sketch proposta si limita a visualizzare alcune informazioni di base come tipo di pacchetto (management, control, data, ecc.), il canale, il valore di RSSI e i primi tre mac address del frame (quelli più significativi, corrispondenti a indirizzo destinatario, indirizzo mittente e indirizzo filtering). In Figura 1 è mostrata la struttura del pacchetto promiscuo, con evidenziati i nomi delle strutture dati (tipi) utilizzati nello sketch.
In Figura 2 è invece mostrato l'output su seriale prodotto dallo sniffer (parte del contenuto è stato occultato per ragioni di privacy). Si noti come la versione attuale di sketch filtri solo i pacchetti di tipo management (ignorando gli altri).
Se si vogliono catturare pacchetti di altro tipo, basta modificare le linee di codice 76-77 all'interno della funzione wifi_sniffer_packet_handler, il cuore vero e proprio dell'applicazione, selezionando solo pacchetti di un certo tipo (o al limite tutti i pacchetti).
...
void wifi_sniffer_packet_handler(void* buff, wifi_promiscuous_pkt_type_t type)
{
if (type != WIFI_PKT_MGMT)
return;
...
Con questo termina questa presentazione dell'applicazione sniffer WiFi per ESPertino, che vuole essere il punto di partenza per applicazioni più significative rivolte ai maker, agli sperimentatori e agli appassionati di networking e sicurezza informatica.

ciao Stefano, sto provando per curiosità a “sniffare” le reti wifi che ho intorno casa mia…(io non ho wifi in casa, però a quanto pare qualche mio vicino di casa si!!)
abilitando il wifi del mio portatile ne rileva ben 2,entrambe con 2 tacchette di segnale, sembrano pure “aperte”, ma sinceramente non ho nemmeno provato a connettermici che non m’interessa :-).
con Espertino, utilizzando il tuo sketch, dal monitor seriale vedo una serie di righe ma…. io non ho idea di come “decifrarle” per capirci qualcosa….vorrei per prima cosa capire l’intensità dei segnali wifi che mi entrano in casa … mi aiuti a capirci qualcosa? provo a inserire qui qualche riga, naturalmente con qualche xxx per la privacy.
PACKET TYPE=MGMT, CHAN=06, RSSI=-94, ADDR1=ff:xx:xx:xx:xx:xx, ADDR2=xx:35:xx:xx:fxxe0, ADDR3=90:xx:xx:xx:ff:e0
PACKET TYPE=MGMT, CHAN=06, RSSI=-95, ADDR1= ff:xx:xx:xx:xx:xx, ADDR2= xx:35:xx:xx:fxxe0, ADDR3=90:xx:xx:xx:ff:e0
PACKET TYPE=MGMT, CHAN=06, RSSI=-95, ADDR1= ff:xx:xx:xx:xx:xx, ADDR2= xx:35:xx:xx:fxxe0, ADDR3=90:xx:xx:xx:ff:e0
PACKET TYPE=MGMT, CHAN=06, RSSI=-93, ADDR1= ff:xx:xx:xx:xx:xx, ADDR2= xx:35:xx:xx:fxxe0, ADDR3=90:xx:xx:xx:ff:e0
PACKET TYPE=MGMT, CHAN=06, RSSI=-92, ADDR1= ff:xx:xx:xx:xx:xx, ADDR2= xx:35:xx:xx:fxxe0, ADDR3=90:xx:xx:xx:ff:e0
PACKET TYPE=MGMT, CHAN=06, RSSI=-94, ADDR1= ff:xx:xx:xx:xx:xx, ADDR2= xx:35:xx:xx:fxxe0, ADDR3=90:xx:xx:xx:ff:e0
grazie per l’aiuto! e ciao!
poi vorrei anche capire come riuscire a distinguere (se possibile dalle righe del monitor seriale) se vi è una o + di una rete wifi che arriva fino all’antenna di Espertino…
Ciao Doc77, anzitutto occorre capire cosa ti serve: uno sniffer WiFi oppure uno scanner WiFi? Lo scanner WiFi è un’applicazione che rileva la presenza di reti WiFi e mostra un rapporto con alcune informazioni relative alle stesse. Per questa applicazione ti posso suggerire l’ottimo esempio presente nel plugin ufficiale Arduino Core per ESP32 (e quindi anche per ESPertino): https://github.com/espressif/arduino-esp32/blob/master/libraries/WiFi/examples/WiFiScan/WiFiScan.ino
Lo sketch visualizza, per ogni rete WiFi, il nome (l’SSID), il livello del segnale (RSSI) e se è protetta o meno (aggiunge un ‘*’ al nome se è protetta). RSSI è l’acronimo di receive signal strength indicator ed è espresso in dB. Dato l’RSSI si puo’ ricavare la qualità del segnale con la formula approssimativa:
Q = (100 + RSSI) * 2
Quindi se hai un RSSI=-70 dB, avrai Q=60 chje significa qualità del 60% (discreta). La qualità migliore si ha con RSSI vicini a -50 dB, quella peggiore con RSSI vicini a -100 dB
Se invece sei interessato a un approfondimento sullo sniffer, puoi rispondere con un commento mostrando il tuo interesse verso l’argomento così che possa proporlo per un articolo dettagliato (questo era solo un “assaggio”, limitato nello spazio disponibile).
in primis grazie per la risposta!
beh, sono abbastanza “niubbo” in questo genere di cose (come in molte altre), “pur” essendo un “telecomunicazionista” (che non ha mai praticato e fatto esperienza sul VERO campo…purtroppo 🙁 )
la mia è solo semplice curiosità…ho provato il tuo programmino per vedere cosa rileva Espertino nella mia stanza..solo che non ho idea di come interpretare tutta quella sequenza di righe che escono nel monitor seriale dopo l’avvio di Espertino come sniffer…
comunque volevo anche vedere da quanti segnali wifi sono “attraversato” inconsapevolmente nella mia casa, e l’intensità dei segnali degli stessi, se può essere troppo elevata o se è nella norma di sicurezza (non si sa mai la gente che esperimenti fa in casa propria con antenne/amplificatori di dubbia provenienza…).
purtroppo so che non posso far nulla per evitare l’esposizione a questi segnali…che non dipendono da me ma dai vicini…però almeno con questi semplici sketch di Arduino/Espertino posso ogni tanto provare a “vedere” cosa mi entra in casa…
al di là di questo, si mi piacerebbe un buon approfondimento su questi argomenti! attendo quindi un tuo nuovo articolo esaustivo ! ciao
Salve,
approfitto dell’esperienza dei ‘colleghi’ per chiedere se con la scheda Espertino si può realizzare un controllo diretto da PC . Ovvero è possibile caricare su Espertino un firmware simil Firmata . Quello per Arduino uno non è compatibile . Grazie !
Ciao alby, per ora non esiste ancora il supporto al modulo ESP32 in Firmata. Esiste ad oggi il supporto per il modulo ESP8266 ma non so se funziona correttamente anche su ESP32.
Ciao Stefano,
in passato ho letto che forse era possibile effettuare il porting per poter utilizzare ESPertino con altri micro diversi dall’atmel arduino. In rete non ho però trovato nulla , forse perchè la scheda non è così supportata come la Arduino. Ho provato allora ad adattare i file che dovrebbero funzionare con la ESP8266 ma in fase di compilazione ad un certo punto si blocca . Ho modificato il file boards.h ma sebbene i pin della seriale sono gli stessi ovvero l’ 1 e il 3 gli altri non so come modificarli. C’è anche da dire che il micro Espressif non accetta il comando analogWrite di Arduino …. altra incompatibilità 🙁
Ciao alby, tutto quello che hai detto è già stato scritto, mi riferisco a quest issue che è stata aperta su GitHub, modifiche da apportare a Firmata per ESP32:
https://github.com/firmata/arduino/issues/315
Sembrerebbe che ci siano poche risorse umane disposte ad apportare le modifiche richieste per supportare il modulo ESP32. Inoltre come dici tu la analogWrite non è ancora stata implementata in Arduino Core ESP32 e comunque va aggiunto tutto il Bluetooth. Speriamo che si trovi qualcuno disposto a eseguire le modifiche e testarle.
Ciao Stefano
complimenti per l’articolo è molto interessante, sicuramente è da provare.
Mi sono sempre chiesto se fosse possibile fare un analisi simile anche su trasmissione dati 3g/4g , magari adattando il modulo ESP32 ?
Salve Michele, il modulo ESP32 include sia un’interfaccia di rete WiFi che una Bluetooth (BLE 4.0). L’interfaccia di rete wireless può essere configurata per sniffare traffico (pacchetti) Ethernet. Per accedere alla rete cellulare occorrerebbe un apposito modulo (modem radio GSM/LTE) da interfacciare con la board (cosa tecnicamente possibile). Il problema è che le comunicazioni tra cellulare e rete operatore sono codificate e quindi incomprensibili all’esterno. Una volta instaurata la connessione di rete mobile è praticamente impossibile decodificare il segnale.
grazie per la risposta, si lo so che sono codificate, e questa cosa “tecnicamente possibile” è interessante, proverò,,, Grazie ancora
PS: il modulo radio può dunque servire solo per accedere alla rete, utilizzando una propria sim di un operatore, non per sniffare il traffico