Archive
Telsey FASTWEB: Full Disclosure
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 ***