Abbonati ora!

Sniffare una rete WiFi con ESPertino

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.

Figura 1: struttura del pacchetto WiFi promiscuo

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).

Figura 2: output di una sessione di sniffing WiFi

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.

 

Download Codice

 

8 Commenti

  1. Doc77 Doc77 11 aprile 2018
  2. Doc77 Doc77 11 aprile 2018
    • Stefano Lovati Stefano Lovati 11 aprile 2018
  3. Doc77 Doc77 12 aprile 2018
  4. alby 14 aprile 2018
  5. Stefano Lovati Stefano Lovati 15 aprile 2018
    • alby 16 aprile 2018
      • Stefano Lovati Stefano Lovati 16 aprile 2018

Scrivi un commento

EOS-Academy