2013-05-28 14 views
14

Ho lavorato su un modo per avere un router OpenWRT log richieste di probe WiFi a un db MySQL (memorizza l'indirizzo MAC e le informazioni RSSI per ogni pacchetto di richiesta sonda insieme ad altri router specifici dati).Pacchetti WiFi di analisi (libpcap)

Dopo la ricerca di libpcap un bel po ', sono stato in grado di mettere insieme un piccolo programma di base che annusa semplicemente i pacchetti su un'interfaccia monitor (mon0) usando un'espressione di filtro ('wlan sottotipo probe-req') e poi stampe fuori i pacchetti grezzi in esadecimale. Con le informazioni disponibili online su libpcap questa parte era abbastanza semplice.

Ora è qui che sono bloccato: Come analizzare il pacchetto WiFi per recuperare le informazioni che sto cercando (indirizzo RSSI e indirizzo MAC di origine)?

Per essere chiari, non sto chiedendo il codice per farlo (anche se non mi lamento se si desidera fornire alcuni: D). Sto solo cercando una sorta di guida per capire quale byte è - una roadmap del pacchetto WiFi, se vuoi.

Ci sono alcuni buoni tutorial per l'analisi dei pacchetti che arrivano via ethernet, ma non sono stato in grado di trovare nulla che possa aiutare con le intestazioni di analisi spcifically relative al WiFi. Presumo che sarà un processo piuttosto semplice: basta prendere i byte rilevanti per RSSI e source MAC - ma ancora una volta, non sono stato in grado di trovare alcuna documentazione su quale byte è quale.

So che questo è stato fatto prima ma sarò onesto: sono completamente perso quando si guarda attraverso il codice sorgente per tcpdump.

Quindi, qualcuno sa di una buona risorsa per l'analisi dei pacchetti WiFi?

Acclamazioni

EDIT: Più risposta specifica

RSSI si trova nell'intestazione RadioTap (beh, su Linux è). Estrarre l'RSSI dal pacchetto è abbastanza semplice usando radiotap-parser.c insieme ai file da cui dipende (trovato nella stessa directory del file a cui mi sono collegato). Se qualcuno ha problemi con l'uso delle funzioni radiotap-parser.c, sentitevi liberi di mettervi in ​​contatto.

Tirando l'indirizzo MAC sorgente è reso abbastanza facile dalle funzioni radiotap perché la struct intestazione radiotap contiene la lunghezza dell'intestazione radiotap (it_len), che è variabile. Poiché sto analizzando solo le richieste di probe, che hanno una lunghezza fissa (vedere la pagina 17 here), è solo questione di creare un puntatore che punta a packet + it_len + 10 (l'indirizzo MAC di origine inizia 10 byte dopo l'inizio del frame MAC, che inizia dove termina l'intestazione del radiotap). I 6 byte che iniziano da quel puntatore sono addr2 nel frame 802.11 (di nuovo, vedere pagina 17 here).

+0

collegamento radiotap-parser.c è rotto. – haccks

risposta

2

Una ricerca Google per "formato frame 802.11" fornisce alcuni link promettenti, credo. Ecco una panoramica di alto livello che espone il pacchetto: http://www.technologyuk.net/telecommunications/networks/wireless_networks.shtml.

+0

Grazie per il link, Mike, mi ha aiutato molto. Non avevo considerato l'utilizzo di "frame format" nelle mie stringhe di ricerca, ma una volta fatto ho finito su un percorso molto più utile. –

+0

Mi sentivo male a offrire una ricerca su Google come risposta, ma speravo che i miei termini di ricerca si sarebbero dimostrati più utili di quelli che avevi provato in precedenza. Lieto che abbia funzionato :) –

+0

E un altro collegamento è a [la pagina 802.11 nel programma IEEE Get] (http://standards.ieee.org/about/get/802/802.11.html), da cui è possibile recuperare il standard ufficiale 802.11. –

-1

è possibile utilizzare il modulo tshark in cui è possibile recuperare campi specifici.

2

Se si utilizza pylibpcap, è possibile utilizzare l'RSSI in questo modo. Questo è grezzo e fa ipotesi sui flag nel frame 802.11 (ovvero i flag devono essere 0x0000482F), ma ha funzionato per me.Questo è un hack di Python e non volevo andare lungo il percorso di installazione di moduli aggiuntivi (dpkt e scapy hanno caratteristiche per fare questo, ma non ben documentati) quando l'hack è solo una chiamata a struct.unpack.

(len,data,timestamp) = p.get_next() 

if data[0:8] =='\x00\x00\x22\x00\x2F\x48\x00\x00' and len(data) >= 50: 
    type_subtype = ord(data[34]) 
    dest_mac  = data[38:38+6] 
    src_mac  = data[44:44+6] 
    rssi,  = struct.unpack("b",data[22]) 

Se le bandiere non sono come sopra, poi guardare radiotap-parser.c in questione del PO, e capire come calcolare l'offset al campo RSSI (22 in questo esempio). Ogni bit di flag cambia l'offset di 1,2,4 o 8 byte.

1

So che questo post è vecchio ma mi sono imbattuto in esso cercando di fare l'analisi wifi senza fortuna, quindi spero di poter aiutare qualcun altro!

C'è una libreria relativamente nuova ma è sorprendente per tutti i livelli dello stack. Si chiama libTins e analizzerà i pacchetti ad ogni livello dello stack per te. La sua licenza BSD (a partire dal 2015) ed è super facile da sniffare. È costruito su lib pcap ma accetta array di byte se vuoi fare lo sniffing te stesso.