Archive

Posts Tagged ‘full disclosure’

Telsey FASTWEB: Full Disclosure

September 9, 2010 56 comments

Telsey Fastweb

Ricordiamo che l’accesso abusivo ad un sistema informatico o telematico è un reato perseguibile a termine di legge (art. 615-ter c.p.). Inoltre ricordiamo che la detenzione e la diffusione abusiva di codici di accesso a sistemi informatici o telematici è un reato penale perseguibile secondo la legge 615-quater c.p.

Pertanto l’utilizzo di quanto esposto è da riferirsi a un test di sicurezza sulla propria rete o su una rete la quale il proprietario abbia espressamente dato il libero consenso al fine di giudicarne la sicurezza e porre rimedio ad eventuali vulnerabilità.

Gli Autori di questo Blog non potranno essere ritenuti responsabili di eventuali violazioni derivanti da un uso proprio o improprio delle tecniche esposte in questo articolo aventi uno scopo prettamente informativo e didattico. Qualsiasi implementazione dell’algoritmo di seguito riportato è illegale secondo gli articoli sopracitati.


Premessa

Come promesso in questo articolo descriveremo il procedimento con la quale l’algoritmo Telsey genera la wpa di default impostata da FASTWEB. Attualmente Fastweb distribuisce HAG Telsey sotto due diverse serie, ovvero 002196 e 00036F, ciò significa che le reti Fastweb identificate da un SSID del tipo FASTWEB-1-002196XXXXXX o FASTWEB-1-00036FXXXXXX appartengono a questa categoria. Di per sè l’algoritmo non è di difficile comprensione, ma il reverse dello stesso è stato piuttosto arduo.

All’interno di ogni Hag Telsey troviamo tra i binari un eseguibile precompilato per architettura MIPS32. Questo eseguibile, denominato key_gen contiene il cuore dell’algoritmo.

La procedura di configurazione dell’hag si appoggia al key_gen per ottenere la wpa passandogli come argomento il MAC Address della sheda di rete wifi situata al’interno dell’hag.

Accesso fisico all’HAG

Al fine di estrarre il firmware dal router, e pertanto il key_gen, è stato necessario avere l’accesso alla console seriale dell’apparecchio.

Nel nostro caso l’header della seriale era stato reso inattivo dalla casa madre omettendo delle resistenze fra i contatti di TX ed RX e le piste che andavano a collegarsi con la CPU, che ricordiamo è una Broadcom BCM96358 e quindi MIPS32 BigEndian (particolare importante per il reverse dell’eseguibile). Inoltre fra il pin Vcc e il pin TX era presente un cortocircuito che rendeva impossibile la comunicazione tramite console. Per poter attivare quindi a livello hardware la console sono state ripristinate le due piste ( RX e TX ) facendo dei ponti fra le piazzole delle resistenze SMD omesse, ed è stato rimosso il ponte fra TX e Vcc. In questo modo, una volta saldati i pin di connessione e configurati i parametri di comunicazione (che ricordiamo sono 115200 baud/s, 8 data bit e flow control Xon/Xoff) la console è risultata immediatamente accessibile e, invocata da linea di comando la system shell, è stato verificato che l’eseguibile di nostro interesse risiede, come nelle più comuni busybox, in /bin e che la sintassi per l’uso è key_gen mac_address (ex. key_gen 00:11:22:AA:BB:CC). La fase successiva è stata quella di creare un dump dell’intero firmware al fine di esportare sia l’eseguibile key_gen e sia le dipendenze di quest’ultimo. Per tale scopo è stata crosscompilata per piattaforma MIPS32 una versione di GNU tar, copiata su usb key ed eseguita on-the-fly direttamente dall HAG, in modo tale da creare un archivio contenente tutta la root. L’archivio è stato quindi salvato su una memoria flash usb collegata in una delle porte presenti nel pannello posteriore del router e montata da linea di comando.

Analizzando il key_gen con il comando strings abbiamo rilevato l’uso di due librerie. Esse, sia pur necessarie per l’esecuzione diretta del comando, sono librerie di runtime non necessarie per un’analisi dell’algoritmo che è risultato completamente contenuto nel file key_gen, come già anticipato.

Pertanto, dopo aver completato l’importazione in IDA del file, abbiamo analizzato l’algoritmo e scoperto che esso si articola in tre passi principali.

Descrizione dell’Algoritmo

Il MAC viene trattato, analogamente agli altri modelli, per essere rappresentato su 6 byte (ogni coppia di cifre = 1 byte in rappresentazione hex).

Ad esempio, il MAC 002196123456 corrisponderà ai 6 byte x00x21x96x12x34x56. Inizialmente viene creato un vettore di  256 byte. In questo vettore viene predisposto il MAC Address trattato come sequenza di byte secondo una permutazione statica a blocchi di 4 byte ciascuno. Lo schema di predisposizione per un generico MAC del tipo 112233445566 è il seguente:

66221166,22112266,55334433,55443333,33553311,33664422,11551122,22552211,
33553333,44224455,55225544,66226666,33221166,22112222,55332244,44446633
55556655,66225511,33661166,33224466,66333355,33442255,11555544,44116644,
55441111,44332222,33223366,22445544,11334455,11113333,11111166,22222255,
55113333,44444411,11335522,66666611,11556611,22226633,33336622,44443344,
22113355,22663366,11225511,22222255,33333333,44444444,66551122,55116666,
22116611,11226622,33335533,44555544,55442266,66662255,44112266,44221155,
55333366,55444422,33554411,33446622,44223344,66112233,66445522,11334411

Come si può notare il vettore è composto da 64 blocchi di 4 byte che sono ricavati dal mescolamento del mac in input. Quindi se ad esempio avessimo come input un mac del tipo AABBCCDDEEFF, il vettore sarebbe riempito in questo modo:FFBBAAFF,BBAABBFF,EECCDDCC,..........

Ogni singolo blocco viene predisposto in memoria  in modo da formare un intero a 32bit senza segno, il cui byte più significativo sia il primo dell’elenco e così a scendere.

Questo, su architetture big-endian come quella MIPS32, su cui è basato il router Fastweb Telsey, comporta semplicemente copiare i byte in memoria nell’ordine della quartina. Viceversa, su architetture little-endian (ad es. Intel x86), la copia dei byte va eseguita in ordine rovesciato (nel nostro esempio, i byte del primo blocco in memoria sarebbero 0x660x110x220x66). Alcune architetture adottano una endianess mista, e in quei casi l’ordine in cui copiare i byte sarà ancora diverso. Lo scopo di questa ripetuta copia parziale è probabilmente l’aggiunta di randomness all’intera procedura. Infatti, come si vedrà nel prosieguo dell’articolo, tutto l’algoritmo Telsey è concepito per sconfiggere approcci di crittoanalisi, tramite operazioni “imprevedibili”, miranti ad aggiungere “entropia” al risultato finale. Ad esempio, è di tutta evidenza che due MAC consecutivi daranno risultati totalmente diversi, a causa appunto della tabella di permutazione che porterà l’algoritmo a lavorare su molti interi diversi tra loro. Una volta riempito il vettore, alla base dell’algoritmo c’è una funzione di hash, non molto nota, denominata hashword implementata dal Dr. Bob Jenkins. Prototipo di hashword:

uint32_t hashword(const uint32_t*,   /* the key, an array of uint32_t values */
size_t ,   /* the length of the key, in uint32_ts */
uint32_t);    /* the previous hash, or an arbitrary value */ 

Il vettore viene processato in modo ricorsivo un blocco alla volta dando come risultato una sequenza di 4 byte espressa in esadecimale che chiameremo S1. La funzione hashword prende in ingresso come parametro un sequenza di 32 bit (unsigned), una dimensione (int)  e un valore di inizializzazione che inizialmente è posto a 0, successivamente, quest’ultimo assumerà il valore ottenuto in uscita nel precedente ciclo. Questo per 64 cicli, in modo da scorrere l’intero vettore. In termini di codice possiamo assumere quanto detto in questo modo:

for (x=0; x<64; x++){
valoreuscita = hashword(puntatoreVettore, x, valoreuscita);
}

Il secondo passo è quello di ottenere un nuovo vettore da 256 byte ricavato dal primo al quale vengono applicate alcune operazioni aritmetiche (LeftShift and RightShift) ad ogni blocco di byte. Riassumiamo in pseudo-codice anche questa procedura:

for (int x=0; x<64; x++){
    switch ( x) {
        case < 8: word[x] <<= 3; break;
        case < 16: word[x] >>= 5; break;
        case < 32: word[x] >>= 2; break;
        case default: word[x] <<= 7; break;
     }
}

Ricordiamo che uno shift verso sinistra equivale ad una moltiplicazione, mentre viceversa indica una divisione. Fatto ciò l’algoritmo riapplica la funzione hashword al nuovo vettore ottenenedo una nuova sequenza di 4 byte espressa in hex, che chiameremo S2.

L’utlimo passo è quello di estrarre la WPA di default dalle due sequenze ottenute:

WPA = S1[-5:] + S2[:5]

Ciò equivale a dire che la WPA si ottiene prendendo le ultime 5 cifre del primo risultato (S1) e le prime 5 cifre del secondo  (S2), con l’accortezza di rappresentare gli hash S1 ed S2 sempre in 4 byte.

Esempio pratico

Come al solito facciamo un esempio pratico per chiarire il procedimento appena descritto.

Supponiamo di avere un generico MAC Address Telsey: 002196123456. Il primo passo è quello di riempire il vettore da 256 byte secondo lo schema sopra descritto:

56210056 21002156 34961296 34129696 96349600 96561221 340021 21342100 96349696 12211234 34213412 56215656 96210056 21002121 34962112 ………

La funzione hashword applicata a questa sequenza di bye, in modo ricorsivo come spiegato, darà come risultato S1=3630692e. Applicando la serie di operazioni (LeftShift and RightShift) al vettore iniziale otteniamo il nuovo vettore:

b10802b0 8010ab0 a4b094b0 a094b4b0 b1a4b000 b2b09108 1a00108 9a10800 4b1a4b4 910891 1a109a0 2b10ab2 4b10802 1080109 1a4b108 9092b4 d0d158d 15884d00 25958015 ……..

L’hashword ricorsiva di questo nuovo vettore darà come risultato S2=a980930a. Da questi due valori, S1=3630692e ed S2=a980930a otteniamo infine la WPA di default: WPA = 0692ea9809


Conclusioni

Come avrete potuto notare il primo grave errore commesso dai progettisti è stato quello di affidare ad un tool precompilato l’intero algoritmo di generazione. Obiettivamente parlando, è più conveniente avere un modulo esterno su cui appoggiarsi, ma in questo ambito il discorso non vale. La prima priorità non deve essere la comodità ma la sicurezza delle informazioni contenute nell’hag. Chiunque con alcune nozioni di base può facilmente emulare un ambiente MIPS32 ed utilizzare l’eseguibile per scopi diversi da quello per cui è stato progettato senza reversare una riga del codice.

Altre scelte inopportune sono state già discusse in altri articoli e quindi eviteremo di ripeterli, ma che qui purtroppo abbiamo riscontrato nuovamente. Naturalmente l’uso di una funzione di hash, anche se non molto nota, ma di dominio pubblico non è stata una scelta condividibile. Il nostro consiglio rimane il medesimo: cambiare la wpa di default!

Come ultima considerazione vogliamo fare un po’ di luce sulle ultime vicende che abbiamo notato con disgusto nella rete.

Per principio morale ed etico siamo contrari a qualsiasi implementazione e tool degli algoritmi che abbiamo pubblicato. Ciò non vuol dire non avere le capacità di realizzare anche tool molto sofisticati.  Ovviamente ognuno è responsabile delle proprie azioni, ed è libero di attuare tutte le scelte che si vogliono, nè noi, nè altri possono criticare l’operato altrui. Ma una considerazione è d’obbligo. Abbiamo  sempre pubblicato le nostre ricerche senza chiedere mai nulla in cambio a nessuno, ricerche che se eseguite all’interno di un’azienda avrebbero potuto fruttare un bel po’ viste le difficoltà che abbiamo incontrato e l’importanza della gravità di vulnerabilità portate allo scoperto. Ma abbiamo preferito un’altra via, giusta o sbagliata che sia non è importante, è importante che sia stata una nostra scelta ed è giusto che gli altri la rispettino. La licenza Creative Commons 3.0  sotto quale abbiamo voluto rilasciare questi articoli, tra le clausole principali specifica che i nostri articoli NON possono essere utilizzati per fini commerciali. Potete, stamparli, modificarli e distribuirli a vostro piacimento, ma non potete venderli perchè noi non ve li abbiamo venduti.

Abbiamo evitato di intervenire  in discussioni che ci hanno coinvolto direttamente poichè preferiamo utilizzare il nostro tempo e le nostre risorse in modo proficuo, anche se i mezzi non ci sarebbero di certo mancati.

*** White Hats Crew ***

Alice AGPF: l’algoritmo!

June 2, 2010 283 comments

Il router AGPF

Ricordiamo che l’accesso abusivo ad un sistema informatico o telematico è un reato perseguibile a termine di legge (art. 615-ter c.p.). Inoltre ricordiamo che la detenzione e la diffusione abusiva di codici di accesso a sistemi informatici o telematici è un reato penale perseguibile secondo
la legge 615-quater c.p.

Pertanto l’utilizzo di quanto esposto è da riferirsi a un test di sicurezza sulla propria rete o su una rete la quale il proprietario abbia espressamente dato il libero consenso al fine di giudicarne la sicurezza e porre rimedio ad eventuali vulnerabilità.

Gli Autori di questo Blog non potranno essere ritenuti responsabili di eventuali violazioni derivanti da un uso proprio o improprio delle tecniche esposte in questo articolo aventi uno scopo prettamente informativo e didattico. Qualsiasi implementazione dell’algoritmo di seguito riportato è illegale secondo gli articoli sopracitati.


Premessa

Dopo il precedente articolo abbiamo deciso di espandere le nostre ricerche verso altri tipi di router. Quello che andrete a leggere fra poco tratta di un modello molto diffuso di router rilasciati da Telecom Italia (Alice).

Come al solito ribadiamo che il nostro obiettivo è quello di tutelare l’utente che utilizza questi dispositivi per navigare in internet. Per le notazioni di base rimandiamo alla pubblicazione precedente. Inoltre si avvisa che l’articolo risulta essere parzialmente incompleto. Non si escludo aggiornamenti successivi alla pubblicazione.

Con il precedente ci siamo accorti conto che alcuni individui con obiettivi molto lontani dai nostri hanno sfruttato il nostro lavoro per scopi prettamente personali e lucrativi. Teniamo a precisare, per chi non l’avesse notato, che le nostre ricerche sono rilasciate sotto licenza Creative Commons 3.0, ciò significa che i nostri articoli non possono essere utilizzati per fini commerciali e chi vorrebbe riportarli in blog, riviste ecc., è tenuto ad attribuirne la paternità dell’opera. Vi consigliamo di prendere visione di tutte le clausole della licensa.

Nonostante la scoperta di questo algoritmo sia avvenuta alcuni mesi fà abbiamo preferito pubblicare solo adesso la full disclosure per un motivo molto importate secondo la nostra etica. La tecnica che vedrete esposta più avanti ci permette di risalire alla WPA di default conoscendo solo SSID e MAC Address della rete in considerazione. La cosa più grave però fino a qualche mese fà era l’impossibilità di cambiare la chiave preassegnata, ciò rappresentava effettivamente un grave rischio per moltissimi utenti, considerando che Alice copre circa il 70% dei servizi per la fornitura dell’ADSL nel nostro Paese. Ciò significa che non ci si poteva difendere facilemte da questa grave vulnerabilità. Per fortuna però gli ingegneri di Telecom sono riusciti a progettare un nuovo firmware, per la precisione l’AGPF 4.5.0sx, che dà la possibilità all’utente di poter cambiare (finalmente) la chiave WPA di default preassegnata. Alla fine di questo articolo trovere alcuni utili consigli per aumentare la sicurezza nelle vostre reti, qualora avreste un router come quello descritto in questo articolo.


Introduzione

Tra gli operatori ADSL italiani, Telecom Italia si distingue per l’enorme varietà degli apparati hardware che fornisce ai propri clienti, con nomi commerciali spesso così simili tra loro che neanche si distinguono. Inoltre, altrettanto spesso, a oggetti esteticamente identici corrispondono architetture totalmente eterogenee. Siccome il lavoro del reverse engineer si concentra molto sull’architettura e poco o nulla sull’estetica e sul marketing, abbiamo imparato a riconoscere i router con i nomi dei rispettivi firmware. In questo caso, l’algoritmo qui discusso è relativo al router commercialmente denominato “PIRELLI Alice Gate VoIP 2 Plus Wi-Fi” in dotazione con l’abbonamento “Alice tutto incluso” e con firmware AGPF, di seguito lo chiameremo per comodità router AGPF.

Come è evidente, il primo problema da considerare è capire se dal semplice SSID (nome) della rete è possibile riconoscere un router con firmware AGPF, questo sarà il primo problema che andremo ad affrontare. Successivamente, ci occuperemo dell’algoritmo che viene usato dai router AGPF per calcolare la chiave WPA di default.


Riconoscere un router AGPF

Le reti WiFi di Alice vengono contraddistinte dalle altre per l’SSID avente la forma: “Alice-xxxxxxxx“, quindi  costiuite da un prefisso Alice- seguito da una serie numerica di 8 cifre. La parte numerica è necessaria a rendere univoci gli SSID tra tutti i clienti gestiti dall’ISP. Inoltre attraverso confronti e ricerche abbiamo notato che, come avveniva similmente per gli HAG Fastweb, le prime (2-3) cifre individuano la serie del router. La serie è un parametro cruciale: ci dà informazioni sul di tipo di router (quindi il firmware che monta), e aiuta nella determinazione del numero seriale del router. A differenza del caso Fastweb Pirelli, in cui la parte variabile dell’SSID è l’unica informazione necessaria, nei router Telecom sono necessari dei codici non direttamente intercettabili via etere dal wardriver, ma tuttavia spesso calcolabili algoritmicamente conoscendo l’SSID della rete e il MAC della scheda WiFi interna al router: si tratta di un seriale anch’esso univoco associato al router. Il seriale (SN) di un router AGPF è formato da una parte variante per serie, un simbolo fisso e una parte variante per singolo apparato: 12345X1234567. Le cinque cifre prima della X variano per serie di router, iniziano per 6790 o 6910 (almeno dai dati fino adesso analizzati). La X è un simbolo costante, e separa le due parti del SN. Le altre cifre cambiano da router a router secondo un particolare meccanismo che abbiamo dedotto, li abbiamo denominati numeri magici (altri modelli di router usano un formato analogo per i seriali ma non è chiaro se rispettano lo stesso meccanismo di generazione).Verificare se un router è AGPF (o di un altro tipo, AGIF, da cui non è a priori possibile distinguerlo) richiede l’emulazione  dell’algoritmo usato dal router per generare l’SSID a partire dal MAC WiFi e verificare la coincidenza del risultato calcolato con quello che effettivamente si riscontra dal tool di sniffing. Siccome nè l’SSID nè il MAC sono parametri variabili nelle reti Alice, l’esito positivo della verifica dirà al 100% se si tratta di un modello AGPF (o AGIF).

L’algoritmo di questa parte, estratto e commentato dal reverse del firmware, è il seguente:

.text:004C70F0
la $t9, atomac // Ottiene il puntatore al mac e lo mette in v0
lbu $v1, 2($v0) // Prende il 3° byte
move $s0, $v0 // Copia il putnatore perchè gli serve il registro
lbu $v0, 3($v0) // Carica il 4° byte
lbu $a0, 4($s0) // Carica il 5°
andi $v1, 0xF // Prende solo un nibble dal 3° byte
lbu $a1, 5($s0) // Carica il 6° ed ultimo byte
sll $v0, 16
sll $v1, 24
or $v1, $v0
sll $a0, 8
or $v1, $a0
lui $v0, 0x55E6 // Questa non serve a niente
or $v1, $a1 // Le funzioni fino quì servono a prendere una parte del mac e convertirla in un int

Come al solito chiariamo tutto con un semplice esempio: supponiamo che 00238e5e5f68 sia il nostro mac.
L’algoritmo fino a questo punto punto avrà in v1 il valore e5e5f68 che, come si può notare, è una parte del mac  stesso.

li $v0, 0x55E63B89 // Carica il valore in v0
mult $v1, $v0 // Lo moltiplica per la parte del mac
li $a3, 0x5F5E100 /// Carica il valore in a3
mfhi $v0 // solita storia della hiword dopo la moltiplicazione
srl $v0, 25 // Shift della hiword
mul $t0, $v0, $a3 // moltiplica il valore 0x5F5E100 per quello ottenuto dal precedente shift
subu $a3, $v1, $t0 // sottrae alla parte del mac il nuovo valore ottentuo dalla precedente moltiplicazione

Adesso, con quest’altra parte dell’algoritmo avremo finalmente in a3 il nostro ssid generato. Quindi se dal mac non ricavo un ssid uguale a quello noto deduco che non sia AGPF/AGIF. Come si vede, è un semplice algoritmo basato su operazioni logico-aritmetiche, banalmente implementabile da chiunque abbia minime conoscenze di programmazione.

Seriali, Serie e Numeri Magici

Come detto in precedenza, ogni router oltre ad avere un proprio firmware ha anche una serie, corrispondente alla prima parte del seriale (SN) riportato su ogni router. Da un’accurata analisi del tutto statistica siamo riusciti a trarre alcune conclusioni in merito solo per alcune serie. Siamo però convinti che deve esistere un algoritmo universale in grado di individuarli tutti. Non essendo il nostro interese di natura statistica abbiamo limitato le nostre ricerche sui dati a cui abbiamo avuto la possibilità di analizzare.

Riprendendo il discorso dei numeri magici siamo riusciti, tramite confronti tra due o più seriali, ad individuare dei valori costanti che si ripeteno. Il seriale è calcolabile mediante un’equazione tutto sommato abbastanza semplice  conoscendo solamente la parte numerica dell’SSID della rete. E’ stato infatti scoperto che la relazione che sussiste tra SN e SSID è di aritmetica modulare: esistono due costanti, che definiremo con  k e Q, dipendenti dalla serie del router, tale che SSID=k*SN+Q (dove con SN indicheremo la seconda parte del seriale, quella dopo la X, la prima parte è fissa per ogni serie), da questa formula ricaviamo la formula finale SN=(SSID-Q)/k. Naturalmente un’equazione e due incognite non ammette un’unica soluzione, per questo abbiamo impostant un sistema che prende in considerazione i dati di due router della stessa serie.

Supponiamo ad esempio di avere questi due dati:

  1. SSID: Alice-96154825 SN: 69102X0010598
  2. SSID: Alice-96140044 SN: 69102X0009461

Dalla precedente formula impostiamo un sistema lineare di due equazioni in due incognite:

\begin{cases}  SN1=(SSID1-Q)/k \\ SN2=(SSID2-Q)/k\end{cases}

ottenendo così le seguenti soluzioni:

Q=\frac{(SSID2 \cdot SN1)-(SSID1 \cdot SN2)}{(SN1-SN2)} \hspace{1cm}  k=\frac{(SSID1-SSID2)}{(SN1-SN2)}

Da questa soluzione ricaviamo che, per i dati di esempio, otteniamo Q=96017051 e k=13. Una volta ottenuti questi “numeri magici” siamo ingrado di calcolare il SN completo di qualsiasi router facente parte della stessa serie, conoscendo solamente l’SSID. Le serie fino adesso indviduate sono:

  • Alice-96xxxxxx  Serie: 69102X*******   k=13   Q=96017051
  • Alice-93xxxxxx  Serie: 69101X*******   k=13   Q=92398366
  • Alice-56xxxxxx  Serie: 67902X*******   k=13   Q=54808800
  • Alice-55xxxxxx  Serie: 67904X*******   k=8     Q=55164449
  • Alice-54xxxxxx  Serie: 67903X*******   k=8    Q=52420689
  • Alice-48xxxxxx  Serie: 67903X*******   k=8    Q=47896103
  • Alice-46xxxxxx  Serie: 67902X*******   k=13   Q=39015145

Analisi dell’algoritmo di generazione WPA

La generazione della WPA dipende sostanzialmente da tre parametri: due variabili e uno costante, quest’ultimo  utilizzato in una procedura analoga descritta nell’algoritmo Pirelli Fastweb: calcolo dell’hash con input MAC del router e SN del router. Come noto, il MAC è ottenibile mediante i più comuni strumenti di sniffing WiFi, è un dato appena un pò meno plateale del SSID.  Ammettendo tuttavia di aver reperito le tabelle note, e di saper quindi calcolare il SN e conoscendo il MAC, l’operazione di generazione è molto simile a quella descritta in precedenza. Si usa, stavolta, un algoritmo di hashing diverso dall’MD5, l’SHA256. In particolare, si inizializza un vettore di calcolo dell’SHA256, e si forniscono in sequenza i seguenti tre elementi:

  • Mac Address delle scheda WiFi del router (considerato in byte)
  • Seriale completo del router (considerato come stringa)
  • Sequenza speciale (costante, in byte)

Procedura

  1. Si inizializza una SHA256
  2. Si aggiorna la SHA con i 32 byte della sequenza speciale
  3. Si aggiorna la SHA con il SN
  4. Si aggiorna la SHA con i 6 byte del MAC
  5. Si finalizza l’hash SHA di tutti questi dati
  6. Si usa una tabella di encoding speciale che a ciascun byte dell’hash fa corrispondere un altro simbolo
  7. I primi 24 byte della trasformazione così ottenuta rappresentano la WPA

I punti dell’algoritmo dall’1 al 5 equivalgono sostanzialmente ad effettuare l’ash utilizzando l’algoritmo SHA256 della concatenazione di Hash=SHA256(MagicN+SN+MAC). Dove il primo e l’ultimo argomento devono essere trattati come sequenza di byte, mentre il serial viene inserito come “stringa”.

Il codice speciale utilizzato nell’algoritmo e ricavato per ispezione nel disassemblato è il seguente:

unsigned char ALIS[32] = {
 0x64,0xC6,0xDD,0xE3,0xE5,0x79,0xB6,
 0xD9,0x86,0x96,0x8D,0x34,0x45,0xD2,
 0x3B,0x15,0xCA,0xAF,0x12,0x84,0x02,
 0xAC,0x56,0x00,0x05,0xCE,0x20,0x75,
 0x91,0x3F,0xDC,0xE8
};

Alla fine di quest’operazione otterremo un hash costituito da una sequenza di 32 byte (64 caratteri HEX).
A questo punto, è stata prevista nell’algoritmo alcune trasformazioni sui singoli byte memoryless (ovvero, ciascun byte viene trasformato in modo  indipendente dagli altri e secondo lo stesso identico algoritmo). Sarebbe possibile replicare in qualsiasi linguaggio il codice ASM MIPS (non si tratta di altro che di shift, trasformazioni aritmetiche, …) ma da un’attenta osservazione si è arrivati a costruire un vettore che contiene tutte le possibili combinazioni dalla conversione. Bisogna partire dal presupposto che ogni byte della sequenza dell’hash può assumere 16^2 (256) combinazioni possibili quindi da 0x00 a 0xFF o in decimale da 0 a 255. Il charset utilizzato in una generica WPA è costituito dalle cifre da 0 a 9, e da tutte le lettere dell’alfabeto in minuscolo. Replicando questa sequenza su un vettore a 256 elementi si ottiene lo spazio di varizione di tutti i byte. Ciò significa che ogni byte verrà convertito grazie a questo vettore in un carattere corrispondente. Tra poco vedremo un esempio che ci chiarirà le idee.
Questo è il vettore che andremo ad utilizzare:

 unsigned char preInitCharset[] = {
'0','1','2','3','4','5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3',
'4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7',
'8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r',
's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b',
'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l','m', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f',
'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3',
'4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2','3'
};

Ogni byte dell’hash ottenuto dall’algoritmo viene inizialmente convertito in decimale, questo numero può essere  utilizzato come indice nel vettore appena descritto ottenendo man mano tutte le lettere o cifre che compongo la WPA. Quindi ad esempio CharSet[37] = ‘1’, CharSet[19] = ‘j’, CharSet[200] = ‘k’,  ecc..
Naturalmente questo non è l’unico modo per effettuare la conversione, ma è sicuramente molto semplice da implementare ed efficace nell’utilizzo.

Esempio pratico

Come al solito i dati che vedrete in seguito sono di pura fantasia avente solamente lo scopo di confermare il corretto procedimento dell’algoritmo.

Supponiamo di avere una rete WiFi Alice avente i seguenti dati:

  • SSID: Alice-12345678
  • MAC: 00:23:8E:01:02:03
  • SN:    67902X0587411

Applicando l’algoritmo sopra spiegato otteniamo con questi dati un hash sha256 di questo tipo: b1d5d0dc8f3a2132d7872641250f998d53e58824ecb9118e046a943239bf1220

Adesso considerando un byte per volta dobbiamo effettuare le conversioni per ottenere la WPA nella forma che conosciamo.

0xB1 = 177 –> ‘x’
0xD5 = 213 –> ‘x’
0xD0 = 208 –> ‘s’
0xDC = 220 –> ‘4’
0X8F = 143 –> ‘z’
………
ottenendo alla fine la seguente WPA: xxs4zmxezr2t1f9xbds0k5hy
Naturalmente per l’estrazione della WPA interessano solo i primi 24 byte dell’hash.

Coclusioni

Inizialmente il progetto di Alice Telecom Italia è stato studiato principalemente per scoraggiare ogni tentativo di bruteforce sulla chiave di crittazione della rete. Disporre di una WPA costituita da 24 simboli tra cifre e numeri scoraggia ogni vano tentativo di “indovinarla”. Infatti se ci pensiamo le combinazioni possibili sono “appena” 36^24 un numero di inimmaginabile grandezza. Nonstante ciò, Telecom però ha pensato di disabilitare la modifica della chiave di default preassegnata per evitare magari che gli utenti mettessero chiavi meno sicure. Questo però rappresenta una lama  a doppio taglio. E’ vero che quella preassegnata è una chiave molto robusta,  ma se si trova un modo (come quello appena descritto) di ricavare questa chiave è evidente che l’utente non può più difendersi da questa insicurezza.

Abbiamo già parlato nella premessa del modello successivo di AGPF (la variante sx), in cui apparentemente cambia il criterio di creazione dell’SSID e la WPA è configurabile, finalmente, dall’utente. finale Tuttavia l’algoritmo utilizzato è ugualmente reperibile operando attravero il reverse engineering. Ma rimane un problema fondamentale.
L’aggiornamento del nuovo firmware viene attuato attraverso la telegestione, in pratica, il router connesso ad internet si dovrebbe aggiornare in modo del tutto automatico. Questo è possibile verificarlo accedendo attravrso l’interfaccia di rete al router e controllando la sezione “Dettagli modem” dove sono riportate tutte le caratteristiche.
Il problema di fondo di cui acennavamo prima rimane sempre lo stesso. Quanti utenti cambieranno la chiave WPA di default? Quanti utenti vengono informati di questa possibilità?

Sperando di aver dato un contributo positivo alla sicurezza nelle reti da parte nostra vi consigliamo sempre di cambiare la WPA di default in una totalmente random, complessa  e non inferiore ai 24 caratteri. Qualora qualcuno si accertasse che la propria versione di firmware per il router in questione sia inferiore alla 4.5.0sx è possibile richiedere un aggiornamento contattando direttamente l’assistenza di Alice.

****  White Hats ****

Pirelli Fastweb – Free Access!

March 25, 2010 37 comments

Ricordiamo che l’accesso abusivo ad un sistema informatico o telematico è un reato perseguibile a termine di legge (art. 615-ter c.p.). Inoltre ricordiamo che la detenzione e la diffusione abusiva di codici di accesso a sistemi informatici o telematici è un reato penale perseguibile secondo la legge 615-quater c.p.

Pertanto l’utilizzo di quanto esposto è da riferirsi a un test di sicurezza sulla propria rete o su una rete la quale il proprietario abbia espressamente dato il libero consenso al fine di giudicarne la sicurezza e porre rimedio ad eventuali vulnerabilità.

Gli Autori di questo Blog non potranno essere ritenuti responsabili di eventuali violazioni derivanti da un uso proprio o improprio delle tecniche esposte in questo articolo aventi uno scopo prettamente informativo e didattico.


Ciò che leggerete in questo post è il frutto di alcune ricerche effettuate da persone appassionate di wifi e tecniche di sicurezza. Anche se il titolo potrebbe far pensare altrimenti è bene capire che il senso etico della guida non è violare reti altrui.. bensì proteggersi, prendere adeguate misure di sicurezza e capire quanto e come il cliente viene tutelato dal proprio ISP. Nonostante questo post sia esclusivamente relativo a Fastweb, il problema non riguarda solamente questo provider ma la più generale nozione di sicurezza dei provider Italiani.

La maggior parte degli utenti che scelgono una encriptazione WPA-PSK si sentono abbastanza sicuri in quanto questo protocollo risulta essere molto robusto, e ciò è effettivamente vero! Ma da quello che apprenderete vi renderete subito conto che il problema sta da un altra parte. Molto spesso tra le sedia e la tastiera! Molte società preferiscono spendere milioni di € in campagne pubblicitarie e non si curano di realizzare dei progetti robusti in termini di sicurezza per garantire la privacy del Cliente.

  • La prima parte di questo articolo sarà una breve introduzione alle notazioni utilizzate e le specifiche tecniche a cui si farà riferimento.
  • Nella seconda parte vedremo nel dettaglio le scelte progetuali adottate per la costruzione della chiave WPA-PSK predefinita impressa nell’etichetta sotto ogni router. Parleremo inoltre dell’architettura degli HAG Fastweb e del modello Pirelli in particolare.
  • Nella terza parte vedremo invece la tecnica di Reverse Enginnering applicata ad un firmware Pirelli Fastweb che ci ha portato alla scoperta dell’algoritmo di generazione della chiave WPA di default.
  • Infine nell’ultima parte accenneremo alle possibili soluzioni per ovviare questi tipi di problemi e garantire perciò una maggiore sicurezza per le comunicazioni di tipo wireless.

Notazioni

MAC Address: codice di 48 bit (6 byte) assegnato in modo univoco ad ogni scheda di rete ethernet prodotta al mondo. Rappresenta in sostanza un nome per un particolare dispositivo di rete. Gli indirizzi MAC vengono solitamente rappresentati in formato esadecimale, separando ciascun ottetto con un trattino o con i due punti. Un esempio di indirizzo MAC è “00-08-74-4C-7F-1D”. Confrontando i primi tre ottetti con le assegnazioni OUI dell’IEEE, si può osservare come esso appartenga alla Dell Corporation, mentre gli ultimi tre ottetti rappresentano il numero seriale assegnato al componente dal produttore.

Ogni scheda ha un indirizzo unico perché i primi 24 bit sono identificativi della casa produttrice e i successivi della scheda. In questo modo ogni casa produttrice ha a disposizione 2 alla 24 indirizzi, quindi può produrre più di 16 milioni di schede; se un produttore ne produce meno, gli indirizzi (a 48 bit) non assegnati vengono persi, non potendo essere utilizzati da altri costruttori. Una lista dei vendors si può trovare a questo indirizzo: Vendors

SSID: il Service Set Identifier è il nome con cui una rete Wi-Fi si identifica ai suoi utenti. Spesso gli access point sono configurati in modo da annunciare continuamente i loro SSID, cossicché i dispositivi Wi-Fi possano creare un elenco delle reti disponibili nella zona in cui si trovano.

WEP: Wired Equivalent Privacy: è un protocollo di sicurezza per reti wireless ormai insicuro e ritenuto legacy.

WPA-PSK: Wi-Fi Protected Access (WPA e WPA 2) è un programma di certificazione e un protocollo per la sicurezza di reti wireless, basato sull’uso di password, amministrato dall’alleanza del Wi-Fi come forma di protezione per le reti di computer wireless.

HAG: Home Access Gateway. Apparato di rete in dotazione dei clienti Fastweb, l’equivalente router/modem fornito ai clienti di altri ISP nazionali. In ingresso riceve un segnale digitale proveniente dalla rete Fastweb, in uscita fornisce un segnale telefonico analogico tradizionale e un segnale dati a velocità variabile, dipendente dal tipo di cablaggio dell’utenza: fibra ottica o xDSL.

Brute Force: Il metodo “forza bruta” è un algoritmo di risoluzione di un problema che consiste nel verificare tutte le soluzioni teoricamente possibili fino a che si trova quella effettivamente corretta.

Il suo principale fattore positivo è che consente teoricamente sempre di trovare la soluzione corretta, ma per contro è sempre la soluzione più lenta o dispendiosa; viene utilizzato come ultima risorsa sia in crittanalisi che in altre parti della matematica solamente in quei casi dove sia l’unico procedimento conosciuto.

Attacco a dizionario: Nella crittanalisi e nella sicurezza informatica, un attacco a dizionario è una tecnica per “rompere” un codice cifrato o un meccanismo di autenticazione provando a decifrare il codice o a determinare la passphrase cercando tra un gran numero di possibilità. In pratica si tenta di accedere a dati protetti da password (sia remoti, come ad esempio accounts su siti web o server di posta; sia locali, come documenti o archivi protetti da password) tramite una serie continuativa e sistematica di tentativi di inserimento della password, solitamente effettuati in modo automatizzato, basandosi su uno o più dizionari. In contrasto con un metodo forza bruta (o attacco brute force), dove tutte le possibili password sono ricercate in maniera esaustiva, un attacco a dizionario prova solamente le possibili password più probabili. Si può usare una lista di parole probabili (detta dizionario).

MIPS: acronimo di Microprocessor without Interlocked Pipeline Stages, è un processore di architettura RISC sviluppato da MIPS Computer Systems Inc. Il MIPS è utilizzato nel campo dei computer SGI, e hanno trovato grossa diffusione nell’ambito dei sistemi embedded, dei devices di Windows CE e nei router di Cisco . Le console Nintendo 64, Sony PlayStation, Sony PlayStation 2 e Sony PlayStation Portable utilizzano processori MIPS, nonchè gli HAG forniti da Fastweb ISP, che si basano su un’architettura a 32 bit.

IDA: IDA Pro Disassembler and Debugger è un interattivo, programmabile, estensibile, multi-processore, disassemblatore disponibile per sistemi Windows, Linux e Mac OS X. IDA PRO è diventato un software standard per l’analisi del codice ostile alla ricerca di vulnerabilità. Per maggiori informazioni visitare il seguente link: executive overview

Questa guida non ha la pretesa di essere esaustiva sotto ogni aspetto, ma ha lo scopo di aiutare nella logica il lettore, affinchè giunga da solo alle proprie conclusioni. Si invita quindi ad approfondire in maniera autonoma eventuali argomenti di interesse.

Gli HAG Fastweb oggi

La rete Fastweb attualmente distribuisce due modelli di Hag-Fastweb WiFi di due ben note case costrustrici: Telsey e Pirelli.

Per entrambi, Fastweb utilizza un algoritmo proprietario per assegnare in modo univoco una chiave WPA-PSK predefinita dato il rispettivo MAC ADDRESS della scheda wifi interna. Ciò significa che dato un qualsiasi Hag questo è identificato da tre parametri principali: Serial, SSID, WPA-PSK default, MAC Address.

Inoltre l’SSID di rete ha il sequente forato: “Fastweb-A-xxxxxxxxxxxx” dove A può assumere il valore 1 o 2, le x rispecchiano di solito il Mac Address della scheda wireless interna. Dalle prime 3 coppie del MAC è quindi possibile capire di che Hag si tratta. Per i Pirelli Fastweb gli indirizzi sono comunemente del tipo: FASTWEB-1-001CA2xxxxxx o FASTWEB-1-001DBXxxxxxx mentre per i Telsey Fastweb: FASTWEB-1-00036Fxxxxxx oppure FASTWEB-1-002196xxxxxx. Può capitare però che l’SSID non corrisponda al MAC, almeno per le ultime tre coppie. Questo si può facilmente verificare facendo un confronto diretto oppure attraverso uno sniffer di rete come ad esempio kismet.

La chiave WPA-PSK generata di default per ogni Hag è una chiave composta da 10 cifre esadecimali (10 cifre in modo che la stessa chiave supporti contemporanemente lo standard WPA e WEP). Facendo diverse ricerche e riscontri su questo tipo di dati siamo riusciti a capire il significato di quelle lettere apparentemente casuali ed insensate. Per capire meglio il concetto ci affidiamo a qualche esempio pratico reale.

Questi sono i dati (fac-simili) di possibili reti Fastweb Pirelli:

SSID: FASTWEB-1-001CA2AAAAAA

Mac: 00-1C-A2-AA-AA-AA

WEP/WPA PSK: 0964080272


SSID: FASTWEB-1-001CA2BBBBBB

Mac: 00-1C-A2-BB-BB-BB

WEP/WPA PSK: 6b6c657368


SSID: FASTWEB-1-001CA2CCCCCC

Mac: 00-1C-A2-CC-CC-CC

WEP/WPA PSK: 690268086f

Adesso analizziamo le tre chiavi WPA un po’ più da vicino.

0964080272, 6b6c657368, 690268086f

Notiamo subito che le chiavi sono composte da valori esadecimali, aventi quindi un charset di questo tipo {0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f}

Qui notiamo subito il primo errore progettuale: Scegliere una chiave WPA di 10 caratteri in uno spazio chiavi abbastanza ristretto, tale da favorire un bruteforce attack. Date le crescenti potenze di calcolo, le chiavi WPA dovrebbero tendere più alla lunghezza massima di 64 caratteri che alla minima di 8. 10 caratteri (casuali) sembrano ancora tutt’oggi un numero tale da scoraggiare la forza bruta, ma come vedremo in realtà lo spazio di ricerca in questo caso è molto più stretto.

Maggiori dettagli

Come accennato sopra la password Fastweb WPA è violabile in tempi più che ragionevoli con un meccanismo di bruteforce. Però, l’assunzione alla base di questa procedura è che la generazione della PSK sia casuale. E se invece casuale non fosse ciò che casuale appare? E, soprattutto, se l’algoritmo del tutto deterministico e ripetibile alla base di questa generazione, dipendesse da dati che è alla portata di chiunque ottenere? Se così fosse l’intero scopo della protezione WPA sarebbe sconfitto in partenza: chiunque potrebbe estrarre i dati e calcolare le PSK che gli interessano.

La nostra ricerca intende dimostrare che nel caso dei router Fastweb Pirelli la preshared key è funzione dell’SSID (ovvero, del nome stesso della rete). La vulnerabilità è particolarmente grave, in quanto l’SSID è il dato pubblico per definizione: volendo o meno, qualsiasi software di gestione wifi lo mostra apertamente.

Primo passo necessario allo sviluppo della ricerca è stata l’estrazione del firmware da un router e la successiva importazione in un ambiente adatto allo studio del codice assembler così ottenuto.

A tale scopo abbiamo analizzato il firmware utilizzando un ottimo software: IDA PRO.

Tale ambiente consente la navigazione del codice ASM MIPS, risolve automaticamente i riferimenti tramite le tabelle dei simboli e in generale semplifica enormemente il lavoro di reversing consentendo di concentrarsi sulla lettura e comprensione del codice.

Una spiacevole (piacevole) sopresa è stata la presenza, nel disassemblato di tutte le funzioni con nomi fortemente autoesplicativi (ulteriore grave errore, a nostro avviso, da parte dei programmatori) questo ci ha permesso di semplificare straordinariamente l’analisi del firmmware.

Il cuore dell’algoritmo si svolge nella soubroutine: cript_it. Tale funzione, dal nome palesemente esplicativo, viene invocata indirettamente durante la generazione dei parametri WiFi del dispositivo. Ad essa viene passato come parametro proprio il nome della rete, o meglio parte di esso, che sostanzialmente rappresenta il MAC Address della scheda wifi contenuta nell’HAG, trattato secondo un algoritmo proprietario non difficile da comprendere.

Analisi dell’Algoritmo

In sintesi questi sono i passi svolti dall’algoritmo per ricavare la WPA predefinita partendo dall’SSID di rete.

  1. Estrae una sequenza di 6 byte dall’SSID.
  2. Inizializza i vettori MD5 (MD5Init).
  3. Inserisce i 6 byte dell’SSID nella sequenza di cui calcola l’hash MD5 (MD5Update).
  4. Ricalcola l’hash MD5 (dell’hash precedente) utilizzando una sequenza di 20 byte predefinita (MD5Update).
  5. Finalizza l’hash MD5 (MD5Finish).
  6. Dall’hash finale crea una squenza binaria ottenuta considerando i primi 4 byte più significativi dell’hash.
  7. 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.
  8. Somma 0x57 ad ogni byte il cui valore sia >= 0xA (**).
  9. La concatenazione di queste rappresentazioni (con lettere minuscole) è la WPA PSK di default.
(*) Una sequenza da 5 bit può assumere il valore compreso tra 0x00 e 0x1F.
(**) L’aggiunta della costante 0x57 avviene poichè i caratteri tra 0xA e 0x60 (estremi inclusi) non sono validi nello spazio chiavi considerato, per cui aggiungendo 0x57 a 0xA si ottiene, appunto, ox61 (primo carattere ammesso dopo 0x09).

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 dell’SSID raggruppando i byte in 6 gruppi da 2 cifre cadauno (00,12,34,56,78,90), e considerando ciascun gruppo un byte espresso in base 16.

Cosa ne fa è presto detto: ne calcola l’MD5 (per la precisione, inserisce questi 6 byte in una sequenza di cui sarà calcolato l’MD5). La procedura MD5 è nota, documentata, e trovarne implementazioni è alla portata di tutti, in ogni linguaggio: BASIC, C/C++, Pascal, C#, COBOL, … basta una semplice ricerca.

Un esperto di tecniche crittografiche avrebbe sicuramente riconosciuto l’algoritmo anche se la routine invocata si fosse chiamata in modo più oscuro (e avrebbe comunque potuto replicare il codice ASM in un linguaggio a scelta, senza capire di star reimplementando un algoritmo noto in letteratura), ma dichiarare platealmente l’uso dell’MD5 è stata un‘ulteriore semplificazione al nostro lavoro.

Usare solo l’SSID così trattato sarà però sembrato sin troppo banale. Si è allora deciso di aggiungere un salt, ovvero una sequenza speciale prefissata di 0x14 (20) byte, da inserire nella sequenza alterando in modo originale la creazione dell’hash MD5! Derivare il salt è stato abbastanza semplice per chi aveva conoscenze pregresse di assembler MIPS, in quanto il codice si avvaleva di una feature tipica di quell’architettura: il delay slot (riteniamo che non sia stata una deliberata scelta offuscativa dei programmatori, ma l’opera del compilatore intenzionato ad usare ogni ciclo in computazione attiva, e minimizzare i NOP).

Tale caratteristica del MIPS32 implica che quando si esegue un salto (o una chiamata di subroutine), la CPU non la esegue subito, ma ha appunto un ciclo “libero” per svolgere un’altra istruzione.

Di seguito è riportato un’estratto della funzione in questione (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

Esempio pratico

Poniamo il caso in cui si abbia la propria rete Fastweb avente un SSID di questo tipo FASTWEB-1-00193EA1B2C3.

I 6 byte da considerare sono 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. Di questa sequenza binaria si formano 5 gruppi di 5 bit ciascuno, ottenendo: 10100 01101 11110 10100 00100, che rappresentati in esadecimale diventano 0x14 0x0D 0x1E 0x14 0x04.

La WPA key si ottiene da questa sequenza di byte confrontanto ciascun byte con 0x0A, se risulta essere maggiore viene aggiunto il valore hex 0x57 (per il motivo precedentemente spiegato) ottenendo così la seguente chiave: 6b64756b04.

Ovviamente, questi sono dati d’esempio (non reali) utilizzati per dimostrare la validità dell’algoritmo.

Le nostre Conclusioni

Non si può evitare, in conclusione, di segnalare che le operazioni dei progettisti sono carenti sotto diversi aspetti:

1) Legare la chiave WPA a dati pubblicamente conoscibili. Chiunque può usare uno sniffer (kismet o airodump) per ricavare ESSID e MAC Address delle reti Fastweb Pirelli (tra l’altro, l’ESSID viene rivelato già dal software di gestione delle reti wireless, senza necessità di un approccio attivo di wardriving). Legare la chiave a informazioni interne del router/modem non deducibili da alcuna combinazione di MAC ed ESSID sarebbe stata una scelta più accurata. Usare algoritmi casuali sarebbe la scelta ideale . Ovviamente, l’uso di casualità deve essere tale da rendere innocuo ogni tentativo di bruteforcing. Ad esempio, rendere del tutto random il quinto byte della chiave non ha senso (un bruteforce su 256 valori si completa in tempi inferiori al secondo su molti sistemi). Selezionare in maniera totalmente random i 20 byte della sequenza, questo sì avrebbe impedito l’approccio alla base di quest’articolo.

Una soluzione più semplice, ma altrettanto efficace, sarebbe stata quella di legare la chiave WPA non al MAC della scheda 802.11 dell’HAG, ma a quello dell’interfaccia Ethernet (ogni scheda Ethernet ha un MAC univoco). Non essendoci alcun legame tra la scheda WiFi e quella Ethernet all’interno dello stesso Hag, la scelta avrebbe impedito una reperibilità on the fly dei dati necessari all’algoritmo, annullando la vulnerabilità concreta connessa alla scoperta dell’algoritmo.

2) Fare il deployment in produzione di router con un firmware con i simboli presenti. La totale mancanza di nomi delle funzioni e variabili avrebbe reso fortemente complicato se non quasi impossibile il lavoro di analisi del firmware. L’unico approccio utilizzabile in tal caso, sarebbe stata la simulazione del codice MIPS su un sistema di emulazione, al fine di dedurre il “punto” in cui effettivamente veniva scritta in memoria la chiave di rete, e un successivo traceback nel codice. Si sarebbe potuto anche far uso di tecniche di offuscamento del codice e di meccanismi anti-debugging, tipici di software commerciali.

3) Aver generato password di soli 10 simboli, tra l’altro cifre esadecimali. Ad una analisi fortemente sommaria è possibile restringere lo spazio di ricerca a 256 alla quinta valori (256 valori possibili in un byte per 5 byte, che danno luogo a 10 cifre se stampati in esadecimale). Analisi più accurate rivelano che i valori dei byte rappresentano lettere dell’alfabeto in minuscolo (a-z) e numeri da 00 a 09 della tabella ASCII. Le possibili combinazioni sono quindi: 26 lettere dell’alfabeto più 10 numeri per un totale di 36 simboli che ognuna di queste coppie può assumere. Ciò significa che in totale abbiamo 36^5 combinazioni possibili, cioè 60466176 combinazioni ~ 60 Milioni. Avendo a disposizione l’handshake di rete, diventa fattibile (avendo un dizionario, banalmente creabile) l’attacco a forza bruta. Questo numero sembra molto alto, ma con la potenza di calcolo che oggi si ha a disposizione è possibile per chiunque testare tutto lo spazio chiavi in meno di un giorno. Considerando la media di 1300 keys/s ci vorranno ~ 13 h nel peggiore dei casi. Se poi distribuiamo il carico di lavoro su più computer (possibilmente più potenti) riusciremo ad avere la chiave nel giro di qualche ora, o addirittura di qualche decina di minuti se si utilizza la potenza di calcolo delle GPU di potenti schede video.

4) Sarebbe buona regola da parte dell’Assistenza Fastweb invitare i nuovi Clienti a modificare il prima possibile le configurazioni inziali accessibili dalla MyFastPage. La chiave di rete predefinita è utile solo inizialmente per testare il corretto funzionamento della linea ADSL e dei vari PC connessi all’HAG, dopodichè deve essere sostituita con una più robusta. L’opzione che mantiene l’accesso automatico dai PC connessi a quella rete va assolutamente evitato.

Dalla MyFastPage è possibile reperire moltissime informazioni sensibili del Cliente, ovvero: Cognome e Nome dell’intestatario, Codici bancari, Codice fiscale (e quindi data di nascita e luogo), Indirizzo e Numero civico dell’abitazione, Numero di telefono fisso ed eventualmente mobile, le fatture associate al conto Fastweb con i relativi dettagli alle chiamate e costi, e i MAC address dei PC connessi alla rete.

Fortunatamente, Fastweb mette a disposizione un modo abbastanza semplice per evitare questi spiacevoli inconvenienti. Modificare la password di default. Infatti dalla MyFastPage->Gestione Abbonamento->Configura WiFi con una semplice procedura è possibile modificare la chiave predefinita. Ma in quanti lo fanno? Lavorando nell’ambito delle reti, per esperienza personale vi possiamo dire che Fastweb copre una buona fetta di mercato per quanto riguarda la fornitura dei servizi internet nelle aziende; il 70% di queste lascia le impostazioni WiFi di default, mentre il 95% lascia l’accesso automatico alla MyFastPage con le password di default.

Noterete che la situazione non è per niente banale o da sottovalutare.

Ci teniamo a sottolineare che più volte abbiamo sollecitato personalmente il suddetto Provider a prendere provvedimenti a riguardo, ma le nostre segnalazioni sono state del tutto snobbate, e la risposta più intelligente è stata: “Gentile cliente, la ringraziamo per il suo contributo ma i nostri clienti possono modificare la chiave wifi dalla MyFastPage.”

Siamo i primi a consigliare (ove possibile) la modifica della chiave di default a prescindere dal gestore, non solo perché lo riteniamo opportuno, ma anche perché la nostra etica ce lo impone.

Siamo convinti che la sicurezza informatica dipende principalmente dal fattore umano. Abbiamo tentato di far sentire la nostra voce a Fastweb, ma non abbiamo ottenuto risposta nè interesse al problema. Per questo motivo abbiamo deciso di pubblicare questo articolo, per informare le persone di una falla di sicurezza che altrimenti resterebbe ad esclusivo beneficio di una ristretta cerchia di savants, a tutto danno del grande pubblico. Auspichiamo che la pubblicazione di questo articolo incentivi le persone a salguardare i propri dati personali evitando così di essere accusati di reati commessi da crackers informatici che sfruttano la nostra rete in modo illegale.

Auspichiamo inoltre che i Provider Italiani possano prendere i giusti provvedimenti a riguardo, progettando sistemi di sicurezza molto più sicuri di quelli attuali.


**** White Hats ****