2006-11-11, 20:05
  #1
Medlem
DaVajjs avatar
Rainbowtables / Regnbågstabeller
================================

Introduktion
============
För att förstå vad en rainbowtable är måste man först förstå konceptet hash-algoritm, eller med ett annat namn; envägsalgoritm. Om du redan är bekant med den typen av algoritm, så kan du hoppa över följande sektion.

Hashalgoritmer (och envägsalgoritmer)
=====================================
Hashalgoritm är en typ av envägsalgoritm, vilket är precis vad namnet säger, en algoritm som bara fungerar åt ena hållet. Om mot förmodan begreppet algoritm är för dig främmande, så kan man förklara en algoritm såhär:

En uppsättning instruktioner om hur någonting ska behandlas.

Detta någonting har således ett tillstånd innan algoritmen, och ett sluttillstånd efter den. Man skulle kunna säga att ett matrecept är en enkel typ av algoritm som nog de flesta stött på. Det algoritmen behandlar är då råvaror, som i sitt ursprångstillstånd kanske är smör, socker, ägg var för sig. Algoritmen förklarar noga vad som ska göras, och resultatet är ett sluttillstånd.

En envägsalgoritm är en algoritm som utför sådana steg så att man omöjligt kan ta sluttillståndet, och göra algoritmen baklänges för att få tillbaka vad man började med. Hashalgoritm är som redan nämnt, en typ av envägsalgoritm. Den tar indata och producerar från den en utdata, vanligen kallad hash. Indatan kan oftast vara hur mycket somhelst, och utdatans storlek varierar. Några exempel:
MD2,MD4,MD5,SHA1, - 128 Bitar
SHA256 - 256 Bitar
SHA384 - 384 Bitar
SHA512 - 512 Bitar
RIPEMD160 - 160 Bitar

Tillämpningsområden för hashalgoritmer
======================================
Det finns olika tillämpningsområden för hashalgoritmer. Till exempel kan det användas som ett fingeravtryck för en fil. En hash räknas ut för hela filen och anges tillsammans med distribution av filen. Om någonting ändras i filen så avviker hashen oftast radikalt, vilket är en egenskap som bör förväntas hos en bra hashalgoritm. På detta sätt kan man verifiera filens integritet. Det vill säga, att den inte blivit skadad, eller ändrad av någon elak part.

Det tillämpningsområde som är av störst intresse för oss är hur det används för att lagra lösenord. För att en så känslig uppgift som ett lösenord inte lätt ska hamna i fel händer så sparas oftast lösenord inte i klartext hos servern där man gör en kontoregistrering. Om någon får tag på databasen, så kan de ändå inte köra hashen baklänges för att få användarens lösenord, vilket ger ökad säkerhet. När en kontoregistrering sker så skickas alltså lösenordet som indata till en hashalgoritm, och endast utdatan sparas. Vid varje inloggning som görs mot kontot så hashar servern det vid inloggningen angivna lösenordet, och jämför detta med det redan sparade värdet. Om de matchar varandra så var indatan ganska troligt samma som den gången då du registrerade dig. För en anledning till användandet av ordet 'troligt' se senare avsnitt angående teori.

Metoder för att knäcka hash
===========================
Det man dock kan göra för att ta reda vad för indata som skickades till hashfunktionen för att ge upphov till en viss hash kan man genomföra olika attacker. Metodiken är att man prövar olika tänkbara värden genom att skicka dessa värden genom en hashfunktion, och se om utdatan matchar det man söker. Vanliga tekniker för detta är Brute-Force och Dictionary Attack. En mer ovanlig teknik, är det som denna guide tar upp; Rainbowtable Cracking.

Vad är en Rainbow Table?
========================
Att köra en brute-force på nytt varje gång man stöter på en hash man vill knäcka är ganska tidskrävande. Förenklat så skulle man kunna säga att en rainbowtable innehåller varje kombination man prövar, tillsammans med vilken hash som producerades. Tack vare detta så behöver man vid varje brute-force inte räkna ut alla kombinationer och deras motsvarande hashvärde på nytt, utan man har endast ett program som gör en sökning i regnbågstabellen istället! Det man byter är utrymme för den enorma plats regnbågstabellerna tar upp, mot processortid. Man gör alltså alla uträkningar en gång, och sparar dom för all framtid så man inte behöver göra dom igen! På detta sätt kan tider som månader minskas till minuter, och år till halvtimmar. Precis som att man vid en brute-force väljer olika parametrar såsom charset (teckenuppsättning) och minsta längd samt maximal längd att pröva, så är också detta fallet med en regnbågstabell. Man genererar också tabellen för en, och endast en, typ av hashalgoritm.

Detta är den enkla versionen av det, rainbow-tekniken är lite mer avancerad än så. En rainbow table byggs upp av kedjor. En kedja har ett startvärde, och ett slutvärde. Startvärdet slumpas ur alla de olika tecken och teckenlängd man valt. Efter detta görs en typ av deterministisk iteration på värdet ett bestämt antal gånger, och efter allt detta sätts det sista värdet till slutet på kedjan. I tabellen sparas endast startvärdet, och slutvärdet, inget därimellan. En regnbågstabell består av flera stycken sådana här kedjor. Man bestämmer vid tabellgenereringen dessa parametrar; kedjelängd, samt antal kedjor.

Hur går det då till att söka i dessa? Jo, din hash som du vill hitta motsvarande klartext till itereras med samma funktion lika många gånger som tabellens längd på kedjor. Om du bland någon av dessa värden av iterationen hittar ett slut på en kedja vet du att klartexten till hashen finns i den kedjan, och du vet hur långt från slutet den var, alltså kan du göra om iterationerna från startvärdet, och där få klartexten. Även detta är en förenkling. Bland annat så används olika iterationsfunktioner för varje iteration, detta för att undvika att två kedjor vid ett tillfälle genererar samma värde, och på så sätt producerar samma data på nytt. Denna sökning gör såklart ett program för dig.

På grund av att startvärdena är slumpmässiga så är sannolikheten att önskad klartext går att hitta också slumpberoende. Därför anges ofta procentuella chanser för rainbowtables.

Hur skapar jag en Rainbow Table?
================================
Det finns olika program för att generera rainbowtables. Det mest vedertagna programmet för generering är nog 'rtgen' som ingår i Rainbowcrack-paketet, vilket återfinns här: http://www.antsight.com/zsl/rainbowcrack/.Detta är ett paket med rainbow-relaterade program gjort av Zhu Shuanglei. Sedan finns det ett mer användaranpassat program vid namn WinRtgen av gruppen oxid.it. Detta program är grafiskt och kombinerar funktionerna hos programmen 'rtgen' och 'rtsort'. WinRtgen finns på http://oxid.it.

WinRtgen med sitt grafiska gränssnitt är väldigt lätt att använda. Det svåra är egentligen vilka inställningar du skapar dina tabeller med. I programmet visas när du experimenterar med inställningar både procentuell chans för tabellen, samt storlek. En benchmark kan köras vilken avslöjar genereringstid för din(a) tabell(er).

Hur du ska ha inställningarna är svårt att säga, man kan pröva sig fram, eller använda sig av lite mer avancerade skript för att se utvecklingskurvor då olika inställningar för tabellen ändras och på så sätt göra sitt val. Enkel förklaring vad resultatet av förändringar hos parametrarna är kommer här:
Chain Length - Eftersom bara start och slutvärde sparas så påverkar inte längden, det vill säga hur många värden som ska räknas ut från kedjan, storleken på filen. Dock täcker den såklart mer och en ökad procentuell chans fås av ökad chain length. Dock ökar också genereringstiden och även tiden det tar att söka i en tabell. Detta för att vid sökning så måste lika många iterationer ske på hashvärdet du söker efter, som det gjordes för en enskild kedja. Samt så måste en sökning ske mot varje av dessa värden. Det gäller alltså att hitta en bra balans.

Chain Count - Anger hur många kedjor du vill ha i en tabell. Påverkar filstorleken samt den procentuella chansen då antalet kedjor du gör ökar, alltså större täckning av klartextområdet. Varje sparad kedja tar upp 16 byte. Filstorleken räknas alltså ut som: (Antalet Kedjor) x (16)

Antal tabeller - Man skapar oftast inte alls bara en tabellfil, utan flera stycken sådana. Detta ökar täckningen av klartextområdet. Dock fungerar det på grund av slumpmässigheten inte som så att en tabell med 40% chans och en till sådan tabell ger 80%. För att räkna ut procentuella chansen gör du följande uträkning:

Kod:
1 - (1 - chansförentabell)^(antal tabeller)

Så två tabeller med 40% ger alltså:

Kod:
1 - (1 - 0.4)^2
1 - (0.6)^2 = 1 - 0.6 * 0.6 = 1 - 0,36 = 0.64 = 64%

Med tre tabeller hade det blivit: 78.4%
(Ökningen avtar alltså)

[MATTE]
Matematik för de intresserade. Derivatan för sannolikhetsfunktionen ger förändringen av den procentuella chansen då [a = procentuell chans för en tabell] och [n = antal tabeller]

Kod:
f(n) = 1 - a^n
f'(n) = -n * a^n * ln a
[/MATTE]

Var hittar jag Rainbow Tables?
==============================
Det finns några ute på nätet. Hemsidor som bör kollas upp:
http://www.hashbreaker.com
http://www.freerainbowtables.com
http://rainbowtables.shmoo.com/
Citera
2006-11-11, 20:06
  #2
Medlem
DaVajjs avatar
Hur använder jag en Rainbow Table?
==================================
I rainbowcrack-paketet följer att program 'rcrack.exe' med. Syntaxen är följande:
rcrack.exe <TABELLFIL(ER) ATT ANVÄNDA> -h <HASH>
Man kan även använda växeln -f istället för -h och ange en fil med hashar på varsin rad att knäcka. Sedan finns även Cain & Abel, även det från gruppen oxid.it. Man matar in sin hash i korrekt underdel till cracker-sektionen, högerklicka på hashen och väljer från listan med crackningsmetoder, "Cryptanalysis Attack via Rainbowtables".
Passwords Pro är även ett program som ska kunna använda rainbowtables. För länkar till nämnda program, se Appendix A: Länkar

Online-Tjänster
(eller: Jag förstår inte. Ge mig enkelt sätt som inte kostar mig något
(eller: Jag sitter inte vid min main-frame just nu, men det är så spännande så jag vill se det 'in action' nu!) )
================================================== ==========================================
Det finns en del online-tjänster som kan knäcka hashar åt en:
MD5,LM: http://www.milw0rm.com
MD5,LM,NTLM: http://plain-text.info/
MD5: http://www.md5lookup.com/

Appendix A: Länkar
==================
Cain & Abel, WinRtgen: http://oxid.it
Rainbowcrack-paketet: http://www.antsight.com/zsl/rainbowcrack/
Rainbow-teknikens grundare: http://lasecwww.epfl.ch/philippe.shtml
Rainbow-teknik publikation: http://lasecwww.epfl.ch/php_code/publications/search.php?ref=Oech03
Gemensam tabellgenereringscommunity: http://www.rainbowcrack.com
Hyr tabellfunktionalitet: http://rainbowcrack-online.com/
Online-Cracker:MD5,LM: http://www.milw0rm.com
Online-Cracker:MD5,LM,NTLM: http://plain-text.info/
Online-Cracker:MD5: http://www.md5lookup.com/
Tables för hämtning: http://www.hashbreaker.com
Tables för hämtning: http://www.freerainbowtables.com
Tables för hämtning: http://rainbowtables.shmoo.com/
Ophcrack-Live-CD: http://ophcrack.sourceforge.net/#livecd

Appendix B: Windows LM-hashar
=============================
Något som ofta är väldigt eftertraktat är att knäcka Windows-lösenord med rainbowtables. Detta är för att Windows LM-hashalgoritm är väldigt svag. Dock tillämpas endast denna så länge lösenordet är 14 eller färre tecken, vid längre lösenord används NTLM-algoritmen istället. När en LM-hash produceras görs först alla små bokstäver om till stora bokstäver. Lösenordet (indatan) förlängs, om nödvändigt, till 14 tecken genom att lägga på noll-värdes-tecken tills datan är 14 byte. Sedan bryts lösenordet (indatan) upp i två delar à 7 tecken var. Dessa två värden används för att göra två DES-nycklar, och används för att DES-kryptera strängen "KGS!@#$%", vilket ger två stycken krypterade meddelanden på 8 byte var. Dessa sätts sedan ihop, och resultatet är LM-hashen. Detta är otroligt svagt då man endast behöver knäcka 1-7 tecken, högst två gånger.

Hasharna sparas i SAM (Security Account Manager) och de kan man erhålla bland annat genom att dumpa databasen genom diverse program såsom 'pwdump', men också Cain & Abel har inbyggd funktion för detta. Om man inte är admin kan man boota från till exempel en Linux-Live skiva med stöd för NTFS och därifrån få åtkomst till SAM-filen. Denna återfinns oftast på SYSTEMROOT:\Windows\System32\Config\.

En mycket behändig Live-CD är Ophcrack Live CD. Du bootar från den, går och gör samt dricker ditt kaffe. Kommer tillbaka, och förhoppningsvis ser du på skärmen knäckta lösenord. Med skivan följer lite grundläggande tabeller, och crackern startar automatiskt. Du hittar ISOn på: http://ophcrack.sourceforge.net/#livecd.

Appendix C: Lite Teori
======================
En hash-algoritm ska ha få kollisioner. En kollision är då två olika indata ger samma utdata. Kollisioner går att utnyttja ondsint om man till exempel lyckas skapa en fil med samma hash-värde som en annan. Verifieringsprocessen tror då att filen är oförändrad, men i själva verket kan det vara en helt annan fil.
Att kollisioner sker går inte att undvika. Enkelt går det att visa genom att det bara finns en diskret (bestämd) olika kombinationer utdata från en hash-funktion, exempelvis finns det bara ~340000000000000000000000000000000000000 variationer på hashen från MD5 (128 bitar. 2^128). Men indatan kan ju vara hur lång somhelst, och kan alltså då vara oändligt många kombinationer. Därför måste vissa indata "samsas" om ett utvärde.

Appendix D: Ytterligare Läsning
===============================
Denna sida: http://www.antsight.com/zsl/rainbowcrack/, rekommenderas.
Irongeek video: http://www.irongeek.com/i.php?page=videos/backtrackplaintext

Appendix E: Hur skyddar jag mig?
================================
Rainbowtables är väldigt enkla att skydda sig emot genom en teknik som kallas salting. Man använder ett så kallat 'salt' för att öka komplexiteten hos lösenordet, innan det körs genom hashfunktionen. Detta salt används alla framtida gånger också.
Man kan salta på många olika sätt: Lägga till saltet i början på lösenordet, i slutet, mittemmelan, sprida ut. Kombinationer av alla dessa. Salt stoppar dock inte bra brute-force program och dictionary attack program som har inställningar för salt, dessa tar bara med saltet i beräkningarna som sker. Observera att man måste känna till saltet då! Att bara få tag på databasen kanske inte räcker, inte om saltet är hårdkodat in i scripten. Rainbowtables kan dock inte anpassa sig för salt, då dessa redan är uträknade och sparade!
Exempel på saltning:
Användaren anger lösenordet: sex
Saltet: ABCabc123!"#{[]
Vad hashas: ABCabc123!"#{[]sex
Effektiv längd på klartext: 18.
Komplexitet: Hög.

Appendix F: Höga förväntningar
==============================
Förvänta dig inte att skapa större tabeller ensam, om du inte sitter på stora kluster förstås. Tabeller tar tid att skapa, och de mest avancerade (som jag sett) klarar knappt nio tecken med något annat charset än numeric. Så att knäcka hashar med en klartext på fler än nio tecken kommer nog inte hända. Undantaget är såklart LM, som egentligen inte har indata på nio tecken, utan två individuella på sju tecken.

Källor & Referenser
===================
http://en.wikipedia.org/wiki/Lm_hash
http://en.wikipedia.org/wiki/Rainbow_table
http://lasecwww.epfl.ch/pub/lasec/doc/Oech03.pdf

Författare
==========
daVajj
Citera
2006-11-11, 20:07
  #3
Bannlyst
Mycket bra skriver DaVajj, tack för en bra och innehållsrik guide!
Citera
2006-11-11, 20:12
  #4
Medlem
Mycket bra guide...



För intresserade kan nämnas:

http://www.rainbow-central.com/
Citera
2006-11-11, 23:19
  #5
Medlem
call3s avatar
Nice work
Citera
2006-11-12, 13:18
  #6
Bannlyst
www.plain-text.info är också bra. fint skrivet!
Citera
2006-11-12, 13:21
  #7
Bannlyst
Citat:
Ursprungligen postat av CB_0171
www.plain-text.info är också bra. fint skrivet!
Den finns redan med:
Citat:
Online-Cracker:MD5,LM,NTLM: http://plain-text.info/
Citera
2006-11-12, 13:41
  #8
Bannlyst
Citat:
Ursprungligen postat av LifeLong
Den finns redan med:
missade det.
Citera
2007-01-31, 10:39
  #9
Medlem
barreths avatar
vet att guiden har funnits ett tag, skulle bara passa på att tacka för bra läsning under frukostrasten. Mycket bra läsning
Citera
2007-05-04, 16:54
  #10
Medlem
fizzles avatar
Shyst läsning, plötsligt blev ett dimmigt ämne intressant.
Citera
2007-05-04, 23:32
  #11
Bannlyst
Har ett problem.


När jag har tankat klart tabeller, allt från 5gb till 60, så börjar jag packa ur.

Dock får jag alltid samma .rt, som alltid är 1GB. Varför? 60gb=1gb fil, 5gb=1gb fil?
Citera
2007-05-04, 23:52
  #12
Medlem
xobs avatar
Citat:
Ursprungligen postat av ~ Classic
Har ett problem.


När jag har tankat klart tabeller, allt från 5gb till 60, så börjar jag packa ur.

Dock får jag alltid samma .rt, som alltid är 1GB. Varför? 60gb=1gb fil, 5gb=1gb fil?

det är ju massa filer i raren som är 1gb. packar du upp rätt?
Citera
  • 1
  • 2

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in