Il mondo del Wifi sta prendendo sempre più piede nei più disparati ambienti, dall'utenza domestica alle grandi multinazionali. Il propagarsi del Wifi è direttamente proporzionale alla sua facilità di setup ed al vantaggio che si deriva dall'avare internet disponibile ovunque all'interno del raggio di copertura degli Access Points dislocati all'interno del perimetro aziendale. 

Molte aziende subiscono attacchi di tipo informatico e spesso non se ne rendono conto, gli utenti domestici percepiscono un sensibile calo di velocità della propria connessione e maledicono le compagnie telefoniche.

Il protocollo WEP (Wired Equivalent Protocol) è un protocollo che definisce un insieme d'istruzioni e regole tramite i dati possono viaggiare nell'aria con un minimo di sicurezza. Per la codifica dei dati WEP utilizza l'algoritmo RC4 nel momento in cui i dati "escono" dal AP.

Il problema della sicurezza nel mondo WEP deriva dall'errata implementazione dell'algoritmo RC4, non l'algoritmo in se stesso. RC4 è, e credo lo sarà ancora per diverso tempo, un algoritmo sicuro, basti pensare che viene utilizzato pesantemente all'interno di SSL (Secure Socket Layers) e quindi nella maggior parte degli applicativi legati al commercio elettronico. Ma come è possibile sfruttare una implementazione errata per fare breccia all'interno di una rete privata? Non è una cosa che richiede molto tempo, una stima recentemente condotta ha dimostrato che una rete con un traffico costante può essere bucata nel giro dalle 2 alle 6 ore (40 minuti nel caso della mia rete -_-).

Per capire come effettuare il cracking di una rete wifi è necessario comprendere dove risiede l'errore. Come abbiamo detto WEP utilizza l'algoritmo RC4. RC4 utilizza una cifra di emissione che crea una Unique Key (denominata Packet Key) per ogni pacchetto che viene codificato.  Questa operazione viene eseguita grazie alla combinazione di varie caratteristiche di una password condivisa, un valore di stato ed un vettore d'inizializzazione (IV) il quale viene usato per "offuscare" i dati. Tutti questi componenti e passaggi vengono definiti "Key Scheduling Algorithm" (KSA). Il risultato di queste operazioni è un array il quale viene utilizzato per generare un algoritmo pseudocasuale (PRGA) che a sua volta produce un flusso di dati messo in XOR con il plain text (messaggio) il quale alla fine produce il cypher text che viaggia sopra le nostre teste.

Questo messaggio è sicuramente differente dal messaggio originale, di fatti contiene un valore che viene identificato come checksum. Il checksum è un valore unico computato da dati contenuti nel pacchetto, il quale viene utilizzato per garantire l'integrità dei dati. Quando il pacchetto viene ricevuto dall'host che ne ha fatto richiesta, viene ricalcolato il checksum e confrontato con quello originale, se i due checksum corrispondono il pacchetto viene accettato e processato, altrimenti viene scartato.

Molti sistemi di IDS verificano ogni pacchetto che viaggia sulla rete ed effettuano questa operazione proprio per rilevare presenze di AP rogue i quali possono effettuare operazioni di MITM.

Una volta che il dato viene decifrato, l'IV viene anteposto ai dati, insieme ad un bit che segna il pacchetto come cifrato. Tutto questo viene trasmesso nell'atmosfera, da dove viene poi catturato e decifrato dal legittimo destinatario. Il processo di decifratura e' l'esatto opposto del processo di cifratura. Come prima cosa, l'IV viene rimosso dal pacchetto, e relazionato con la password condivisa. Questo valore viene utilizzato per ricreare la KSA, che viene conseguentemente utilizzata per ricreare il key-stream.
Il flusso e il pacchetto di dati cifrato vengono quindi messi in XOR, e la risultante e' il testo in chiaro. Alla fine, il CRC viene rimosso dal testo in chiaro e comparato con il CRC ricalcolato: a questo punto, il pacchetto viene accettato oppure scartato.

Analizzare i dati Codificati

Evitare che i dati vengano intercettati durante il loro viaggio è impossibile, l'unica cosa che può fare il WEP è proteggerli dall'interpretazione una volta catturati. Partendo da questo dato di fatto iniziamo di nuovo dalla teoria. Come è giusto supporre, dopo aver determinato che i dati vengono codificati prima dell'invio il testo catturato ed un testo in chiaro conosciuto possono essere messi in XOR per produrre il keystream generato dal PRGA. La ragione di questo è che il WEP produce il testo cifrato unendone solamente due variabili e mettendole in XOR. 

+=====================================+
CyperText = 
(PlainText XOR keyStream)
+=====================================+

Come si può vedere l'unico valore che maschera il testo in chiaro è il keystream. Se invertiamo il processo, vedremo che l'unico valore che maschera il keystream è il testo in chiaro.

+=====================================+
Keystream = 
       (CyperText XOR PlainText)
+=====================================+

Per estrarre il testo tutto quello che serve è uno sniffer wireless, e state tranquilli che in una rete moderna possiamo raccogliere MB e MB di dati da confrontare.

Parte 1. Strumenti

Prefazione, dato che uno sniffer lavora appena sopra il livello hardware e quindi sopra i protocolli di rete, tende a ricevere unicamente i dati destinati al computer sucui è collegato. Questo non accade quando una scheda di rete viene configurata in modalità "promiscua", in questa modalità una scheda di rete intercetta tutti i pacchetti che passano sul cavlo al quale è connessa, fregandosene completamente del MAC Address.

Personalmente mi sento di consigliare due tipologie di Sniffer:

  1. Kismet ( http://kismetwireless.net)
  2. OpenShark (globalmente conosciuto come Ethreal prima che il capo progetto venisse assunto da una nota compagnia di Sicurezza Informatica)

Come precedentemente descritto, il WEP usa un IV per cifrare ogni pacchetto. Se il mittente usa un IV per cifrare, il ricevente deve conoscere il valore corrispondente per decodificare. Un IV è composto da 3 bytes per ogni pacchetto WLAN, quando questo dato viene inviato, IV viene anteposto al pacchetto cifrato. Come tutti sappiamo un byte è composto da 8 bit, pertando con una serie di calcoli è possibile affermare che la chiave di decodifica può assumere un valore di 16.777.216. Tanto eh? Per niente..

1 byte = 8 bits
3 byte = 24 bits

1 bit = 0 / 1
IV Keys = 2^24 = 16.777.216

Questo non significa propriamente che dobbiamo aspettarci una collissione IV dopo il trasferimento di 16 milioni di pacchetti, nella maggior parte dei casi s'iniziano a vedere collissioni dopo i primi 3000 pacchetti. Quindi

2000 * 1500 = 4500000
4500000 / 1000000 = 4.5MB

Il keystream viene calcolato da una serie di proprietà della password e di IV. Nel caso in cui si verifichi una collissione IV è disponibile sotto forma di tre caratteri "1:2:3".

Parte 2. Esempio Reale

L'esempio che segue è stato realizzato sulla mia rete Wifi casalinga. Nell'arco di tempo di un campionato di Need for Speed Most Wanted online eseguito da parte di un amico è stato possibile eseguire il cracking della mia rete Wifi -_-.

Il tutto si è svolto in questo modo.
Dopo aver catturato pacchetti con Kismet e dopo aver esportato tutti i dati necessari, è stato necessario lanciare WEPCrack (in questo caso prism-getIV.pl ) per generare un file di nome IVfile.log, il quale introduce tutta la serie di IV in collisione.

Successivamente ho lanciato il file WEPcrack.pl, il quale, leggendo il file IVfile.log tenta d'identificare la chiave WEP utilizzata all'interno della mia rete. Dopo non molto tempo, WEPCrack ritorna il valore decimale della mia chiave. A questo punto è necessario utilizzare un tool di conversione da Decimale ad Esadecimale per avere la chiave corretta e connettersi con tutta tranquillità alla rete.