Giocare con Wifi su ESP32

Giocare con Wifi su ESP32

Ciò che mi ha dato l'idea di creare uno strumento tascabile per analizzare le reti WiFi è stato questo articolo.

Grazie a loro per l'idea. Non avevo niente da fare.

Tutto il lavoro è stato svolto come parte di un hobby con lo scopo di divertirmi e ampliare le mie conoscenze nel campo delle tecnologie di rete. Lentamente, 1..4 ore a settimana, dall'inizio di quest'anno.
Non ho previsto alcun utilizzo pratico. Quelli. Questo NON è uno strumento da hacker.

Al momento, tutte le funzionalità pianificate funzionano. Tutte le sorgenti, completamente pronte per il montaggio, pubblicato qui. Ci sono anche istruzioni di assemblaggio, ecc. In questa nota non duplicherò le informazioni pubblicate su github. Ti dirò solo ciò che ritengo necessario descrivere separatamente.

La mia opinione sullo “strumento universale” e il motivo della scelta dell'ESP32

Non pretendo di essere la verità. Ognuno ha il suo. Cercherò di giustificare la mia scelta dell'hardware.

Proposto nell'articolo il caso d'uso di una combinazione di Linux (inizialmente Raspberry Pi) + "periferiche" sotto forma di controller (STM32) + CC1110 (core 8051) e il piano di stipare lì tutto il possibile (125kHz, NFC, 433mHz, USB, iButton, bluetooth, ?) non mi sembrava adatto. Tuttavia, questo progetto Sembra che rimarrà privato e chiuso (flipper-zero github "Questa organizzazione non ha repository pubblici.") e si è indirizzato verso hardware non molto comune.

Forse mi sbaglio e in futuro gli autori renderanno pubblicamente disponibili le fonti del software. Ma in caso contrario, non comprerei un hardware del genere senza il codice sorgente.

I miei requisiti per lo "strumento"

La scatola dovrebbe essere piccola (più piccola è, meglio è).

Pertanto:

  • Non è necessaria alcuna batteria integrata. Con una corrente > 100 mA quando si lavora con il Wifi, la batteria integrata sarà grande o non durerà a lungo. Pertanto, lascia che la "scatola" sia alimentata da un power bank standard. Ad ogni modo, ho sempre un power bank in tasca/in macchina.
  • Mantieni una "scatola" Linux con gli strumenti all'interno, scritto nel corso di molti anni in tutte le lingue Con un piccolo schermo e una magra serie di pulsanti di controllo, non ha senso. I risultati possono essere visualizzati/elaborati su un normale laptop dotato di tastiera e schermo completi.
  • I componenti dovrebbero essere facilmente accessibili e ampiamente conosciuti (SDK disponibile, molti esempi e documentazione).

Di conseguenza, per me la scelta era ovvia: ESP32.

Per tutte le attività indicate nell'articolo che mi hanno spinto ad agire, le capacità dell'ESP32 sono abbastanza sufficienti. Anche se il massimo che voglio ancora fare è:

  • Gioca con il Bluetooth.
  • Gioca con la gamma 433 MHz con l'hardware più semplice (solo modulazione di ampiezza, sufficiente per esigenze pratiche).

Unico neo in ESP32

  • L'SDK ESP32 (IDF) è un po' goffo.
  • Alcune funzionalità (stack WiFi, ad esempio) vengono fornite senza codice sorgente sotto forma di librerie statiche assemblate.
  • La banda 5GHz non è supportata e ci sono alcune limitazioni e difficoltà nel lavorare con il WiFi.

Ma il rapporto prezzo/dimensione compensa completamente queste carenze.

Funzionalità principali del software

Descriverò brevemente la funzionalità e la mia opinione riguardo...

Gestione delle impostazioni e caricamento di file da SD

Tutto il controllo esterno viene effettuato tramite una semplice pagina Web, avviata in una voce di menu separata. L'ESP32 si avvia in modalità AP WiFi e visualizza una pagina con un indirizzo IP fisso.

Sebbene i core ESP32 siano abbastanza veloci, come hanno dimostrato gli esperimenti, il funzionamento simultaneo del servizio Web integrato e, ad esempio, della modalità router non sono molto compatibili. Pertanto non esiste alcun controllo dinamico e la pagina non è disponibile in tutte le altre modalità.
Inoltre, il controllo dinamico non è necessario per scopi di ricerca.

Modalità di lavoro con i pacchetti Beacon

Le modalità sono banali e poco interessanti. Fatto “perché è possibile”. Per il controllo.
Ci sono esempi negli esempi ufficiali di Espressif.

Modalità di scansione dell'elenco AP.
In realtà, qualsiasi smartphone può farlo.
Bene, in questa modalità l'elenco degli AP verrà salvato.
Spammer di beacon.
L'ESP32 si avvia come AP con un SSID nascosto e un MAC casuale e inizia a inviare [frame beacon] in base a un elenco precreato di SSID (creato manualmente o ottenuto in precedenza eseguendo la scansione dell'elenco AP)

Modalità di sniffing dei pacchetti WiFi

Gli sviluppatori di Espressif hanno aggiunto la possibilità per il software applicativo di ricevere tutti i pacchetti WiFi “che volano in aria” attraverso la funzione di callback. In realtà non tutti, poiché è possibile impostare la modalità solo per un canale fisso.

Per l'elaborazione di una funzione di callback vengono imposte restrizioni temporali molto rigide. Se ciò non causa problemi con la semplice modalità di raccolta statistiche, allora con la modalità di registrazione di file PCAP su scheda SD ho dovuto armeggiare, organizzando la registrazione tramite una coda in memoria e semafori. Tenendo conto della particolarità che il processo che chiama il callback viene eseguito su un core e il processo che scrive su SD in un altro.

Durante “aria rumorosa” alcuni pacchetti vengono persi (non c'è posto in coda e vengono scartati), ma con un'”aria” tipica di un appartamento serale (5..7 AP in visibilità), registrazione in PCAP viene completato senza perdita di pacchetti.

Inoltre, per il monitoraggio e la registrazione PCAP, esiste una modalità di filtraggio basata sull'elenco MAC nelle intestazioni dei pacchetti.

Ad esempio, puoi monitorare l'aspetto di una persona in un club/bar prima ancora che entri o appaia in vista. Poche persone disabilitano il WiFi e le connessioni automatiche agli AP conosciuti. (Lo sto spegnendo adesso..)

Visualizzare il traffico registrato in Wireshark è educativo e interessante per comprendere le mappe: funziona tutto.

Modalità per lavorare con i pacchetti death

Per impostazione predefinita, l'invio di questi pacchetti è vietato nella libreria libnet80211.a, che viene fornita senza sorgenti. Ma è facile da risolvere modificando un paio di bit. All'inizio dubitavo che valesse la pena pubblicare la patch. Ma dopo aver camminato in posti diversi con la modalità di scansione dei frame di deautenticazione attivata, ho pensato: "che diavolo". Inoltre in esp8266 la consegna di questi pacchetti non è chiusa e ci sono assembly su github per esp8266.

In molti luoghi (non dirò dove) viene utilizzata la soppressione degli AP indesiderati attraverso questo metodo. E questi non sono “bulli”...

E sono rimasto anche sorpreso dal fatto che la distribuzione Internet dal mio telefono non funzionasse in alcuni posti...

La modalità per tracciare il numero e l’RSSI di tali pacchetti è molto utile per capire “dove non piace agli AP di sinistra”.

modalità router

Questa caratteristica è probabilmente la più interessante di tutte da esplorare.

ESP32 supporta il funzionamento simultaneo in modalità STA + SoftAP. Pertanto su di esso è possibile implementare un classico router NAT.

Per supportare lo stack di rete, Espressif utilizza un fork (praticamente invariato) della libreria lwip.

Ma, per impostazione predefinita, nella build standard, la libreria esp-lwip non fornisce l'inoltro tra le interfacce netif 'ap' (SoftAP) e 'st' (STA).

Naturalmente, puoi farlo senza NAT, ma c'è un problema con la connessione simultanea di due o più STA all'interfaccia 'ap' e la sincronizzazione degli indirizzi IP dall'interfaccia di rete 'st' ad 'ap'. Quindi le difficoltà non valgono la pena ed è più facile tramite NAT.

Inoltre, esiste un fork esp-lwip di martin-ger, che aggiunge una semplice implementazione di NAT per IP4.

Anche se le mie mani non vedevano l'ora di rifarlo puramente esteticamente (secondo me, era più facile senza il fork del progetto, ma tramite LWIPHOOK funzioni definite in fase di assemblaggio), ma la pigrizia ha prevalso e l'opzione di martin-ger viene utilizzata così com'è.

In modalità router viene visualizzato il traffico IP4 in entrata e in uscita.

In particolare da esso viene estratto per la visualizzazione a video e la raccolta delle statistiche in un file:

  • Nome del dispositivo connesso a SoftAP ESP32 (pacchetti DHCP)
  • URL dalle richieste DNS (porta UDP 53) da un dispositivo connesso a SoftAP ESP32.

Inoltre, puoi abilitare la registrazione del traffico su un file PCAP.

Questa modalità è molto utile, ad esempio, per capire cosa invia il tuo telefono alla rete e dove va.

Puoi pensare ad altri modi per utilizzare questa modalità, tenendo conto della capacità di controllare completamente il traffico in entrata e in uscita del softAP ESP32 a livello di interfaccia di rete: intestazione Ehernet (destMAC[6]+srcMAC[6]+type[2]) + carico utile (tipo IP4, IP6, DCHP, ecc.).

In linea di principio, l'ESP32 si comporta abbastanza bene con la funzione WiFi->router WiFi, attraversando il traffico normale senza particolari ritardi. Soggettivamente, i ritardi in un telefono connesso tramite router su un ESP32 non sono evidenti.

Sfortunatamente, l'API Espressif non ha la possibilità di impostare un filtro per il MAC connesso a SoftAP EPS32. Si propone invece di dire “arrivederci” (esp_wifi_deauth_sta) alle STA già connesse che “non sono desiderate”.

Il filtraggio per MAC per le STA connesse doveva essere effettuato tramite la chiamata esp_wifi_deauth_sta()

insomma

Anche se non ho trovato nulla di nuovo nell'ambito del lavoro con ESP32, forse il risultato (codice sorgente) sarà interessante per qualcuno.

Vorrei sottolineare che il codice è stato scritto esclusivamente per scopi didattici. Per "hacking", ecc., è stato deliberatamente reso non molto conveniente.

Non ho realizzato un circuito stampato perché ci sono volute 1.5-2 ore per saldare le sciarpe finite con il filo.

E se lo fai, devi assemblarlo non da schede già pronte, ma da singoli componenti. Quindi le dimensioni saranno ancora più piccole.

Fonte: habr.com

Aggiungi un commento