Incredibile avventura. Questa secondo me è la definizione più appropriata, un esempio di collaborazione globale di persone capaci (ed incapaci...) che sono riuscite ad individuare alcuni algoritmi che a partire dal SSID (il nome della rete..) riescono a generare la chiave di rete wpa data di default dai modem. Persone che hanno dedicato il loro tempo libero allo studio costante ed all'approfondimento e che hanno condiviso i loro risultati con altri appassionati.
Purtroppo sono emersi anche i lati peggiori dell'uomo, come l' egoismo e l' avidità; alcuni individui che detenevano già gli algoritmi hanno creato blog anonimi ed iniziato a chiedere denaro per fornire le password delle reti. Inoltre spesso hanno interferito con i forum di ricerca sorti in seguito cercando di fuorviare dalle intuizioni corrette. Ho deciso di battezzare questo comportamento con il termine “avidità del sapere” menzionatomi un giorno da un "collaboratore".
Approvo la definizione in quanto non condividere le proprie conoscenze per trarne profitto resta il peggiore dei crimini. D'altra parte resta la paura fondata che la pubblicazione di tali dati possa creare disordini, confusione ed ingiustizie.
DISCLAIMER
Come mai informazioni dettagliate, che permettono di approfittare delle vulnerabilità di un particolare sistema, vengano repentinamente rese pubbliche (generalmente attraverso Internet) non solo da malintenzionati ma, soprattutto, da rispettabilissimi addetti ai lavori? La risposta a questo inquietante quesito può essere sintetizzata in una sola frase: full disclosure. Questa frase, che in italiano si può tradurre con il dovere di dire tutto, rappresenta la corrente di pensiero di coloro che difendono a spada tratta la libertà di diffondere tutti i dettagli relativi alle vulnerabilità venute alla luce: la loro scelta è guidata dalla convinzione che solo in questo modo i legittimi utilizzatori potranno immediatamente correre ai ripari. Questa nobile intenzione viene quindi addotta a giustificazione degli eventuali risvolti negativi che scaturiscono dalla full disclosure, risvolti rappresentati dalla possibilità che gli aggressori possano sfruttare le preziose informazioni sulle vulnerabilità ancora prima dei legittimi utilizzatori. Numerosi siti rendono disponibili nelle loro pagine un elenco aggiornato delle vulnerabilità scoperte e, proprio per questa ragione, è assolutamente indispensabile che ogni singolo utente/amministratore li consulti frequentemente o, ancor meglio, qualora il servizio fosse disponibile, si abboni alle loro newsletter specifiche.
FONTE microsoft.com
UN PO' DI STORIA: Algoritmi Speedtouch e BThomeHub
April 14th, 2008 ,UK
In questo post viene pubblicato l'algoritmo dei router Thompson Speedtouch e BT home scoperto da Kevin Devine e james67. A quanto detto i più popolari routers DSL in Gran Bretagna.
Ecco come viene giustificata la pubblicazione:
"Kevin decided to share his findings and work with us in this fascinating project. As you might already know, at GNUCITIZEN we’re committed members of the white-hat community who feel that it’s our responsibility to inform the public when a security issue exists."
L' algoritmo per i modem Speedtouch risulta molto semplice:
si parte dal SERIAL (CP0615JT109) e si prendono alcuni caratteri (CP0615109)
- trasformiamo in esadecimale gli ultimi 3 caratteri (echo -n 109|hexdump) e lo appendiamo a CP0615 ottenendo CP0615313039
- poi processiamo con una comune sha1 (echo -n CP0615313039|sha1sum) ottenendo 742da831d2b657fa53d347301ec610e1ebf8a3d0
- gli ultimi 3 byte (f8a3d0) li appendiamo a SpeedTouch ottenendo il SSID che è SpeedTouchf8A3D0
- i primi 5 byte (742DA831D2) sono la chiave wpa del router.
Per il modem BTHomeHub il processo è analogo:
- CP0647EH6DM di seriale prendo solo CP06476DM
- lo converto 6DM in esadecimale ottenendo 36 44 4D
- li appendo come prima ottenendo CP064736444D
- faccio una sha1 di tale valore (06f48a28eba1ab896a396077d772fd65503b8df3)
- il SSID è quindi BTHomeHub-8DF3 e la wpa è 06f48a28eb
Come si puo' notare risulta etremamente semplice implementare un keygen per questi routers con poche righe di codice.
Ecco il link al disassembing di Devine molto interessante:
http://www.hakim.ws/st585/KevinDevine/
Algorimo Fastweb Pirelli
Anche qui l'algoritmo utilizza uno degli hash pù diffusi come md5 ed anche in questo caso a partire dal SSID si ricava la chiave wpa. Piuttosto di pubblicare programmini pronti preferisco pubblicare i conti a mano.
Dato il SSID in hex 001CA2BA2CE8 lo si concatena ad una sequenza costante di valori:
Il SSID risulta essere il salt della sequenza numerica costante.
Della concatenzazione risultante basta fare md5sum e si ottiene l'hash
-
- echo-en "\x00\x1C\xA2\xBA\x2C\xE8\x22\x33\x11\x34\x02\x81\xFA\x22\x11\x41\x68\x11\x12\x01\x05\x22\x71\x42\x10\x66'"|md5sum
95ed90a01b4de2f2ced0ade17f68ac68
poi lo trasformiamo in binario
-
95 10010101
ed 11101101
90 10010000
a0 10100000
1b 00011011
4d 01001101
e2 11100010
….....
trasformiamo il binario in base 32 ossia prendiamo gruppi da 5 bit:
10010 10111 10110 11001 00001 01000 00000 11011 01001 10111 10001 0...
-
10010 12hex= 18dec 18 > 10 12hex+57hex = 69
-
10111 17hex= 23dec 17 > 10 17hex+57hex = 6e
-
10110 16hex= 22dec 22 > 10 16hex+57hex = 6d
-
11001 19hex= 25dec 25 > 10 19hex+57hex = 70
-
00001 01hex=01dec 01 < 10 = 01
E’ evidente che se il valore hex è maggiore di 10 aggiungiamo 57hex, altrimenti no.
e la wpa default è quindi 696e6d7001.
ALICE AGA CON SMARTCARD
In questo caso piu' complicato abbiamo bisogno di due dati per ricavare la wpa: la pppusername ed il serial number della smart card.
Prendiamo un esempio di rete che circola da tempo sul web:
-
ESSID = Alice-51697966
-
pppUsername = "0!Y0URIlZfr49aZc"
-
smartcardSn = "BA000c314d92ef6b"
NOTA: Lo smartcard serial number è facilmente ricavabile convertendo in hex l’essid (51697966 >> 314D92E)
Come per il caso Fastweb per non dare programmi pronti faremo “i conti” a mano …
CREAZIONE DELLA CRYPTOUSERNAME:
Ecco un piccolo grafico che ci spiega come giungere alla cryptousername:
L’algoritmo gioca con due key costanti (KEY1 e KEY2) che unite vengono messe in DES con il seriale che abbiamo definito “ribaltato” (passatemi il termine). I due risultati del DES (MYDES_1 e 2) vengono concatenati per formare un’altra chiave (MYDES).Questa viene messa in DES con il PPPusername per generare la cryptousername.

Ecco le chiavi DES che opereranno con il seriale “ribaltato”:
-
KEY1=”\x88\x92\xA6\x94\xA8\xAA\xA0\xA2”
-
KEY2=”\x92\x8C\x86\xAC\x9A\x94\x84\x98”
Tali chiavi vengono unite in questo modo ottenendo queste due chiavi:
-
KEY_1_2="\x88\x92\xA6\x94\xA8\xAA\xA0\xA2\x92\x8C\x86\xAC\x9A\x94\x84\x98"
-
KEY_2_1="\x92\x8C\x86\xAC\x9A\x94\x84\x98\x88\x92\xA6\x94\xA8\xAA\xA0\xA2"
La prima crittazione Triple-DES avviene con il seriale ribaltato:
ribaltiamo il seriale ottenendo:
-
SERIAL="\x6b\xef\x92\x4d\x31\x0c\x00\xba"
DES3.new(KEY_1_2, DES3.MODE_ECB).encrypt(SERIAL)
otteniamo un valore che in hex è 33cf688b9d39f28b
Facciamo la stessa operazione con l'altra chiave:
-
DES3.new(KEY_2_1, DES3.MODE_ECB).encrypt(SERIAL)
otteniamo un valore che in hex è de0beccac4486fb1
Ora uniamo i due risultati ottenuti
-
MYDES=”\x33\xcf\x68\x8b\x9d\x39\xf2\x8b\xde\x0b\xec\xca\xc4\x48\x6f\xb1"
E facciamo un'altra operazione DES con il pppusername:
-
DES3.new(MYDES,DES3.MODE_ECB).encrypt(PPPUSERNAME)
otteniamo a311b598d186b0fbd559090f9517d0cc
“ribaltiamo” quanto ottenuto:
- CRYPT=ccd017950f0959d5fbb086d198b511a3
ALTRE OPERAZIONI PER GIUNGERE AL TRAGUARDO
Ora che abbiamo la cryptousername prima di giungere alla wpa è necessario effettuare varie operazioni matematiche che riassumeremo in una tabella:
Le prime tre variabili da considerare sono:
- a: che viene incrementata ad ogni riga (valore iniziale 0)
- q: risultato dell’operazione (a + 1)*5 shiftato di 3 bit;ad esempio se il numero è 25 in binario è 11001 shiftando tre bit si ottiene 11 ossia 3 in decimale:
- r: risultato dell’operazione (a+1)*5 modulo 8 (ossia il resto della divisione per 8
Ad esempio otteniamo:
a=0 q=(0+1)*5=5 0 r=(0+1)*5 % 8 = 5
a=1 q=(1+1)*5=10 1 r=(1+1)*5 % 8 = 2
a=2 q=(2+1)*5=15 1 r=(2+1)*5 % 8 = 7
a=3 q=(3+1)*5=20 2 r=(3+1)*5 % 8 = 4
a=4 q=(4+1)*5=25 3 r=(4+1)*5 % 8 = 1
… … … …
Ora riprendiamo ad uno ad uno tutti dati della tabella ed effettuiamo le seguenti operazioni con la cryptousername sottomano:
Per comodità numeriamo le coppie esadecimali della cryptousername:
CRYPTO = cc d0 17 95 0f 09 59 d5 fb b0 86 d1 98 b5 11 a3

A seconda del valore di q prendiamo il valore esadecimale corrispondente dalla tabella.
Riportiamo tutti i passaggi nella successiva tabella spiegandoli poi uno ad uno:

prima riga: sono riportati i valori di q ottenuti in precedenza
seconda riga: il valore esadecimale della cryptousername a cui fa riferimento
terza riga: il valore di r ottenuto in precedenza
quarta riga: il valore di r in decimale
quinta riga: il valore di shift dato da (8-r)
sesta riga: il valore di c-hex in decimale shiftato (>>) di un numero di bit pari a shift
settima riga: nelle colonne dove r < 5 il valore di c-shift viene cambiato in c-update, altrimenti resta uguale. Attenzione: per generare c-update basta prendere il valore della cryptousername precedente a c-hex (tabella crypto). Ad esempio nella seconda colonna c-hex=d0, prendiamo il valore che lo precede nella cryptousername ossia cc. Poi effettuiamo uno shift (<<) all'indietro di r=2 bit ottenendo 816. Poi sommiamo il valore di c-shift (che è 3) ed otteniamo 819.
Un altro esempio:nella quarta colonna si ha r=4 che è minore di 5 quindi c-shift va cambiato.c-hex è 17 quindi prendo come valore d0. Shiftiamo d0 di r=4 bit ed otteniamo 3328.Sommiamo c-shift ed otteniamo 3229.
ottava riga: operazione booleana di and logico tra c-upd e 1F (31 in decimale). Ad esempio 819AND31 ci da come risultato 19.
nona riga: se c-bool < 10 allora sommiamo 48. Altrimenti sommiamo 87.Ad esempio nella prima colonna c-bool è 25 maggiore di 10 quindi sommiamo 87. Diventa quindi 112 (hex 70).Questo è finalmente il valore ASCII della prima lettera della wpa!
Decima riga: convertendo in ascii eccoci FINALMENTE arrivati alla soluzione. La wpa di default.
RINGRAZIAMENTI
Sono molti gli appassionati e siti che meriterebbero una menzione, tuttavia non mi sento di citare coloro che ci hanno speculato tenendo nascosti i dati delle ricerche. E' sicuramente un peccato poichè si tratta di persone molto valide e capaci. Per quanto riguarda lo stimolo alla ricerca italiana il merito iniziale va tutto al blog di Angelo Righi, che, pur attraversando periodi di alti e bassi, ha saputo comunque stimolare curiosità ed interesse consentendo una efficace condivisione dei risultati. Inoltre volevo ringraziare per l'aiuto diretto tiresi@ , mcprojects ed ET e per quello indiretto luciano, i white hats per la parte fastweb, per la parte alice 3mpty,Ra, la stimabile cricca di wifi-ita, vabbè anche quei due che mancano, del resto se lo meritano,ma solo per la loro abilità....
NOTA: L'articolo ovviamente non è ancora finito, manca la parte sulla generazione del pppusername, l'algoritmo fastweb telsey (update più sotto) e molte altro ancora.
UPDATE: CRITTAZIONE DES3
A richiesta pubblico un frame javascript che opera la corretta crittazione DES3-ECB.Buon divertimento.
UPDATE: DA SERIALE AGA A SSID
Come mi è stato segnalato spesso il passaggio da SSID a seriale non è immediato come nell'esempio citato.
Nell'esempio con parte numerica del SSID 51697966 si converte in esadecimale e si ottiene 314192E che in questo caso è parte integrante del seriale.
In altri casi è tuttavia necessario ad esempio aggiungere un 1 o un 2 all'inizio del SSID prima di convertirlo in hex.Questo numero lo chiamiamo N.
La costante A è pari a 0x55E63B89.Lo >> è il solito shift binario.
Per ora (datemi un attimo di respiro) postero' la formula del passaggio inverso, dalla parte integrante del seriale (che chiameremo SX) all'ESSID:
N=(SX*A) >> 57
esempio 1) SX=314D92E quindi N=108B18ED989D39E >> 57 = 0 ossia niente da aggiungere davanti prima della conversione (051697966)
esempio 2) SX=64B74BE quindi N=21CB704BAFD43AE >> 57 = 1 dobbiamo aggiungere 1 davanti al ssid (105608382)
esempio 3) SX=27E985E quindi N=D646E89D51344E >> 57 = 0 niente da aggiungere davanti al ssid (041850974)
esempio 4) SX=F1514CE quindi N=50F905B05279C3E >> 57 = 2 aggiungere 2 davanti al ssid (253039822)
esempio 5) SX=D15B27E quindi N=463F8CD33F38F6E >> 57 = 2 aggiungere 2 davanti al ssid (219525758)
E il procedimento inverso? ci pensate voi?
ALICE AGPF:
Come preannunciato, l’algoritmo AGPF è molto simile a quello Pirelli Fastweb: utilizza un hash sha256 che concatena una serie speciale di caratteri fissata con il seriale ed il MAC.
E’ stato individuato mediante reverse engineering dal team dei White Hats, già noti per aver reversato l’algoritmo Pirelli. Vi rimando al loro articolo per maggiori dettagli sul reverse (LINK). Ci tengo a sottolinearlo in quanto persone senza scrupoli cercano di reclamarne la paternità per scopi professionali. Per questo motivo mi scuso con gli appassionati in quanto non ho pubblicato prima l’algoritmo, ma reputo fondamentale dare il giusto palco a chi lo merita. Inoltre volevo informarmi se erano state prese contromisure al problema e con mia gioia ho notato che la nuova versione del firmware consente di cambiare la wpa di default rendendo così vani i tentativi di malintenzionati.
Comunque dagli "aiutini" (o aiutoni) che ho potuto fornirvi vedo con piacere che c’eravate quasi arrivati.
IL SERIALE:
Il seriale è nel formato 69102X0012345 : la prima parte, separata dalla seconda dalla X, dipende dalla serie individuabile dal SSID (ad esempio: 69101,69102,67101,67102,67902, 67903,67904…).
La seconda si ottiene dal SSID mediante operazioni matematiche elementari rese pubbliche da tiresi@ in forum censurati e dipendenti dalla serie. Infatti supponiamo di avere due reti con SSID affine notiamo come la relazione ricorrente sia:
SERIAL1 = (SSID2-SSID1)/k +SERIAL2 con k che assume principalmente I valori di 13 o 8
Da questa possiamo ottenere dei numeri chiamati impropriamente magici che risultano costanti per ogni tipo di SSID.
SERIAL=(SSID-MAGIC)/k
Facciamo un esempio per una serie:
Alice-54XXXXXX numero magico = 52420689 K=8
Abbiamo un SSID (fittizio) del tipo Alice-54123449
(54123449 – 52420689)/8 = 212845
Quindi il seriale risultante sarà 67903X0212845
La pubblicazione degli altri numeri magici ,peraltro facilmente ricavabili, esula lo scopo di questo articolo.
IL MAC ADDRESS:
Si ricava facilemte che il mac address è formato da i primi 6 caratteri esadecimali costanti per ciascuna serie (00223,00238,00255,001d8 …) piu' il SSID convertito in esadecimale. Anche qui come per gli AGA si converte il SSID con 0,1,2 davanti, a seconda dei casi.
Nel nostro esempio fittizio (serie 54) otterremo 00:25:53:39:DB:B9.
L'ALGORITMO:
Riportiamo uno schema che lo riassume spero esaurientemente:

Come per l’algoritmo Pirelli riprendendo l’esempio della rete fittizia, è sufficiente il comando unico linux per ricavare il digest:
echo -ne $SPECIAL$SERIAL$MAC|sha256sum
382d77903d29bea8ab6d82c7f7917867c3e54b9d9a8eb63cb8192bf48d7cdf01

Trattiamo questo digest come se i suoi elementi fossero indici di un vettore [0 255] di questo tipo, basandoci sulla tabella (*) ricaviamo:
l'indice 38 hex=56 equivale ala lettera k nella tabella
L'indice 2d hex=45 equivale a 9
etc…
La wpa di default della rete fittizia è quindi k9b0p5aor1mjv1cvfd3day2o
* NOTA: Ho usato questo vettore (inutilmente grande) solo come riferimento per la spiegazione, una implementazione migliore senza dubbio sarebbe:
modulo(valorehex)/36=indice vettore di 36 elementi
CONTROMISURE :
Come tutti sanno fino a poco tempo fa il modem Alice Gate VOIP 2 plus WiFi AGPF non permetteva di cambiare la wpa di default. A mio parere questa scelta, unita alla struttura riconducibile dell’algoritmo, violava una semplice regola della sicurezza crittografica: l'assenza di riconducibilità della sorgente della chiave. Ora finalmente gli utenti possono tutelarsi aggiornando semplicemente il firmware alla versione 4.5.0sx il quale permette di cambiare la wpa di default. Sarete quindi finalmente voi gli artefici della vostra sicurezza o insicurezza...Raccomandiamo quindi i privati masoprattutto tutti gli amministratori di reti aziendali di aggiornare il firmware via telegestione e di cambiare la password di default.
Algoritmo Fastweb Telsey
Ancora una volta la White Hat Crew ci ha dimostrato il suo valore pubblicando la full disclosure dell’algoritmo Fastweb Telsey (LINK).
Parte fondamentale della procedura di calcolo è l’algoritmo hashword di Bob Jenkins. Questo algoritmo non è certamente noto come l’md5 e la sha256 usati nei casi precedenti ma una sua versione è salita alla ribalta nel 2004 in quanto usata come checksum per il Google Toolbar Page Rank . La scoperta che nel checksum di google si celava hashword è di Alex Stapleton ed è anche questa una impresa non certo da poco che meriterebbe senz' altro un articolo a parte.
JENKINS HASHWORD
Si tratta di un algoritmo non crittografico molto vesatile usato per checksum o per sistemi embedded. Tale funzione accetta tre parametri in ingresso: un array composto da elementi da 4 byte unsigned, la lunghezza dell’array ed un valore iniziale per il calcolo arbitrario (o in questo caso ricorsivo).

Supponiamo ad esempio che i dati in ingresso siano un vettore di tre elementi e che il valore iniziale sia 0:
A=[57454c4f, 56454352, 5950544f] --> hashword (A,3,0) ci da come soluzione:"7757672a".
Ma vediamo cosa fa tale funzione prendendo come vettore di quattro elementi
A=[434f4d50, 4c494d45 , 4e544957 , 48495445 ]
- inizializza tre variabili: a, b e c ad un valore di deadbeef + (length<<2) + initval; quindi, in questo caso, saranno pari a deadbeff.
- Ora, a seconda del valore posizione del puntatore al vettore processato abbiamo 3 casi (...):
- Se Length > 3 allora a = a + A[0] ; b=b+A[1] e c=c+A[2] e passa al gruppo dei 3 elementi successivi. Essendo il nostro vettore di esempio composto da 4 elementi questo passo ci da a=121fd0c4f, b=12af70c44, c=12d020856. Ora entra in gioco la funzione mix che in seguito a semplici sottrazioni, addizioni e shift binarici ritorna i 3 valori (a b c) che in questo caso sono (99aa2695,c30ab706,f742b83c).A questo punto si passa ai tre elementi successivi del vettore.
- Se Length = 3 allora c=c+A[2] e si passa all’elemento successivo.
- Se Length = 2 allora b=b+A[1] e si passa al successivo
- Se Length = 1 allora a=a+K[0] viene eseguita un’altra semplice routine algebrica simile alla precedente (final). Nel nostro caso avremo come risultato (a,b,c)=(6cb614d4, f25fa54f ,eab16b3c)
Il valore di c è appunto il risultato che da questa funzione.
APPLICAZIONE DEL JENKINS NEL TELSEY
Ora analizziamo come viene utilizzato questo algoritmo non crittografico per la generazione della wpa default del Telsey. Nell'esempio precedente abbiamo utilizzato un vettore in ingresso di 4 elementi da 4 byte con un valore iniziale di 0. In questo caso specifico l’algoritmo utilizza un array di 64 elementi da 4 byte ciascuno (interi senza segno). Questo vettore viene ricavato semplicemente mescolando il MAC del router (trattandolo come se fossero 6 byte) secondo una sequenza prefissata di permutazioni.
Utilizziamo per esempio il MAC di Angelo Righi, stimabile precursore di questa ricerca (link):
Il vettore risultante sarà:
[BC0300BC030003BC426F8E6F428E6F6F6F426F006FBC8E0300420003034203006F426F6F8E038E424203428EBC03BCBC6F0300BC0
3000303426F038E8E8EBC6F4242BC42BC0342006FBC00BC6F038EBCBC6F6F426F8E03420042428E8E00BC8E428E00008E6F03036F
036FBC038E428E006F8E4200006F6F000000BC0303034242006F6F8E8E8E00006F4203BCBCBC000042BC000303BC6F6F6FBC038E8
E6F8E03006F4203BC6FBC00034200030303426F6F6F6F8E8E8E8EBC4200034200BCBC0300BC000003BC036F6F426F8E42428E428E0
3BCBCBC03428E0003BC8E030042426F6FBC428E8E036F428E006F8EBC038E036F8EBC00036FBC8E4203006F8E00]
Diamo in pasto questo vettore alla funzione hashword sopra descritta usando l’output c come input per le ricorsioni successive:
for (L=0; L<64;L++) –> VAL_1=hashword(A, L, VAL_1)
Nel nostro esempio otteniamo come valore 0d37fcee
Successivamente ci sono altre semplici operazioni di shift binario a seconda della posizione del puntatore.
- se x < 8 allora A[x]=A[x] << 3
- se x < 16 allora A[x]=A[x] >> 5
- se x < 32 allora A[x]=A[x] >> 2
- altrimenti A[x]=A[x] << 7
Il nuovo array mescolato sarà del tipo:
[e01805e0,18001de0, 137c7378,14737b78,7a137800, 7de47018, 2100018,1a101800,37a137b,4701c72,2101a14,5e01de5,...]
e sarà dato in input analogamente alla funzione hashword.
for (L=0; L<64;L++) –> VAL_2=hashword(A, L, VAL_2)
Otterremo VAL_2 = 0998a718.
La wpa risultante saranno gli ultimi 5 “caratteri” di VAL_1 ed i primi 5 di VAL_2. Ossia 7fcee0998a.
Ecco lo schema finale che riassume quanto detto finora:

Che dire ora nelle conclusioni, si è gia detto tutto per quanto riguarda gli altri algoritmi. L'errore dei progettisti è sempre quello.
Per maggiori dettagli vi rimando all'articolo dei White Hats.
In gamba.
Sostenete il rinnovamento del sito dando un'occhiata ai link pubblicitari che vi interessano.