Sicurezza dei Sistemi Informatici II

C.d.L. in Informatica Applicata Università degli Studi di Catania

Emilio Pavia Matr. A40/000107

Vulnerabilità del protocollo WEP

Colui al quale confidate il vostro segreto, diventa padrone della vostra libertà. (François de La Rochefoucauld)

Introduzione Negli   ultimi   anni   la   mobilità   è   stata   la   protagonista   indiscussa   nello   sviluppo   delle   tecnologie  informatiche   e  delle telecomunicazioni;  basti  pensare alla  diffusione  dei  telefoni cellulari  e   dei  computer portatili. Inoltre nell'era di Internet la condivisione delle informazioni ha assunto un ruolo  centrale,   sia   nell'ambito   economico­lavorativo,   che   in   quello   socio­culturale.   Nonostante   le   reti  informatiche   esistano   da   diversi   anni,   l'avvento   dei   dispositivi   portatili   ha   messo   un   crisi   le  tradizionali   tecnologie   di   rete,   le   quali   presuppongono   una   postazione   fissa   all'interno   di   una  struttura   preventivamente   cablata.   Per   superare   questo   limite   l'industria   ha   presentato   diverse  soluzioni per la realizzazione di reti senza fili che alla fine hanno portato alla definizione dello  standard IEEE 802.11 meglio noto con il nome di WLAN o WiFi. Le wireless LAN hanno il grande vantaggio di offrire connettività a tutti i dispositivi che si trovano  nel raggio d'azione delle onde radio (che nel caso di reti 802.11 è comunque limitato ad una decina  di metri) indipendentemente dalla loro posizione. Tuttavia questa rappresenta anche la più grande  debolezza   di   questa   tecnologia   poiché   espone   più   facilmente   gli   utenti   a   delle   violazioni   nella  riservatezza delle comunicazioni da parte di attaccanti esterni. Infatti, mentre nelle LAN tradizionali  è possibile impedire fisicamente l'accesso al mezzo trasmissivo, nel caso di reti wireless chiunque si  trovi nelle vicinanze può intercettare le onde radio attraverso un'antenna. Per rendere più sicure le comunicazioni che avvengono tramite reti wireless sono stati ideati dei  protocolli   di   sicurezza.   L'idea   è   semplice:   utilizzare   dei   sistemi   crittografici   per   rendere  indecifrabile ai non autorizzati ciò che per la natura stessa del mezzo trasmissivo non può essere  nascosto. Il primo tentativo ha portato alla definizione del sistema WEP (Wired Equivalent Privacy)  incluso nello standard IEEE 802.11 e ratificato nel 1999. Tuttavia già nel 2001 Fluher, Mantin e  Shamir presentarono un attacco al cifrario RC4 utilizzato dal WEP. Per porre rimedio a questa falla  di sicurezza nacque un nuovo sistema che venne incluso nello standard IEEE 802.11i e ratificato nel  2004. Questo nuovo sistema è stato implementato in parte nel protocollo WPA (Wi­Fi Protected  Access) e completamente nella sua versione successiva WPA2. Nonostante   ne  sia  stata  dimostrata  l'inadeguatezza  e  siano state  sviluppate  delle  alternative  più  sicure, il WEP è ancora oggi il sistema di protezione più utilizzato [1]. Questo può essere attribuito  sia all'incompetenza degli utenti che nella maggior parte dei casi sono ignari dei rischi che corrono,  sia al fatto che non si vuole investire per acquistare i dispositivi conformi al nuovo standard. Regione Londra Seattle WEP 76 85 WPA 20 14 WPA2 4 1

Tabella 1. Percentuale dei sistemi di sicurezza utilizzati nelle reti wireless protette. Nella prossima sezione verranno analizzati i principi che stanno alla base del WEP e del cifrario in 

esso utilizzato: RC4. Nelle due successive invece verranno trattati i due attacchi più importanti  messi   in   atto   contro   il   cifrario   RC4   (Fluhrer,   Mantin   e   Shamir,   e   Klein),   e   ne   verrà   discussa  l'applicabilità al protocollo WEP. Infine verrà introdotto l'attacco attualmente più performante (in  termini di tempo di esecuzione) contro il protocollo WEP e la tecnica dell'ARP re­injection. Il presente lavoro non ha la pretesa di essere esaustivo sugli aspetti crittografici dei vari attacchi (per  eventuali approfondimenti si rimanda alla lettura dei riferimenti bibliografici). Tuttavia si vuole dare  un'idea di quali siano le debolezze intrinseche di RC4 e del WEP, e in che modo sia possibile  sfruttarle. RC4 e WEP Alla base del protocollo di sicurezza WEP c'è RC4, uno stream cipher ideato da Ron Rivest nel 1987  e tenuto segreto fino al 1994, anno in cui venne pubblicato su internet in forma anonima. Uno  stream cipher è un cifrario simmetrico in cui i byte del testo in chiaro vengono combinati (con una  operazione di OR esclusivo) con una sequenza pseudo­casuale di byte generata dal cifrario. RC4 si compone quindi di due parti: la prima prende come parametro una chiave k (che farà da seed  per   il   generatore)   e   inizializza   il   cifrario;   la   seconda   genera   pseudo­casualmente   un   byte  modificando lo stato interno del cifrario.
RC4KeySetup(K) for i = 0 to 255 do S[i] = i j = 0 for i = 0 to 255 do j = j + S[i] + K[i mod len(K)] mod 256 swap(S[i], S[j]) i = j = 0 RC4GeneratePseudorandomByte() i = i + 1 mod 256 j = j + S[i] mod 256 swap(S[i], S[j]) return S[S[i] + S[j] mod 256]

Nel dettaglio lo stato del cifrario è dato da un array S e da due indici i e j. L'inizializzazione crea in  funzione della chiave k una permutazione S della sequenza ordinata {0,1,...,255} e imposta a 0 gli  indici i e j. Il generatore incrementa di volta in volta l'indice i di 1 e calcola j in funzione di S[i],  scambia in S i valori alle posizioni i e j, quindi restituisce il valore S[S[i] + S[j]]. Tutte le operazioni  descritte vengono ovviamente eseguite in mod N (dove N è la dimensione dell'array S, tipicamente  256). Il protocollo WEP funziona nel modo seguente: tutti gli host della rete wireless condividono una  chiave segreta k di 104 bit (in una prima versione era di 40 bit a causa delle restrizioni imposte dal  governo   degli  Stati Uniti  sui  sistemi  crittografici)  usata  per cifrare e  decifrare  il  contenuto  dei  pacchetti. Il protocollo prende il  plaintext  M  che deve essere spedito, ne calcola il checksum  c(M) (usato  solamente   per   rilevare   eventuali   errori   di   trasmissione)   e   concatena   le   due   quantità,   ottenendo  M∙c(M). Quindi genera un vettore di inizializzazione IV (“unico”1 per ogni pacchetto) di 24 bit e gli  concatena la chiave  k, ottenendo la quantità  IV∙k  di 128 bit. Questa quantità viene utilizzata per 
1 Molto spesso si tratta di un semplice contatore che potrebbe essere resettato (ad esempio) a seguito di un crash o  ogni  volta  che  viene  reimpostata  una  connessione.  L'unicità  non è  intesa  come  assenza di   duplicati,  ma  come  condizione per cui viene generato un nuovo IV per ogni pacchetto.

inizializzare il cifrario RC4 e il crittotesto viene ottenuto facendo l'OR esclusivo del messaggio con  i byte generati dal cifrario: C = M⋅c M XOR RC4IV⋅k  Infine nel pacchetto viene spedita la quantità  IV∙C. Notare che è necessario inviare in chiaro il  vettore di inizializzazione per permettere al ricevente di inizializzare il cifrario e quindi di decifrare  il messaggio eseguendo la stessa procedura. L'attacco di Fluhrer, Mantin e Shamir Fluhrer, Mantin e Shamir hanno descritto un attacco passivo contro il cifrario RC4 [2]. Essi hanno  mostrato   come   sia   possibile   ricavare   l'intera   chiave   utilizzata   per   inizializzare   il   cifrario  conoscendone soltanto una parte. Il WEP è vulnerabile a quest'attacco in quanto una porzione della  chiave (il vettore di inizializzazione) è spedita in chiaro al destinatario. In   particolare  questo attacco per ogni  IV∙k  sfrutta soltanto il primo byte di output del cifrario:  analizzando il codice di  RC4GeneratePseudorandomByte() mostrato precedentemente si nota  che il  primo byte generato   dipende solo da tre valori: prima della chiamata alla funzione sia  i  che  j  valgono 0, quindi dopo la prima esecuzione si avrà i = 1, j = S[1] e il valore ritornato sarà S[S[1] +  S[S[1]]]. 1 X X Y X+Y Z

Figura 1. Rappresentazione del vettore di stato S; Z è il primo byte di output. Inoltre è stato dimostrato dagli autori che se in fase di inizializzazione l'algoritmo raggiunge uno  stato in cui i è maggiore o uguale a 1, a X e a X+Y, allora con una probabilità maggiore di e­3 ≈ 0.05  nessuno di questi tre elementi prenderà parte ad ulteriori scambi. Gli autori definiscono questa  situazione una resolved condition. Sebbene sembri improbabile, è abbastanza semplice procurarsi il primo byte di output del cifrario.  Le reti wireless infatti utilizzano il protocollo LLC [3] (definito dallo standard IEEE 802.2) a livello  data link, che prevede l'incapsulamento dei pacchetti IP in un ulteriore frame con un header SNAP  (subnetwork access protocol) che ha sempre il valore 0xAA come primo byte. Facendo quindi uno  XOR tra il primo byte del crittotesto e il valore 0xAA si ottiene il primo byte di output del cifrario.  Inoltre,   poiché   il   vettore   di  inizializzazione   è  per   packet,  il   cifrario   verrà   inizializzato  ad  ogni  pacchetto inviato, il quale quindi conterrà sempre il primo byte generato da RC4. Nell'articolo   vengono   definiti  deboli  quegli  IV  che   lasciano   trasparire   informazioni   utili   ad  individuare parte della chiave contenuta nel primo byte di output del cifrario. Essi sono nella forma  (A+3,  N­1,  X)2,   dove  A  è   il   byte   della   chiave   segreta   che   si   vuole   individuare,  N  è   il   modulo  utilizzato dall'algoritmo (nel caso del WEP uguale a 256) e X è un valore arbitrario compreso tra 0 e  255.
2 In realtà anche altri IV che non sono in questa forma possono essere utilizzati ai fini dell'attacco. E' sufficiente per  ogni IV ricevuto effettuare un test per verificare se quel valore determina una resolved condition.

Sia K la chiave in cui i primi 3 byte sono formati dall'IV e i restanti dalla chiave segreta. Supposto  che   si   conoscano   i   primi  A  byte   della   chiave   segreta   (con  A  inizialmente   uguale   a   0),   ovvero  K[3]...K[A+2],   si   vuole   individuare   il   valore  K[A+3].   Vediamo   come   si   comporta   l'algoritmo  RC4KeySetup()3 con un IV del tipo (A+3, N­1, X): alla prima iterazione del secondo ciclo vengono  impostati i = 0 e j = K[0] e viene fatto lo swap dei valori in S alle posizioni i e j. 0 A+3 i0 A+3 1 2 1 N­1 2 X 3 k[3] A+3 k[A+3] j0 0

Figura 2. Sopra è rappresentata la chiave di inizializzazione K, mentre sotto è rappresentata la  permutazione S dopo la prima iterazione del ciclo for nella funzione di inizializzazione. All'iterazione successiva i viene incrementato di 1, mentre j = K [0]  S[1]  K [1] = A3  1  N−1 = A3 e quindi viene fatto lo swap tra S[1] e S[A+3]. 0 A+3 A+3 1 N­1 i1 0 2 X 2 3 k[3] A+3 k[A+3] j1 1

Figura 3. Sopra è rappresentata ancora la chiave di inizializzazione k, mentre sotto è rappresentata  la permutazione S dopo la seconda iterazione del ciclo for. Da   questo   punto   in   poi   l'algoritmo   di   inizializzazione   proseguirà   differentemente   in   base   al  particolare IV in quanto i verrà ancora incrementato di 1 e j dipenderà dal valore X:

j = A3  S [2] K [2 ] = A3  2  X Tuttavia l'attaccante conosce  X  (perché fa parte del vettore di inizializzazione) e conosce anche i  valori k[3]...k[A+2] (per l'ipotesi sopra formulata), quindi eseguendo l'algoritmo ne può prevedere il  comportamento fino al passo  A+3. A questo punto l'attaccante conoscerà il valore  jA+2  e il valore  della permutazione  SA+2. Se i primi due valori di  S  saranno diversi da  A+3 e 0 (cioè se sono stati  coinvolti in ulteriori swap) allora l'attaccante scarterà quel pacchetto e ne proverà un altro, altrimenti  si avrà: j A3 = j A2  S A2 [ A3]  K [ A3]

3 Anche se non specificato d'ora in avanti tutte le operazioni verranno considerate in modulo N.

ovvero

K [ A3 ] = j A3 − j A2 − S A2 [ A3]
Poiché i e j verranno scambiati in SA+2, si avrà che SA+3[A+3] = SA+2[jA+3], ovvero jA+3 sarà la posizione  in  SA+2  in  cui appare il valore  SA+3[A+3].  Inoltre  iA+3  (uguale a  A+3)  avrà raggiunto la  resolved   condition  (con riferimento alla figura 1 abbiamo infatti  X  = 0 e  X+Y  =  A+3) e quindi, con una  probabilità p > e­3  ≈  0.05, SA+3[A+3] sarà proprio il primo byte di output del cifrario. Analizzando  circa 60 IV questa probabilità sale già a 0.5. A questo punto si hanno tutti gli elementi per calcolare  k[A+3], e iterando questo procedimento per tutti i valori di A l'attaccante è in grado di ricostruire  l'intera chiave segreta. L'attacco di Klein Per recuperare un'intera chiave con l'attacco precedentemente descritto occorrono da 1.000.000 a  5.000.000 di pacchetti [4], in quanto non tutti i pacchetti contengono un  IV   che determina una  resolved condition. Un netto miglioramento si è avuto a seguito degli studi di Andreas Klein su RC4  [5]. Egli ha dimostrato l'esistenza di una forte correlazione tra i valori osservabili i e S[S[i]+S[j]] e i  valori j, S[i] e S[j] relativi allo stato interno del cifrario. Per semplicità di notazione indichiamo con  k il valore S[i]+S[j], cosicché l'output del cifrario sarà dato dal valore S[k], mentre con K indichiamo  la chiave di inizializzazione del cifrario. Klein ha dimostrato4 che fissato un valore i minore di n: P S [ j ]  S[k ] ≡n i = 2 n

Per   capire   come   sfruttare   questa   probabilità   analizziamo   i   primi   due   passi   dell'algoritmo   di  inizializzazione di RC4. Inizialmente S[i] = i per ogni valore di i; al primo passo dell'algoritmo si ha  i = 0 e j = K[0], e lo scambio di S[i] con S[j]. i0 K[0] 1 2 K[0] 0

Figura 4. Lo stato dell'array S dopo il primo ciclo dell'algoritmo di inizializzazione. Al secondo passo j viene incrementato della quantità S[1] + K[1], e viene fatto lo scambio tra S[1] e  S[j]. Poiché inizialmente S[i] = i, possiamo affermare che con il secondo scambio (dato che fino a  quel momento sono stati cambiati solo due valori in S0) otteniamo S[1] = S[j] = j = K[0] + 1 + K[1],  tranne nei seguenti casi: a) K[0] = 1 e K[1] = 0 In questo caso al primo passo j = 1, quindi viene fatto lo scambio tra S[0] e S[1], ovvero si 
4 La dimostrazione prende il nome di Teorema 1 nell'articolo originale.

avrà S[0] = 1 e S[1] = 0. Al secondo passo j = K[0] + S[1] + K[1] = 1 + 0 + 0 = 1, quindi  dopo lo scambio si avrà S[1] = S[j] = S[1] = 0. b) K[0] = 1 e K[1] != 0, n­1 Dopo il primo passo ci troviamo nello stesso stato del caso precedente. Al secondo passo  però j = K[0] + S[1] + K[1] = K[0] + K[1], e poiché questa quantità è diversa da 0 e da 1  avremo S[1] = S[j] = K[0] + K[1] (perché tutti per tutti i valori di j > 1 S[j] = j). c) K[0] != 1 e K[1] = n­1 In questo caso dopo il primo passo avremo S[0] = K[0], S[K[0]] = 0 e S[1] = 1. Al secondo  passo j = K[0] + S[1] + K[1] = K[0] + 1 + n­1 = K[0] (perché operiamo in modulo n), e  quindi S[1] = S[j] = S[K[0]] = 0. d) K[0] != 1 e K[0] + K[1] = n­1 Dopo il primo passo siamo nella stessa configurazione del caso precedente. Al secondo  passo j = K[0] + S[1] + K[1] = K[0] + 1 + K[1] = n­1+1 = 0, e quindi S[1] = S[j] = S[0] =  K[0]5. In ogni caso il valore di S[1] dopo il secondo passaggio è una funzione di K[0] e K[1]. Inoltre Klein  ha dimostrato che S[1] non verrà modificato nei passi successivi dell'inizializzazione (ovvero che j  non raggiungerà mai più il valore 1) con probabilità ≈ 1/e. Quando viene generato il primo byte dal cifrario abbiamo i = 1, j = S[1] e lo scambio tra S[1] e S[j].  Visto che noi siamo interessati a S[1] (per trovare K[1]) dobbiamo recuperare il valore di S[j]. Allo  scopo ci viene in aiuto il teorema 1 il quale afferma che con probabilità pari a 2/n, S[j] = 1 – S[k],  dove S[k] è il primo byte di output di RC4. Mettendo assieme le due probabilità otteniamo: P S [1] = 1 −S [k ] ≈ 1.36 n

La probabilità che S[1] sia un altro valore è minore di 1/n (per ogni valore degli altri n­1). L'attacco  quindi avviene nel seguente modo: per un certo numero di pacchetti con IV distinti viene catturato il  primo byte di output del cifrario S[k] e viene calcolato S[1] = 1 – S[k]. Di tutti i possibili n valori  che otteniamo, quello che si ripeterà con più frequenza sarà il valore corretto. La complessità di  questa procedura è stata calcolata da Klein ed è   ≈  17nln(n) che (per  n  = 256) equivale a  circa  25.000 pacchetti (di gran lunga inferiore alla complessità dell'attacco di FMS). Si noti che in questo attacco è previsto che l'attaccante indovini K[0] affinché possa recuperare K[1]  (infatti  S[1]   è   funzione   di   entrambi).  Nel   caso   del   WEP   però   questa   condizione   è   facilmente  raggiungibile in quanto i primi 3 byte della chiave vengono sempre mandati in chiaro. Estendiamo adesso l'attacco a tutti i byte della chiave: dopo aver ottenuto K[0] e K[1] supponiamo di  voler recuperare K[2]6. Analogamente a prima abbiamo che nella fase di inizializzazione del cifrario  S[2] =  f(K[0],  K[1],  K[2]) e che con probabilità ≈  1/e  non verrà più modificato negli n – 3 passi 
5 L'articolo originale riporta a pagina 6 punto  d  S[1] =  K[1], ma seguendo la logica dell'algoritmo sembra essere  un'inconguenza. 6 In realtà nel caso del WEP anche K[2] è già disponibile, me per analogia questo ragionamento può essere esteso a  tutti i K[i].

successivi. Osservando il secondo byte di output del generatore (grazie al teorema 1) possiamo  procurarci S[j], che al secondo passo sarà uguale a S[2] e quindi, grazie a f (poiché abbiamo già i  primi   due   byte   della   chiave)   possiamo   calcolare   K[2].   Iterando   questo   procedimento   possiamo  recuperare l'intera chiave K con una complessità totale pari a O((k­1)nln(n)). L'attacco di Tews, Weinmann e Pyshkin Con l'attacco di Klein abbiamo visto come sia possibile ricavare in maniera iterativa l'intera chiave  segreta. Lo svantaggio di questo approccio però è che se il byte  K[i] che abbiamo recuperato è  sbagliato,   tutti   gli   gli   altri  K[j]   (j  >  i)   saranno   errati   e   devono   quindi   essere   ricalcolati.   Tews,  Weinmann e Pyshkin hanno presentato un attacco che permette di ricavare ogni byte della chiave  indipendentemente dagli altri [6]. Con Sk viene indicato lo stato dell'array S dopo k iterazioni dell'algoritmo RC4. Analogamente jk è il  valore della variabile j dopo k iterazioni. Con S­1[j] si indica la posizione in S in cui si trova il valore  j, ovvero se S[i] = j allora S­1[j] = i. Infine con X indichiamo l'output del generatore. Facendo delle sostituzioni e sviluppando la formula ottenuta da Klein, gli autori di questo attacco  hanno determinato la seguente formula:
i 3

σ i ≈n S
i 3

−1 3i

 [3i− X [2i ]] −  j 3 ∑ Sl [l ] = Ai
l =3

dove σ i =

∑ K [ l]
l =3

ovvero la somma dei primi  i  byte della chiave segreta (i primi 3 byte di  K 

sono l'IV). La probabilità che questo valore trovato sia quello corretto (come dimostrato da Klein)  abbiamo visto essere  ≈  1.36/n. Come si può notare però  σi  dipende  dai  valori  S3, ...,  Si+3.   Tews,  Weinmann e Pyshkin hanno dimostrato che sostituendo ogni occorrenza di S con S3 la probabilità di  prendere   il   valore   corretto   diminuisce   meno   dello   0.2%   rispetto   a   quella   originale.   Questa  approssimazione ha però il vantaggio di portare alla seguente:
i3

σ i ≈n S−1 [3i−X [2i]] −  j 3 ∑ S3 [l] = Ai 3
l=3

Come si può notare adesso σi dipende solamente da S3, il quale a sua volta dipende solamente da  K[0],  K[1]   e  K[2]  che nel  caso del WEP  sono valori  spediti in chiaro  e  quindi a disposizione  dell'attaccante senza alcuno sforzo. L'attacco avviene nel seguente modo: per ogni σi viene calcolato Ai con la formula appena descritta.  Ogni volta che troviamo il valore Ai diremo che esso ha ricevuto un voto. In tabelle separate (una per  ogni σi ) vengono conservati tutti i valori calcolati, e alla fine del processo come valore corretto di  σi   verrà preso quello che ha ottenuto il maggior numero di voti. Infine verrà calcolato K[3] = σ0 e  K[i+3]   =    σi  –  σi­1    (i  >   3).   E'   necessario   fare   un'osservazione:   la   formula   appena   descritta  presuppone la conoscenza dei primi 16 byte (per tutti i 128 bit della chiave) di output del cifrario (il  vettore X), il che equivale a conoscere i primi 18 byte del plaintext del pacchetto per poter fare lo 

XOR con il crittotesto. Questo attacco non è quindi applicabile a tutti i pacchetti, ma solo a quelli  con un determinato header noto, come ad esempio i pacchetti del protocollo ARP (come spiegato  nella sezione successiva). I risultati sperimentali forniti dagli autori di quest'attacco mostrano come con soli 40.000 pacchetti  sia possibile raggiungere un tasso di successo nel ritrovamento della chiave del 50%. Incrementare il traffico dei pacchetti utilizzabili Per incrementare il traffico dei pacchetti da sfruttare nell'attacco, Tews, Weinmann e Pyshkin hanno  proposto  la tecnica dell'ARP re­injection. Quando  un host A  vuole mandare un messaggio  a  B  specifica nel pacchetto in uscita l'indirizzo IP di quest'ultimo. Tuttavia gli indirizzi IP hanno senso  soltanto a livello network, quindi affinché il frame ethernet possa raggiungere lo strato data link del  destinatario è necessario conoscere il suo indirizzo fisico (detto anche MAC address). A tale scopo è  stato   ideato   il   protocollo  ARP  (Address   Resolution   Protocol):   quando   un   host   vuole   conoscere  l'indirizzo   fisico   di   un   altro   host   manda   in   broadcast   a   tutta   la   sottorete   una   ARP  request   specificando l'indirizzo IP del destinatario e il proprio indirizzo fisico. Tutti gli host ascolteranno  questa richiesta ma soltanto l'host con l'indirizzo IP specificato invierà una ARP  response  con il  proprio   indirizzo   fisico.   Poiché   nella   request   è   già   incluso   l'indirizzo   fisico   del   mittente,   il  destinatario della richiesta avrà tutte le informazioni necessarie per inviare la propria risposta. Sia le request che le response ARP sono dei pacchetti di dimensione fissa, e quindi sono facilmente  riconoscibili nel traffico in quanto il WEP non nasconde le dimensioni originali dei pacchetti. I  pacchetti ARP hanno un header LLC (Logical Link Control) fisso di 8 byte uguale a “AA AA 03  00 00 00 08 06” e i primi 8 byte del payload sono uguali a “00 01 08 00 06 04 00  01” per le richieste e “00 01 08 00 06 04 00 02” per le risposte (cambia solo l'ultimo  byte). Inoltre poiché WEP non nasconde l'indirizzo fisico del destinatario e facile distinguere le  richieste (mandate in broadcast) dalle risposte (mandate in unicast), quindi è possibile riconoscere  tutti i pacchetti ARP in transito nella sottorete e di questi se ne conoscono i primi 16 byte del  plaintext. In definitiva catturando ogni pacchetto ARP e facendo lo XOR tra i primi 16 byte del pacchetto e  questi valori noti si hanno a disposizione i primi 16 byte generati dal cifrario. In più è disponibile il  vettore di inizializzazione perché è mandato in chiaro. L'ARP re­injection consiste nel rispedire tutte le richieste ARP così come sono state intercettate.  Ogni re­injection generalmente produce 3 nuovi pacchetti a causa dei relay effettuati dall'access  point,   e   poiché  ognuno  di   essi   ha  un  vettore  di  inizializzazione  diverso  il   numero  di   pacchetti  utilizzabili   ai   fini   dell'attacco   aumenta   considerevolmente.   Tuttavia   questa   tecnica   trasforma  l'attacco da passivo ad attivo rendendo possibile l'utilizzo di sistemi anti intrusione.

Implementazioni NOTA Gli strumenti descritti in questa sezione sono stati inseriti come esempi di implementazione degli  attacchi analizzati finora, e hanno un fine esclusivamente didattico. Essi non devono in alcun modo  essere utilizzati per violare reti wireless senza autorizzazione. Aircrack­ng (http://www.aircrack­ng.org) è una raccolta di strumenti utili per recuperare le chiavi  di   cifratura   delle   reti   protette   con   i   protocolli   di   sicurezza   WEP/WPA.   E'   multipiattaforma  (Unix/Linux, Windows, Mac OS X) ed è rilasciato con licenza GNU GPL 2. Tuttavia per poter  essere utilizzato occorre avere una scheda di rete in grado di mettersi in modalità passiva (detta  anche  monitor mode) per catturare il traffico e in grado da fare l'inject dei pacchetti qualora si  volesse   utilizzare   questa   tecnica   (l'elenco   delle   schede   di   rete   compatibili   è   reperibile   nel   sito  internet del progetto). Questo prodotto comprende una serie di strumenti che è possibile utilizzare per eseguire i  vari  attacchi:

Airmon­ng: questo script viene utilizzato per attivare la modalità monitor in una scheda di  rete compatibile.
utilizzo: airmon-ng <start|stop> <interface> [channel]

Tra i parametri si può specificare se attivare o disattivare la modalità monitor, l'interfaccia di  rete da utilizzare ed eventualmente il canale su cui sintonizzarsi.

Airodump­ng: questo tool viene utilizzato per catturare i frame 802.11 e salvare il risultato  all'interno di un file.
utilizzo: airodump-ng <options> <interface>[,<interface>,...]

E' possibile specificare più interfacce di rete da cui intercettare i pacchetti, mentre tra le  opzioni è possibile specificare:
--ivs

Per catturare solamente i vettori di inizializzazione Per catturare solamente i pacchetti relativi ad una particolare sottorete Per catturare solamente i pacchetti relativi alla rete con un particolare BSSID Per catturare solamente i pacchetti relativi alle reti che utilizzano una particolare  suite crittografica

--netmask <netmask> --bssid <bssid>

--encrypt <suite>

Aircrack­ng: questo tool utilizza i pacchetti catturati da Airodump per recuperare le chiavi. 

Come   attacco   predefinito   utilizza   il   PTW   (Pyshkin,   Tews,   Weinmann),   ma   è   possibile  selezionare   anche   altri   attacchi   tra   cui   il   FMS   (Fluhrer,   Mantin,   Shamir)   o   quello   a  dizionario.   Per   avere   ulteriori   dettagli   sull'utilizzo   di   questo   tool   e   sulle   opzioni   che   è  possibili specificare si consulti la relativa pagina di manuale. Quello che si ottiene eseguendo il programma è la seguente schermata (per brevità viene  considerato un esempio in cui viene attaccata una chiave WEP da 40 bit):
Aircrack-ng 0.9 [00:01:18] Tested 0/140000 keys (got 30680 IVs) KB 0 1 2 3 4 depth 0/ 1 0/ 1 0/ 1 0/ 1 0/ 1 byte(vote) 12( 170) 35( 34( 163) BB( 56( 162) E9( 78( 158) 13( 90( 183) 8B( 152) 160) 147) 156) 156) AA( CF( 1E( 01( D7( 146) 147) 146) 152) 148) 17( 59( 32( 5F( E0( 145) 146) 146) 151) 146) 86( 39( 6E( 28( 18( 143) 143) 145) 149) 145) F0( 47( 79( 59( 33( 143) 142) 143) 145) 145) AE( 42( E7( FC( 96( 142) 139) 142) 145) 144) C5( 3D( EB( 7E( 2B( 142) 137) 142) 143) 143) D4( 7F( 75( 76( 88( 142) 137) 141) 142) 143) 50( 18( 31( 92( 41( 140) 136) 140) 142) 141)

KEY FOUND! [ 12:34:56:78:90 ] Decrypted correctly: 100%

Nella colonna di sinistra sono elencati i byte della chiave segreta a cui si riferisce la riga.  Nella matrice di destra sono elencati per ogni riga i candidati per quel particolare byte della  chiave, ordinati per voto.

Aireplay­ng: questo tool può essere utilizzato per fare l'inject dei pacchetti all'interno di una  sottorete (necessita una scheda di rete compatibile).

Bibliografia 1. Andrea Bittau, Mark Handley, and Joshua Lackey. The final nail in WEP's coffin. In IEEE   Symposium on Security and Privacy, pages 286­400. IEEE Computer Society, 2006. 2. Scott R. Fluhrer, Itsik Mantin and Adi Shamir. Weakness in the key scheduling algorithm of  RC4. In Serge Vaudenay and Amr M. Youssef,  editors,  Selected Areas in Cryptography   2001, volume 2259 of Lecture Notes in Computer Science, pages 1­24. Springer, 2001. 3. Andrew S. Tanenbaum. Reti di calcolatori. Quarta edizione. Pearson – Prentice Hall, 2003. 4. Adam   Stubblefield,   John   Ioannidis   and   Aviel   D.   Rubin.   A   key   recovery   attack   on   the  802.11b wired equivalent protocol (WEP).  ACM Transactions on Information and System   Security, 7(2):319­332, May 2004. 5. Andreas   Klein.   Attacks   on   the   RC4   stream   cipher.  submitted   to   Designs,   Codes   and   Cryptography, 2007. 6. Erik Tews, Ralf­Philipp Weinmann, and Andrei Pyshkin. Breaking 104 bit WEP in less than  60 seconds.

Sign up to vote on this title
UsefulNot useful