Premesse

Il post
htp://forums.remote-exploit.org/angolo-wireless/27584-crack-di-una-wpa-di-un-router-alice.html#post156830
ha ispirato l'apertura di questo thread. All'inizio ho provato a spiegare lì cosa sono le rainbow tables, ma su richieste esterne ho deciso di approfondire la spiegazione dell'algoritmo e soprattutto dare a questo importante argomento una sezione sufficientemente ampia.

questo non è un tutorial, ma un solo un thread esplicativo teorico, per l'utilizzo vi rimando alle tante guide per coWPAtty presenti nel forum

un ringraziamento particolare a cancrena che mi ha permesso di capire come spiegare questo abbastanza complicato sistema di decifrazione forzata.


Premesse matematiche

Per capire qualcosa dobbiamo avere bene in mente alcuni concetti matematici di base.

Funzione
Una funzione trasforma una/delle variabili in ingresso in un risultato in uscita. come notazione utilizzerò:

Funzione (input) = output

Applicazione lineare
Una applicazione lineare è una funzione che partendo da un solo input, genera un output formato due o più funzioni normali, in questa maniera:

ApplLineare (input) = [ Funz1 (Input, Funz2 (Input, - - - , FunzN (Input ] = output

(a tutti quelli che si offenderanno per questa definizione: scusate ma mi serviva il concetto, non posso essere troppo rigoroso... so che in realtà quelle che uso non sono apllicazioni lineari ma così posso farmi capire...)


Funzioni reversibili e irreversibili

Una funzione si dice reversibile quando esiste una funzione inversa tale che:
Se

Funzione (input) = output

allora

FunzInversa (output) = input

Se questo non accade allora la funzione si dice irreversibile, cioè non esiste un modo per recuperare l'input che ha determinato l'output.

Gli Hash

Quando inseriamo una password (xxxxx) in un sito per il login, essa deve esser inviata ad un server per poter essere comparata con un database dove sono salvate tutte le password. A questo punto ci troviamo di fronte a due enormi buchi di sicurezza:
- la password inviata in chiaro potrebbe essere facilmente sniffata;
- il database delle password potrebbe essere facilmente rubato mediante un attacco (DoS per esempio, tipo dopo un buffer overflow)
Per risolvere questi due problemi ci vengono incontro le funzioni crittografiche (come MD5 o SHA-1 ecc.) e il Web2.0 con le pagine php. Se noi includiamo nella pagina sul client un piccolo script php che sia in grado di trasformare in maniera irreversibile la nostra stringa xxxxxx (la password) in una stringa a lunghezza fissa [HASH o Digest dell'Hash], dalla quale non si sia più in grado di risalire alla password iniziale e creare sul server un database di tutti questi hash abbiamo risolto i due problemi di sicurezza. Anche se si sniffasse l'hash, esso non potrebbe essere ritrasformato nella password iniziale.

Esempio pratico:
Password: backtrack
Hash MD5: 5E28850DE5A33B62119108CCAF35A157

Cioè scritto sotto forma di funzione:

MD5(backtrack) = 5E28850DE5A33B62119108CCAF35A157

Cosa sono le RAINBOW TABLES?

Sono delle tabelle di associazione per ottenere delle chiavi crittografiche (nel nostro caso le pass wep o wpa o wpa2) riducendo in maniera significativa la necessità di risorse di sistema e di tempo.

La caratteristica principale di queste tabelle è che possono essere utilizzate unicamente per degli attacchi contro le hash delle password.

Le rainbow tables sono formate da righe (dette catene) e colonne. Nel nostro esempio, supponiamo di avere una tabella di M righe e N colonne

Come si generano le RAINBOW TABLES?

Le catene sono legate tra loro da una relazione simile ad una applicazione vettoriale, dominata da due tipi principali di funzioni irreversibili:

  • Funzione Hash:
    Simbolicamente la indichiamo come:

    Hash(password)

    La funzione di hash è sempre uguale in tutta la rainbow tables
  • Funzione Riduzione:
    La funzione di riduzione è ciò che contraddistingue le rainbow table, infatti sono delle funzioni che da un Hash genrano una stringa. Tale stringa non ha nulla a che fare con la password che ha generato l'hash. Simbolicamente lo indichiamo:

    R[x]( Hash(password) ) = stringa

    dove [x] è un indice numerico (1, 2, ecc.) che ci permetterà di contraddistinguere due funzioni di riduzione diverse, infatti ci sono diverse funzioni di riduzione nelle rainbow tables, tante quante sono le colonne, quindi N-1.


Cerchiamo ora di capire come sono collegate tra loro i vari termini di una catena.

  1. Da una prima password A1, che è il primo elemento della catena, si genera un hash:

    Hash(A1) = H1
  2. Dal H1, mediante una una funzione di riduzione, si ottiene una nuova password A2, che diventerà il secondo elemento della catena:

    R1 ( Hash(A1) ) = R1 ( H1 ) = A2
  3. Il processo riprende ciclicamente: la password A2 viene sottoposta ad Hash:

    Hash( R1 ( Hash(A1) ) ) = Hash(A2) = H2
  4. Mediante una nuova funzione di riduzione si genera una nuova password

    A3 che sarà al terzo posto della catena:
    R2 ( Hash( R1 ( Hash(A1) ) ) ) = R2 ( Hash(A2) ) = R2 ( H2 ) = A3
  5. - - -
  6. Il processo continua fino alla generazione di AN password differenti.

    AN = R(N-1) ( A(N-1) )


In definitiva abbaimo ottenuto una catena così composta:
A1 A2 A3 - - - AN


Questa catena altro non è che una applicazione lineare irreversibile del tipo:

Catena(A1) = [ A1 , R1 ( Hash(A1) ) , R2 ( Hash ( R1 ( Hash(A1) ) ) , - - - , AN ]

Questo tipo di applicazione è eseguita su una password B1, in questo modo otterremo una nuova catena da inserire sotto la precedente

Come sono legate tra di loro le colonne? La risposta è semplice: ad ogni colonna è stata applicata un solo tipo di funzione di riduzione:
  1. Alla prima colonna non è associata alcuna funzione di riduzione
  2. Alla seconda colonna è associata la funzione di riduzione R1
  3. alla terza colonna è associata la funzione di riduzione R2
  4. - - -
  5. Alla N-esima colonna è associata la funzione di riduzione R(N-1)


Quindi possiamo visualizzare la tabella come una cosa del tipo:

§R R1 R2 R3 - - - R(N-1)
§1 A1 A2 A3 - - - AN
§2 B1 B2 B3 - - - BN
- - - - - - - - - - - - -
§M Z1 Z2 Z3 - - - ZN

(scusate per la tabulazione...)

Questa è la rainbow table.