WPA crack: strumenti e tecniche

di: Andrea Draghetti     12 Luglio 2011

Introduzione

Il reverse engineering è la migliore tecnica per analizzare nel dettaglio il funzionamento di un qualsiasi codice del quale non si conosca il sorgente. In questo articolo applicheremo il reverse engineering agli access point di FastWeb e Alice per analizzare e ricavare l'algoritmo di assegnazione della chiave Wirelss WPA.

Il Reverse Engineering di Pirelli Fastweb

Accendendo l'access point il primo dato più evidente è l'SSID (il nome della rete Wireless), così formato: "Fastweb-Y-xxxxxxxxxxxx" dove Y può assumere il valore 1 o 2, le x rispecchiano il MAC Address della scheda wireless interna. Dalle prime 3 coppie del MAC è quindi possibile capire il produttore dell'Access Point. Noi analizzeremo un Access Point Pirelli identificabili dalle seguenti prime tre coppie di MAC Address: 00:08:27, 00:13:C8, 00:17:C2, 00:19:3E, 00:1C:A2, 00:1D:8B, 00:22:33, 00:23:8E, 00:25:53.

I passi svolti dall'algoritmo per generare la WPA predefinita partendo dal SSID sono i seguenti:

  • Estrae una sequenza di 6 byte dal SSID;
  • Inizializza i vettori MD5 (MD5Init);
  • Inserisce i 6 byte del SSID nella sequenza di cui calcola l'hash MD5 (MD5Update);
  • Ricalcola l'hash MD5 (dell'hash precedente) utilizzando una sequenza di 20 byte predefinita (MD5Update);
  • Finalizza l'hash MD5 (MD5Finish);
  • Dall'hash finale crea una sequenza binaria ottenuta considerando i primi 4 byte più significativi dell'hash.
  • Questa sequenza viene a sua volta suddivisa in 5 gruppi da 5 bit ciascuno. I bit in eccesso vengono scartati. Ed ogni gruppo di 5 bit viene riconvertito in esadecimale (*) riottenendo una sequenza di 5 byte.
  • Somma 0×57 ad ogni byte il cui valore sia >= 0xA (**).
  • La concatenazione di queste rappresentazioni (con lettere minuscole) genera la WPA di default.

(*) Una sequenza da 5 bit può assumere il valore compreso tra 0×00 e 0×1F.

(**) L'aggiunta della costante 0×57 avviene poiché i caratteri tra 0xA e 0×60 (estremi inclusi) non sono validi nello spazio chiavi considerato, per cui aggiungendo 0×57 a 0xA si ottiene, appunto, ox61 (primo carattere ammesso dopo 0×09).

I punti 2, 3 e 4 dell'algoritmo sono svolti dalla funzione cript_it; essa riceve in input una sequenza di 6 byte ottenuta dalla parte terminale del SSID raggruppando i byte in 6 gruppi da 2 cifre cadauno (00,12,34,56,78,90) e ne calcola MD5, algoritmo crittografico di hashing realizzato da Ronald Rivest nel 1991 e standardizzato con la RFC 1321.

Per migliorare l'algoritmo hanno aggiunto un salt (unk_100220D0), ovvero una sequenza speciale prefissata di 0×14 (20) byte, da inserire nella sequenza alterando in modo originale la creazione dell'hash MD5. Di seguito è riportato

un estratto della funzione in questione

(cript_it).

Cript_it
.text:00480FF8       la      $t9, atomac
.text:00480FFC       jalr    $t9 ; atomac
.text:00481000       move    $a0, $s0
.text:00481004       lw      $gp, 0xA8+var_98($sp)
.text:00481008       move    $s0, $v0
.text:0048100C       addiu   $a0, $sp, 0xA8+var_90
.text:00481010       beqz    $s1, loc_48109C
.text:00481014       la      $t9, MD5Init
.text:00481018       jalr    $t9 ; MD5Init
.text:0048101C       nop
.text:00481020       lw      $gp, 0xA8+var_98($sp)
.text:00481024       move    $a1, $s0
.text:00481028       addiu   $a0, $sp, 0xA8+var_90
.text:0048102C       la      $t9, MD5Update
.text:00481030       jalr    $t9 ; MD5Update
.text:00481034       li      $a2, 6
.text:00481038       lw      $gp, 0xA8+var_98($sp)
.text:0048103C       addiu   $a0, $sp, 0xA8+var_90
.text:00481040       li      $a2, 0x14
.text:00481044       la      $a1, 0x10020000
.text:00481048       la      $t9, MD5Update
.text:0048104C       jalr    $t9 ; MD5Update
.text:00481050       addiu   $a1, (unk_100220D0 - 0x10020000)
.text:00481054       lw      $gp, 0xA8+var_98($sp)
.text:00481058       addiu   $a0, $sp, 0xA8+var_20
.text:0048105C       la      $t9, MD5Final
.text:00481060       jalr    $t9 ; MD5Final

Conoscendo il delay slot, è evidente che l'indirizzo della sequenza segreta è unk_100220D0. A tale indirizzo troviamo:

0x22,0x33,0x11,0x34,0x02,0x81,0xFA,0x22,0x11,0x41,0x68,0x11,0x12,0x01,0x05,0x22,0x71,0x42,0x10,0x66

Un esempio pratico possiamo farlo con una rete avente SSID: FASTWEB-1-00193EA1B2C al stringa di 6 byte corrisponderà a: 00,19,3E,A1,B2,C3.

Si calcola l'hash MD5 di questi 6 byte secondo l'algoritmo sopracitato ottenendo: a37d4267f1d177f44d352978d95558a9. Di questo hash si considerano i primi 4 byte nella rappresentazione binaria, ovvero 10100011 01111101 01000010 01100111. Prendiamo questa sequenza e creiamo cinque gruppi di 5 bit ciascuno, ottenendo: 10100 01101 11110 10100 00100, che rappresentati in esadecimale diventano 0×14 0×0D 0×1E 0×14 0×04.

La chiave WPA che si ottiene da questa sequenza di byte confrontando ciascun byte con 0×0A, se risulta essere maggiore viene aggiunto il valore hex 0×57, sarà: 6b64756b04.

Guide Sicurezza

Guida SQL Injection con Sqlmap

Scopriamo se le nostre applicazioni web sono vulnerabili alle SQL...

Guida sicurezza applicazioni Web

Le tecniche di attacco più comuni, i metodi per verificare la...

Guida Sicurezza wireless

Quali sono i pericoli di sicurezza di una rete senza filo e quali...

Altre guide

Newsletter @Sicurezza

Ogni lunedì, direttamente nella tua e-mail: approfondimenti e bollettini su virus, vulnerabilità e sicurezza informatica.

Iscriviti alla newsletter

Altre newsletter

Corsi in aula

Amministratore di Reti Windows Server 2008

11 Giugno 2012 a Milano
Disponibilità: 5 Posti

Nessun corso previsto