Vous êtes sur la page 1sur 44

Rainbow Tables

Luca Grilli, Fabrizio Montecchiani

Funzioni di Hash sicure


Una funzione hash h()
riceve in input un messaggio m di lunghezza arbitraria, e ritorna un output hm = h(m) di lunghezza prefissata (128 bit)

Propriet importanti di una funzione di hash (crittografica) sicura


1. 2. 3. 4.

noto m facile calcolare hm = h(m) dato h, difficile calcolare m tale che h = h(m) (one-way o resistenza alla pre-immagine) dato m, difficile trovare m m tale che h(m) = h(m') (resistenza alla seconda pre-immagine) difficile trovare m, m tali che h(m) = h(m') (resistenza alle collisioni)
le propriet 3 implica la 2, ma non il contrario la propriet 4 implica la 3, ma non il contrario

Attacco Brute-Force
Sia h:{0, 1}* {0, 1}b una funzione crittografica di hash
K = 2b: cardinalit dello spazio dei possibili valori di hash

Supponiamo che l'output distribuito in modo casuale in questo spazio Considerando un insieme di n stringhe Quanto deve valere n al fine di avere una probabilit > 0.5 che una stringa abbia un valore di hash dato? n = ln 2 / (ln K ln(K 1)) per K grande circa n = (ln 2)K

Attacco Brute-Force
Per una funzione hash a 128 bit, necessario testare (ln 2)2128 possibili input (circa 1038) per ottenere una probabilit di 0.5 di ottenere un valore hash specificato 1038 microsecondi equivalgono a circa 1024 anni!

Compromesso Tempo-Memoria
Si pu pensare di ridurre il tempo di calcolo aumentando loccupazione di memoria (o viceversa)
sembrerebbe pi efficace effettuare un attacco bruteforce una prima volta, memorizzare il risultato in un hash database, quindi utilizzare questo database per accelerare il cracking su qualsiasi macchina

Questo approccio richiederebbe memorie con capacit dellordine delle centinaia di Terabyte
limite ancora troppo elevato

Rainbow Tables
Una rainbow table una rappresentazione compatta che mira a ridurre le dimensioni di un hash database a una tabella molto pi compatta, incrementando leggermente i tempi di calcolo
Viene calcolato lhash di tutte le password ma ne viene memorizzata solo una piccola parte

Rainbow Tables
Siano h() una funzione di hash e P un insieme finito di password Lobiettivo di precalcolare una struttura dati tale che,
dato un qualsiasi output h della funzione hash, pu individuare la password p in P tale che h(p) = h, oppure stabilire che non esiste una tale p in P

Il modo pi semplice per farlo calcolare h(p) per ogni p in P


memorizzare la tabella richiede (|P|b) bit di spazio, dove b le dimensioni di un output di h(), proibitivo per grandi P

Funzione di Riduzione
L'idea di definire una funzione di riduzione r() che mappa a ritroso i valori di hash in valori di P
esistono diverse possibili funzioni di riduzione pseudorandom una funzione di riduzione non linverso di una funzione di hash!

Funzione di Riduzione
Alternando
la funzione di hash con la funzione di riduzione, possiamo formare catene alternate di password e valori di hash

Generazione
Per generare una rainbow table:
scegliere un insieme iniziale casuale di password in P calcolare per ognuna di esse le catene di lunghezza fissa l memorizzare in tabella soltanto
la prima (startpoint) password e lultima (endpoint) password di ogni catena

Esempio
aaaaaa h() 281DAF40 r() sgfnyd h() 920ECF10 r() kiebgt

Lookup e Inversione
Per invertire un valore hash h* necessario effettuare
una prima fase detta di lookup una seconda fase detta di inversione

Lookup
1. Calcolare una catena a partire da h, applicando r() e h() alternativamente
2. Se in qualsiasi punto si osserva un valore corrisponde ad uno degli endpoint della tabella, recuperare il corrispondente startpoint

Inversione
1. Utilizzare lo startpoint trovato in fase di lookup per ricreare la catena
2. Se la catena prodotta contiene il valore h* allora il valore immediatamente precedente nella catena la password p cercata

Esempio
Hash h* = 920ECF10
Lookup: calcoliamo la sua catena finch non troviamo un valore in tabella (un endpoint):
920ECF10 r() kiebgt kiebgt contenuto nella tabella con startpoint aaaaaa (vedi esempio precedente)

Inversione: ricostruiamo la catena partendo da aaaaaa:


aaaaaa h() 281DAF40 r() sgfnyd h() 920ECF10

La password sgfnyd

Falso Allarme
La catena ricostruita non sempre contiene il valore hash h*
Esempio: h* = FB107E70 FB107E70 r() bvtdll h() 0EE80890 r() kiebgt FB107E70 non nella catena di aaaaaa (falso allarme) In questo caso, il match viene ignorato e si continua ad estendere la catena di h* in cerca di un altro match

Se la catena di h* raggiunge la lunghezza l senza match buoni, la password non mai stata prodotta in una delle catene e pertanto non pu essere invertita

Propriet
Il contenuto della tabella non dipende dal valore hash da invertire
il contenuto viene creato una sola volta e riutilizzato in ogni attacco senza alcuna modifica

Aumentando la lunghezza delle catene si riducono le dimensioni della tabella


aumenta per il tempo richiesto per eseguire le ricerche (compromesso tempo-memoria) nel semplice caso di catene di un elemento, la ricerca molto veloce, ma la tabella molto grande (hash database)

Collisioni
Pu accadere che in un qualsiasi punto due catene producano lo stesso valore (collision)
Le due catene si fondono (merge) nel punto di collisione di conseguenza la tabella coprir un minor numero di password
poich le catene precedenti non sono memorizzate completamente, una collisione impossibile da individuare in modo efficiente

La funzione di hash h() genera raramente collisioni (collision-resistant) mentre la funzione di riduzione r() non altrettanto robusta

Funzioni di Riduzione Multiple


Per risolvere il problema delle collisioni possibile utilizzare,
anzich una sola funzione di riduzione r(), un insieme di funzioni r1()rk() utilizzate alternativamente

In questo modo, perch due catene collidano e si fondino, devono colpire lo stesso valore nella stessa iterazione
ancora possibile avere delle collisioni, ma che non comporteranno la fusione delle catene

Esempio

Lookup
Poich il valore hash di interesse pu essere trovato in qualsiasi punto della catena, necessario generare k catene diverse
La prima catena assume che il valore di hash sia nell ultima posizione e applica soltanto rk() la seconda catena assume che il valore di hash sia nella penultima posizione e applica in sequenza rk-1(), h() e rk(), l'ultima catena applica tutte le funzioni di riduzione alternate con h()

Questo procedimento comporta che alcune catene possano essere prodotte e valutate inutilmente (false alarm)

Esempio

Debolezze
La generazione richiede molto tempo

Possono verificarsi molti false alarm Inefficiente con meccanismi di salt


Lo spazio di ricerca cresce notevolmente superando i limiti di memoria attuali

Approfondimenti
A Cryptanalitic Time-Memory Trade-Off, Martin E. Hellman
www-ee.stanford.edu/~hellman/publications/36.pdf

Making a Faster Cryptanalytic Time-Memory Trade-Off, Philippe Oechslin


lasecwww.epfl.ch/~oechslin/publications/crypto03.pdf

LanManager Hash
UPPERCASE + NULL PADDING / TRUNCATING

NT Lan Manager Hash

PWD

MD4

HASH NT (16B)

Rainbow Tables e LM Hash

L0pht Heavy Industries


L0pht Heavy Industries stato un collettivo di hacker attivo tra il 1992 e il 2000 e situato a Boston Durante la sua attivit ha rilasciato numerosi avvisi relativi alla sicurezza informatica e prodotto strumenti software ampiamente utilizzati come L0phtCrack, un password cracker per OS Windows Il 19 maggio 1998, tutti i sette membri di L0pht (Brian Oblivion, Kingpin, Mudge, Space Rogue, Stefan Von Neumann, John Tan, Weld Pond) diedero una famosa testimonianza davanti al Congresso degli Stati Uniti, asserendo che avrebbero potuto spegnere l'intera rete Internet in 30 minuti Nel gennaio 2000, L0pht Heavy Industries si fusa con la startup @stake, completando la lenta transizione da un'organizzazione underground a una societ "whitehat" di sicurezza informatica. Symantec ha annunciato l'acquisizione di @stake il 16 settembre 2004, e completato l'operazione l'8 ottobre dello stesso anno

L0phtCrack
L0phtCrack unapplicazione per il recupero e il test di password originariamente prodotto da Mudge (L0pht Heavy Industries) Utilizza attacchi con dizionario, brute-force, e con rainbow tables

E uno degli strumenti preferiti dagli hacker, specialmente le vecchie versioni (basso prezzo e alta disponibilit)
Nel gennaio 2009 L0phtCrack stato acquisito dagli autori originali Zatko (Mudge), Wysopal e Rioux da Symantec
L0phtCrack 6 stato annunciato l11 marzo 2009 alla conferenza SOURCE Boston Conference

L0phtCrack 6
Alcune features:

OS target
Windows XP, Vista Seven (32 e 64 bit) reti con Windows NT, 2000, XP, Server 2003, Server 2008 (32 e 64 bit) varianti principali di BSD e Linux con demone SSH

password scoring
punteggio basato su metrica per valutare rapidamente la qualit delle password

metodi per Password Audit


dizionario hash DB precalcolato brute force rainbow tables

www.l0phtcrack.com

www.l0phtcrack.com

L0phtCrack e LM Hash
La prima versione di l0phtCrack fu utilizzata per crackare lalgoritmo LM Hash

LM Hash stato mantenuto da Microsoft fino a Windows Vista per garantire la retrocompatibilit con i vecchi sistemi

Windows mantiene per ogni password sia la versione ottenuta con LM Hash sia quella ottenuta con NT Hash se un attaccante riesce a crackare la versione LM Hash della password (ad esempio tramite rainbow tables) allora pu sfruttare questa informazione per crackare anche la versione NTLM Hash

L0phtCrack e LM Hash
Il cracking della versione LM Hash fornisce i primi 14 caratteri della password
per password di dimensioni maggiori i restanti caratteri possono essere trovati per inferenza o con attacco brute-force

Lalgoritmo NT Hash case-sensistive


una volta crackata la versione LM Hash della password restano soltanto 2x possibili password, con x pari alla lunghezza della password x un numero minore o uguale a 14 (al pi 16384 tentativi)!

NTLM Protocol
NTLM Protocol: protocollo Microsoft per lautenticazione su dominio di tipo challengeresponse introdotto con lalgoritmo NTLM Hash

NTLM Protocol
Ogni volta che un utente richiede lautenticazione su dominio entrambe le versioni della password (LM Hash e NTLM Hash) subiscono il seguente processo:
1. NULL padding fino a 21B 2. divisione dellhash in 3 parti da 7B 3. ognuna delle 3 parti viene convertita in una chiave DES di 8B aggiungendo 1B di parit 4. con ogni chiave viene criptato un challenge di 8B inviato in chiaro in rete dal server di autenticazione 5. i 3 output ottenuti al passo precedente sono concatenati per formare un output finale di 24B che viene inviato in rete al server per verificare lautenticazione

L0phtCrack e LM Hash
Il meccanismo di challenge-response dovrebbe rendere pi difficile il cracking In realt louput contiene informazione sfruttabile da un attaccante
solo 2B dellhash originale (16B) finiscono nella terza componente da 7B, il resto sono caratteri NULL noti solo lottavo byte della prima met dellhash originale finisce nella seconda componente da 7B

L0phtCrack e LM Hash
Esempio: password di dimensione pari al pi a 7 caratteri (scelta molto frequente per utenti non esperti)
nella versione LM Hash il secondo gruppo da 7B composto da soli caratteri NULL nella versione prodotta dallNTLM Protocol i primi 8B corrispondono al challenge cifrato con lLM Hash, non serve decriptare i restanti 16B!

Kerberos
Microsoft ha adottato Kerberos come protocollo di autenticazione di defualt da Windows 2000 e per i domini Active Directory NTLMv2 ancora utilizzato in diverse seguenti situazioni, tra cui:
il cliente si autentica a un server che non appartiene a un dominio non esiste un dominio Active Directory (modalit workgroup"o "peer-to-peer") nei casi in cui un firewall blocca le porte richieste da Kerberos

Ophcrack
Ophcrack unapplicazione open source per il recupero delle password di sistemi operativi Windows Si avvale di rainbow tables per crackare gli hash LM ed NTLM Sviluppata da Cedric Tissieres e Philippe Oechslin

Ophcrack

Xp Rainbow Tables

XP free small (380MB)


Success rate: 99.9% Charset: 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ

XP free fast (703MB)


Success rate: 99.9% Charset: 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ

XP special (7.5GB)
Success rate: 96% Charset: 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~

XP german (7.4GB)
Success rate: 99% Only for passwords that contains at least one german character () Charset: 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~

Vista Rainbow Tables

www.freerainbowtables.com
L'obiettivo di FreeRainbowTables.com quello di dimostrare l'insicurezza delle funzioni hash semplici DistrRTgen (Distributed Rainbow Table Generator): generazione distribuita di catene
possibile generare rainbow tables enormi che sono in grado di rompere password anche molto lunghe il client BOINC disponibile dalla pagina di download del sito

Fonti
Beautiful Security Leading Security Experts Explain How They Think, Andy Oram, John Viega , O'Reilly Media, 2009 www.wikipedia.org

www.l0phtcrack.com
www.ophcrack.sourceforge.net www.freerainbowtables.com

Vous aimerez peut-être aussi