mboost-dp1

Kunsten at knække et password


Gå til bund
Gravatar #1 - Jace
2. jan. 2008 01:22
Selvom denne tråd naturligvis udspringer af hacket af newz.dk vil jeg gerne opfordre til at der i denne tråd ikke blive diskuteret generelt om sagen, men derimod om det at knække passwords.

Når sådan noget som det her sker, så bliver man lidt nysgerrig om hvordan sådan noget password cracking foregår og hvor lang tid det egentlig tager.

Der er blevet snakket lidt om at hvis man vælger et password på 8+ karakterer og lidt tal og bogstaver samt specialtegn så vil det tage flere hundrede år at cracke det. Jeg kunne god tænke mig at prøve det på min egen computer, men det er nok ikke specielt smart at begynde at spørge efter cracking-software uden at forklare lidt om formålet.

Jeg har læst en del artikler på eksperten.dk og der bliver der snakket en del om programmet L0phtcrack som skulle være ganske godt til formålet. Jeg går ikke ud fra at et sådant program ligger til fri download rundt omkring på de store sitets på grund af det formål det tjener hvis det kommer i de forkerte hænder. Men er der nogen der ved om man kan få fat i et lignende program, så man kan prøve det lidt på sin egen maskine?

Jeg ved godt at hvis man vælger 8+ karakterer med forskellige tegn og tal samt specialtegn så giver det en hulens masse kombinationsmuligheder. Men hvor mange kombinationer kan en moderne computer egentlig afprøve i sekundet?

Håber på en god og saglig debat om kryptering og cracking af passwords :)
Gravatar #2 - Xill
2. jan. 2008 01:57
... du kan bare lave et lille C program der løber i gennem en liste med alle tegn, på samme måde som det var en tal liste du skulle læbe igennem.

et MD5 hash af resultaterne skal så sammenlignes med det MD5 hash'et password

på den måde vil du før eller siden finde den rigtige kode.
Gravatar #3 - arne_v
2. jan. 2008 01:58
Du kan teste passswords på 2 forskellige måder:
1) finde en liste med 100000-1000000 typiske passwords
2) systematisk generere alle mulige kombinationer af en given
længde udfra et givet tegnsæt
Du kan angribe på 2 måder:
A) udregne hash af passwords løbende
B) bruge en stor database med plain-hash og slå op i den (herunder den specielle form der hedder rainbow tables)

Det giver 4 muligheder ialt.

Hvormange hashes man an beregne per sekund afhænger naturligvis af den brugte algoritme.

newz.dk bruger SHA-256 hvilket er en god algoritme.

Jeg lavede en lille test og udfra den vil jeg anslå at en PC kan udregne mellem 100000 og 1 million SHA-256 hashes per sekund.

D.v.s. at hvis ens password er et af den kendte jævnfør #1, så er man dead meat hvis ens hash ryger ud.

For ikke kendte passwords kan man jo regne lidt:

8 tegn [a-z0-9] -> 36^8 muligheder -> 783 CPU timer
14 tegn [A-Za-z0-9] -> 62^14 muligheder -> 393 milliarder CPU år (så skal man jo nok til at indregne forbedringer i CPU hastighed over tid !)

Brug af salt forhindrer #B men ikke #A.

Brug af forskellig salt per brugernavn gør #A en lille smule sværere.
Gravatar #4 - Xill
2. jan. 2008 02:14
#3 ja det er rigtig, brugen af salt er altid en god ting, også selv om det er lige så nemt at få fat i hvad der er blevet brugt, som det er at finde listen med koder.

det forhinder desuden også 1), som formentlig er hvad tgg har brugt på newz.
Gravatar #5 - Jace
2. jan. 2008 02:28
#2 - Nej, det kan jeg ikke "bare" lige lave :)

#3 - Hvis vi antager at en PC kan udregne 1.000.000 pr. sekund, så vil et dictonary attack som du beskriver i metode #1 ikke tage voldsomt lang tid. Jeg ved ikke hvor mange ord en normal ordbog cirka indeholder med siden gdataonline.com har f.eks. en database (rainbow table?) på 1,133,736,548 hashes. Det vil altså tage cirka 1000 sekunder eller 20 mins at løbe hele den liste igennem.

Din metode #2 (Brute-forcing) synes jeg er meget interessant at regne lidt på. Du siger:
Jeg lavede en lille test og udfra den vil jeg anslå at en PC kan udregne mellem 100000 og 1 million SHA-256 hashes per sekund.

Kan du fortælle lidt mere om den test? Har du skrevet en kodestump eller hvordan?

En anden ting: Hvorfor vælger man egentlig at anvende SHA-256 når der både findes SHA-384 og SHA-512? Kræver det virkelig så meget mere af newz.dk serveren at det ikke kan betale sig?

Jeg ved ikke så meget om det (hvorfor jeg også har startet denne tråd) men er det ikke noget med at SHA-256 giver en 32 chars hash værdi og de to andre giver en noget længere? Er sikkerheden (den tid det tager at brute-force sig frem til koden) ikke meget bedre på 384 og 512?

8 tegn [a-z0-9] -> 36^8 muligheder -> 783 CPU timer
14 tegn [A-Za-z0-9] -> 62^14 muligheder -> 393 milliarder CPU år

Det er jo en kæmpe forskel og i særdeleshed et glimrende argument for at bruge et avanceret password. Hvordan er du kommet frem til tiden i CPU timer? Er det ved at bruge 1.000.000 hash udregninger pr. sekund eller hvad?
Gravatar #6 - arne_v
2. jan. 2008 03:02
#4

Nej. Salt forhindrer ikke 1 i form af 1A.
Gravatar #7 - arne_v
2. jan. 2008 03:09
#5

Har du skrevet en kodestump eller hvordan?


Ja - jeg skrev lige en stump Java til at teste med.

Hvorfor vælger man egentlig at anvende SHA-256 når der både findes SHA-384 og SHA-512?


Fordi de næppe vil være mere sikre end SHA-256.

Der er ingen af de angreb som er nævnt ovenfor hvor hash længden gør en forskel.

Der er andre former for angreb (husk at hash bruges til andet end password), hvor længden betyder noget, men her anses SHA-256 for at være sikkert.

Det er jo en kæmpe forskel og i særdeleshed et glimrende argument for at bruge et avanceret password. Hvordan er du kommet frem til tiden i CPU timer? Er det ved at bruge 1.000.000 hash udregninger pr. sekund eller hvad?


Ja.
Gravatar #8 - milandt
2. jan. 2008 08:37
Mit password var f.eks "helle". Newz havde været så venlige at stille en hash krypteret udgave frit til rådighed for TGG. Det betyder at TGG kunne se at mit hash krypteret password var:

cd44092e51f1c170469f6a4f36dc2f80

Heldigvis for TGG er der nogen der igennem tiden har samlet en liste over en masse almindelige ord og deres tilhørende hash kryptering. Det betyder, at hvis man f.eks går ind på et website som dette:

http://md5.gromweb.no-ip.com/index.php?md5=cd44092...

.. så vil man kunne se at den hash krypterede værdi kommer af ordet "helle".

Det er også derfor at de passwords der er blevet cracket ikke er passwords som "Ih4v3ApAsswordN00neC4nCrack!!^". Passwords som dette er der meget lille sandsynlighed for ville findes i en sådan liste over hash krypterede ord.
Gravatar #9 - myplacedk
2. jan. 2008 11:33
#1
Jeg går ikke ud fra at et sådant program ligger til fri download rundt omkring på de store sitets på grund af det formål det tjener hvis det kommer i de forkerte hænder.

Den slags programmer ligger nu til rådighed alligevel, da de også bliver brugt af sikkerheds-folk.

Fx. indeholder Debian Linux programmet "medussa":
Medussa is a distributed password cracking system that can attempt various types of attacks to crypted passwords distributing the work on many machines.


Der er også port-scanner og sikkert mange andre sjove ting.

Sådan nogle "password-guessers" (eller hvad man nu kalder dem) bliver nogle gange brugt af system-administratorer, til at se om folk bruger svage kodeord.

Port-scannere bliver brugt på sit eget netværk, til at se hvad andre vil opdage med en port-scan.
Gravatar #10 - Jonasee
2. jan. 2008 11:55
ved ikke om det kun er mig, men jeg sidder tidt og prøver at hack mine ejen systemer for at tjekke dem eller for andre til det
Gravatar #11 - Jace
2. jan. 2008 13:00
#7: arne_v: Er den noget du vil dele med os andre? Den lille kodestump. Både source og den færdige :)

#9: myplacedk: Okay, du kender ikke tilfældigvis nogle programmer til windows som man kan prøve at hente og lege lidt med? Vil da gerne prøve at se hvordan mine forskellige passwords opfører sig overfor sådan et angreb :)
Gravatar #12 - myplacedk
2. jan. 2008 13:10
#11
Nej desværre, jeg er ikke så meget inde i Windows-verdenen. :)

Hvis man koder en smule, er en simpel brute-force jo ren 1. semester-stof.

Ellers kunne man tage md5sum'en, og slå op i en rainbow-tabel.
Knapt så sjovt, men det er jo nok det første folk prøver.
Gravatar #13 - Jace
2. jan. 2008 13:33
#3: arne_v: Forresten:
8 tegn [a-z0-9] -> 36^8 muligheder -> 783 CPU timer
14 tegn [A-Za-z0-9] -> 62^14 muligheder -> 393 milliarder CPU år


burde det ikke være 8^36 og 14^62 muligheder?

8^36 giver: 3,24519E+32

36^8 giver: 2,82111E+12
Gravatar #14 - Jace
2. jan. 2008 13:36
Vi tager den lige i nogle tal der er lidt nemmere at arbejde med :)

8^36: 324.518.553.658.427.000.000.000.000.000.000

36^8: 2.821.109.907.456
Gravatar #15 - fidomuh
2. jan. 2008 13:37
#13

Nej, det er jo 36 chars ^ 8 charslots :)

Saa det er kun 36^8.

Tilgengaeld skal du indregne store og smaa tegn, hvorfor det bliver 62^8 istedet, som giver et lidt stoerre resultat..
Gravatar #16 - Jace
2. jan. 2008 13:42
#15: Ja, jeg kom også lige til at se på det igen. Det er min fejl ;)
Gravatar #17 - fidomuh
2. jan. 2008 13:47
#16

Hehe, man skal saa ogsaa huske at cpu-tiden der bruges paa at knaekke SHA-256 kan mindskes ved at bruge en blanding af bruteforce og rainbow-tables..

Samtidigt kan man mindske det yderligere ved at have flere maskiner der deles om arbejdet ( Medussa fx ) :)

Saa helt reelt er vi nok ude i noget der ligner:

62^8/1.000.000/3 = sekunder :)

Antaget at man har 3 maskiner i stil med Arne_v's, har man en serverfarm til raadighed gaar det vaesentligt hurtigere ;)

Saa er vi ude i noget lignende 2.3 aar for 1 maskine og saa dividerer du jo bare med x maskiner :)
Gravatar #18 - Jace
2. jan. 2008 13:51
#3: arne_v: Hvilken maskine har du kørt testen på?

#17: Ja, men kunne selvfølgelig hacke sig ind og bruge folding@home systemets computere, så ville det nok ikke tage mere end en eftermiddag :)

Hvordan fungerer det med at bruge bruteforce og rainbow tables sammen?
Gravatar #19 - myplacedk
2. jan. 2008 13:55
#18
Hvordan fungerer det med at bruge bruteforce og rainbow tables sammen?

Man tjekker lige i rainbow tabellen før man giver sig til at brute-force. :)

I øvrigt skal vi huske at de tids-estimater er for at beregne samtlige muligheder, dvs. worst-case hvis man skal bryde én kode.
Gennemsnitstiden for at bryde én kode er det halve. Den reelle tid er et spørgsmål om held, man kunne jo ramme rigtigt inden for 10 sekunder, selv om det tager et år at løbe alle muligheder igennem.
Gravatar #20 - Jace
2. jan. 2008 14:07
#19
Man tjekker lige i rainbow tabellen før man giver sig til at brute-force. :)

Hvis vi nu tager udgangspunkt i det der er sket her på newz.dk, så må man formode at de først har kørt hele listen af 25.000 brugere igennem med en rainbow-table, hvilket har givet dem de første 5.000 passwords. Det næste skridt vil så være ren og skær brute-force på de resterende 20.000 passwords, ik?

Det vil sige at hvis man har et password som ikke er i en rainbow-table, så vil det gennemsnitligt tage:

62^8/1.000.000/2/60/60/24/365 = 3,46 år.
Gravatar #21 - fidomuh
2. jan. 2008 14:11
#20

De 3,46 aar er saa for at finde samtlige passwords, hvis man samtidigt laver en tabel udfra de fundne passwords.

Saa vi kigger maaske lidt mere realistisk paa ~1.5-2 aar, for at have samtlige newz.dk SHA-256 passwords :)
Gravatar #22 - Jace
2. jan. 2008 14:12
Hvis man bare går op og bruger 9 karakterer så blive det:

62^9/1.000.000/2/60/60/24/365 = 214,6 år.

Så selvom hackeren har 100 computere til rådighed vil det altså stadig tage ham gennemsnitlig 2,14 år at knække koden. Så skal det altså være mere vigtigt end bare en newz.dk konto som gemmer sig bag koden for at man gider gå igang :D
Gravatar #23 - myplacedk
2. jan. 2008 14:15
#20
Man kan så kombinere brute force med et dictionary attack.

Med et dictionary attack genererer man en masse kodeord ud fra en slags ordbog (måske en rigtig ordbog, men helst én tilpasset til formålet, dvs. den indeholder ord som typisk tages udgangspunkt i til kodeord), og ser om der er noget der der passer.

Ved at kombinere brute force og dictionary attack prøver man alle muligheder af, men man starter med de mest sandsynlige.

Dvs. en kode på 16 tegn med store og små bogstaver plus tal og tegn er ikke så god, hvis den fx. er "F1ssef1ssef1sse.". Den bliver måske brudt på få sekunder med dictionary attack, hvis ellers det rigtige ord er tilføjet ordlisten.
Gravatar #24 - Jace
2. jan. 2008 14:16
Nej, de 3,46 år er for at løbe halvdelen af kombinationerne igennem. Hvis man vil have samtlige passwords vil det være 6,92 år.

Egentlig mærkeligt hvorfor den table ikke er blevet lavet? :)
Gravatar #25 - Spiderboy
2. jan. 2008 14:22
#24
Prøv at forestille dig hvor meget sådan en tabel må fylde.
Gravatar #26 - Jace
2. jan. 2008 14:51
#25: Sådan et spørgsmål skal selvfølgelig ikke stå ubesvaret hen :)

62^8: 218.340.105.584.896 muligheder.

Hver mulighed indeholder 8 karaktere eller 8 bytes om man vil.

Det giver: 1.746.720.844.679.170 bytes

Til hver mulighed vil tabellen også indeholder den dertilhørende hash-værdi som er på 32 tegn eller bytes: 6.986.883.378.716.670 bytes

Tilsammen giver dette: 8.733.604.223.395.840 bytes.

Afrundet giver det:

8.733.604.223.395.840/1024/1024/1024/1024 = 7943 terabytes
Gravatar #27 - ZykoPeTTer
2. jan. 2008 14:53
Det vil sige at hvis man har et password som ikke er i en rainbow-table, så vil det gennemsnitligt tage:
62^8/1.000.000/2/60/60/24/365 = 3,46 år




De 3,46 aar er saa for at finde samtlige passwords, hvis man samtidigt laver en tabel udfra de fundne passwords.


Well det er vel under forudsætning af at man PÅ FORHÅND ved at passwordet ER PRÆCIST 8 tegn langt!

Hvis man nu intet kender til passwordet, så må man jo antage at det kan være fra 1-10 tegn eks, eller fra 4-8 og så beregne ud fra det, og det må jo give endu flere muligheder.
Gravatar #28 - Spiderboy
2. jan. 2008 15:04
#26
Hvorfor spørger du så, hvis du selv nemt kan finde svaret? ;-)
Gravatar #29 - Jace
2. jan. 2008 15:05
#27: Ja, det er rigtigt nok. Ved brute-force er man nødt til først at prøve alle de muligheder der er hvis passwordet indeholder 1 karakter (hvilket dog ikke tager lang tid med 1.000.000 beregninger i sekundet, men det skal stadig med) og så videre til 2 karakterer.

1 karakter: 0,000031 sekunder
2 karakter: 0,001922 sekunder
3 karakter: 0,119164 sekunder
4 karakter: 7,388168 sekunder
5 karakter: 7,634440 minutter
6 karakter: 7,888921 timer
7 karakter: 20,37971 døgn
8 karakter: 3,461759 år
9 karakter: 214,6290 år

Så i virkeligheden gør det ikke rigtig nogen forskel om man prøver 1-8 karakterer eller bare hopper direkte på 8 karakterer med hensyn til tidsforbruget.
Gravatar #30 - Jace
2. jan. 2008 15:07
#28: Spiderboy
Egentlig mærkeligt hvorfor den table ikke er blevet lavet? :)


Jeg spørger jo netop hvorfor man dog ikke laver sådan en liste når det nu er så nemt :)
Gravatar #31 - ZykoPeTTer
2. jan. 2008 15:10
#30
Der findes massere af lister.
Deriblant en næsten komplet liste over NTLM hashes, mener enddag kun den er på ca 120Gb.

Men man ender jo hurtigt med mange PB, hvis man skal have komplette lister over alle algoritmer :P

Derudover vil det jo også tage mange år, uanset hvilket computer setup man benytter.
Gravatar #32 - Saxov
2. jan. 2008 15:13
#26, og så kan du jo regne videre:

7943 terabytes til en tabel, og 4,1 gigabytes per Gmail account...

Så man skal bare registere:
7943(TB)*1024(GB/TB)/4,1(GB) = 1.983.813 Gmail accounts - og så har man plads. :)
Gravatar #33 - Jace
2. jan. 2008 15:15
#32 - Det er jo det jeg siger... Det er slet ikke så svært at få lavet :)
Gravatar #34 - themuss
2. jan. 2008 15:52
Dem der spørger efter Windows-programmer... Jeg mener John the Ripper findes som win32 app.
Gravatar #35 - freesoft
2. jan. 2008 17:11
Gravatar #36 - Jace
3. jan. 2008 00:31
#35: Den knækkede min windows kode på 3½ time. Koden er lavet med 4 bogstaver efterfulgt af fire tal f.eks. etgy7436, så den skulle igang med at bruteforce. Jeg prøvede at sætte koden til "hash" og så gik der 1-2 sekunder :)
Gravatar #37 - arne_v
3. jan. 2008 00:59
#11

Her er en version som genererer hashes for alle længder 1..maxlen af et givet tegn sæt.

Problemet er ikke optimeret for hastighed, men skulle gerne illustrere at der ikke er noget specielt avanceret i et sådant program:

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class HashGenerator {
private static MessageDigest md;
public static void main(String[] args) throws NoSuchAlgorithmException {
md = MessageDigest.getInstance("SHA-256");
printAllHash("abcdefghij", 3);
}
public static void printAllHash(String valid, int maxlen) {
for(int i = 1; i <= maxlen; i++) {
printAllHash(valid.toCharArray(), new char[i], 0);
}
}
public static void printAllHash(char[] valid, char[] buf, int ix) {
if(ix < buf.length) {
for(int i = 0; i < valid.length; i++) {
buf[ix] = valid[i];
printAllHash(valid, buf, ix + 1);
}
} else {
printHash(new String(buf));
}
}
private static void printHash(String pw) {
System.out.println(pw + " -> " + toHex(md.digest(pw.getBytes())));
}
private static String toHex(byte[] ba) {
char hexdigit[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
StringBuffer sb = new StringBuffer("");
for (int i = 0; i < ba.length; i++) {
sb.append(hexdigit[(ba[i] >> 4) & 0x0F]);
sb.append(hexdigit[ba[i] & 0x0F]);
}
return sb.toString();
}
}
Gravatar #38 - arne_v
3. jan. 2008 01:01
#18

Jeg fik 100000 i Java med en P4. Jeg gætter så på at noget optimeret C på en flunkende ny C2D kunne nå op på en 1 million.
Gravatar #39 - arne_v
3. jan. 2008 01:04
#24 & 26

Prøv og lad tal være valide og gå op til max længde på 10 of udregn plads forbruger så ...

:-)
Gravatar #40 - arne_v
3. jan. 2008 01:07
#diverse med tabel opslag

Bemærk iøvrigt at:

normal tabel = gemmer alle entries

rainbow tabel = gemmer ikke alle entries men laver noget matematik i.s.f. (læs artiklen på Wikipedia)
Gravatar #41 - arne_v
3. jan. 2008 01:08
#26

Du skal også gemme hash (på 32 bytes).
Gravatar #42 - Jace
3. jan. 2008 01:25
#41: Det har jeg skam husket :)
Til hver mulighed vil tabellen også indeholder den dertilhørende hash-værdi som er på 32 tegn eller bytes: 6.986.883.378.716.670 bytes

Gik det lige lovligt hurtigt med at læse tråden igennem her kl. 2 om natten? :)
Gravatar #43 - Jace
3. jan. 2008 01:27
#39: arne_v:
#24 & 26

Prøv og lad tal være valide og gå op til max længde på 10 of udregn plads forbruger så ...

:-)


Det der forstod jeg meget lidt af :)

Kan du uddybe det en smule?
Gravatar #44 - themuss
3. jan. 2008 01:29
EN HASH-GENERATOR, JA TAK!!!!!
Gravatar #45 - Jace
3. jan. 2008 01:31
#37: arne_v: Super fed kode stump. Jeg ved intet om Java, kun PHP, men jeg kan da se lidt af idéen i det :)

Hvis du kan compile den til noget som måske kan køre i en console (GUI er vist overkill her) så vil jeg da meget gerne prøve at køre det på min C2D...
Gravatar #46 - arne_v
3. jan. 2008 01:34
#42

Ja det gik vist lidt for hurtigt selvom kokken kun er 20 her.
Gravatar #47 - arne_v
3. jan. 2008 01:36
#44

Og det er oven i købet helt lovligt at være i besiddelse af en SHA-256 hash. Eller et par trillioner.
Gravatar #48 - Jace
3. jan. 2008 01:41
#46 - Wicked! Bor du permanent i USA?
Gravatar #49 - arne_v
3. jan. 2008 01:56
#43

(26+26+10) ^ 10 er mange gange større end (26+26)^8
Gravatar #50 - arne_v
3. jan. 2008 01:56
#45

Her den i PHP:

<?php
function printHash($pw) {
echo $pw . ' -> ' . hash('sha256', $pw) . '<br>';
}
function realPrintAllHash($valid, $buf, $ix, $len) {
if($ix < $len) {
for($i = 0; $i < strlen($valid); $i++) {
$buf[$ix] = $valid[$i];
realPrintAllHash($valid, $buf, $ix + 1, $len);
}
} else {
printHash(implode('',$buf));
}
}
function printAllHash($valid, $maxlen) {
for($i = 1; $i <= $maxlen; $i++) {
realPrintAllHash($valid, array(), 0, $i);
}
}
printAllHash('abcdefghij', 3);
?>
Gå til top

Opret dig som bruger i dag

Det er gratis, og du binder dig ikke til noget.

Når du er oprettet som bruger, får du adgang til en lang række af sidens andre muligheder, såsom at udforme siden efter eget ønske og deltage i diskussionerne.

Opret Bruger Login