Lámání hesel silou grafické karty

28. 9. 2009

Sdílet

 Autor: Redakce

Louskám, louskáš, louskáme

Problematika prolamování kódů se dá rozdělit na dvě oblasti: použití slovníkové metody (kdy testujeme slova ze slovníku – pokud je u použitého řetězce vrácena číslice 1, máme heslo) a metody hrubé síly (kdy ručně/skriptem zkoušíme všechny možné kombinace řetězců od/do dané délky), spíše známější pod anglickým termínem „brute force“. O první metodě tento článek není, nás bude zajímat právě hrubá síla.

Nvidia CUDA

Samotné zkoušení mnoha řetězců a jejich kombinací je úloha vysoce paralelizovatelná, tj. čím více procesorových jader máme k dispozici, tím lépe. Procesorová jádra nemusí být ani nikterak komplexní, stačí nám pouze schopnost náhodné generace znaků a jejich míchání (shuffle). I proto se k tomuto hodí relativně jednoduché stream procesory grafických karet, které pro náš účel postačí více než bohatě.

Jakžtakž bezpečné (alespoň dle ohlasů, co jsem mohl slyšet) je osmimístné heslo s následujícími parametry: A-Z, a-z, 0-9. Wikipedia tvrdí, že vyzkoušení takovéhoto množství kombinací (je jich celkem 218,3 bilionů) zabere (za předpokladu vyzkoušení sta iterací za sekundu) 70 000 let. To je docela dlouhá doba.

Délka lámání hesel (wikipedia.org)

Délka lámání hesel (zdroj: Wikipedia.org)

S pomocí grafické karty by mohl být čas mnohem kratší. Podívejme se nyní na aplikaci teoretických poznatků do praxe, tj. jak se vlastně hesla v současnosti šifrují.

Co se týče bezpečnosti hesel na internetu, je absolutně základní metodou použití nějakého hašovacího algoritmu (nemohu nezmínit faux-pas serveru Živě.cz v roce 2007). V minulosti (a někdy i dnes, i když to nelze doporučit) se hojně používalo MD5, poté, co v něm bylo roku 2004 objeveno větší množství chyb, se od něj začalo upouštět. Dnes bych doporučil používat SHA1, které má sice také pár chyb, i tak je ale mnohem bezpečnější, než jeho předchůdce.

MD5 poznáme jednoduše: vždy se jedná o 128bitový otisk (SHA1 používá delší, 160bitový hash). V oblíbeném a široce užívaném jazyku PHP je aplikace funkce md5() opravdu triviální:

Použití MD5

Právě přes otisky řetězců vede cesta, jak se dobrat k heslu: jednoduše budeme ověřovat otisky náhodně vygenerované série řetězců s daným otiskem; najdeme-li shodu, náš vygenerovaný řetězec je výsledek našeho snažení. Tak jednoduché to však není, další klacek pod nohy nám háže sůl, anglicky „salt“.

Použití soli má svůj význam: cílem je zabránit zneužití otisků v případě nabourání databáze, kde se nacházejí hashe. Vždy je totiž oddělena funkční část aplikace (scripty) a úložiště dat, k oběma by mělo být jiné heslo (jiné složení, délka). Co to znamená v praxi? Pokud byl programátor chytrý a své vygenerované hashe dále posolil, získáme pouze bezcenné hashe. Víc vám možná napoví kód níže.

Použití soli

Sami můžete vidět, že nynější otisk je naprosto odlišný od původního. Útočník se dostal pouze k jakýmsi kódům, které formálně vypadají jako MD5 hashe, budou mu však k ničemu. Dalším krokem útočníka bude nabourání serveru, na kterém jsou PHP soubory, vystudovat z nich metodu, kterou dodatečně šifrujeme, a pokračovat dále (naši metodu bude muset doprogramovat do své crackovací aplikace, aby mu vycházely otisky stejného ražení, jako máme my – následně již bude schopen heslo odhalit).

Tímto úsekem jsme tak trochu odběhli od Nvidia CUDA, považoval jsem ale za důležité zmínit bezpečnost hesel na internetu jako takovou. Jelikož nepředpokládám, že byste byli všichni programátoři, musíte se modlit, aby vámi získané otisky byly neposolené.

Multihash CUDA Brute Forcer

A přichází zlatý hřeb dnešního článku. Aplikaci Multihash CUDA Brute Forcer jsem objevil na internetu před pár dny a musím říci, že jsem byl dosti skeptický co se týče rychlosti louskání hesel: již nyní mohu prozradit, že zklamán jsem rozhodně nebyl. Pojďme si ji nyní představit.

Multihash CUDA Brute Forcer – crackujeme s grafickou kartou

Aplikace výše vznikla začátkem roku 2009, stojí za ní člověk s přezdívkou „Bitweasel“. Na aspekt uživatelské přívětivosti se nehledí, program se spouští z příkazové řádky. V současné stabilní verzi (0.61) podporuje tyto hašovací funkce: MD4, MD5 a protokol NTLM. V beta verzi 0.71 je zastoupeno mj. i SHA1, budu se ale zabývat výhradně popisem verze 0.61.

Licenčně se jedná o OpenSource aplikaci, podporované operační systému jsou Windows, Linux a Mac OS X. Rozhodl jsem se popisovat aplikaci v prostředí Windows, uživatelé Linuxových systémů si jistě poradí sami. Vzhledem k absenci GUI je nutno spouštět soubor CUDA-Multiforcer.exe z shellu (Win + R a zadat „cmd“), parametry aplikace jsou takovéto:

  • -h (povinný) → Specifikuje typ otisku.
  • -c (povinný) → Specifikuje znakovou sadu.
  • -o (nepovinný) → Určuje umístění výstupního souboru, kde se budou zapisovat výsledné řetězce.
  • -f (povinný) → Určuje umístění vstupního souboru s otisky.
  • -v (nepovinný) → Verbose output. Significantly greater detail on what is occuring behind the scenes.
  • --min (povinný) → Minimální délka výsledného hesla.
  • --max (povinný) → Maximální délka hesla. Program zvládne max. číslo 14.
  • -d (nepovinný) → Pro uživatele více grafických karet. Máte na výběr zvolit si, které GPU bude počítat, přednastavená hodnota je 0, tj. 1. CUDA GPU v systému.
  • -m (nepovinný) → Údaj v milisekundách. Čím více, tím větší vytížení GPU. Přednastavená hodnota je 50, kdy počítač bezproblémů reaguje. Při hodnotě 500 již GUI systému skoro nereaguje.
  • -b (nepovinný) → Force a certain block count (default 128).
  • -t (nepovinný) → Force a certain thread count (default 64).

S těmito parametry byste si měli vystačit. Pokud již máte nějaký hash a znáte délku řetězce, který reprezentuje, můžete si zkusit spustit program s následujícími parametry (mé heslo má 6 znaků):

CUDA-Multiforcer.exe -c charsets/charsetfull -f test_hash_files/hash.txt --min 0 --max 6 -h MD5

Pro účely testu jsem použil šestimístné heslo „1A2b3C“, výsledný hash má hodnotu „a5179470d52a4a5eb20c7059e41cb8c7“. Na mém počítači s přetaktovanou 8800 GTS (G92) a procesorem E8200 3,66 GHz jsem dosáhl nalezení stejného řetězce za 37 minut:

CMD

Při použití jiné znakové sady by byl výsledný čas ještě nižší: ve složce „charsets“ naleznete předdefinované sady znaků, podle kterých si můžete vytvořit svou vlastní. Pro tohle heslo se vysloveně nabízí použití verze „charsetloweruppernumeric“, kterou jsem si také vytvořil a se kterou jsem dosáhnul výborného času 3 minuty.

CMD 2

Síla GPU je opravdu značná: jak můžete vidět, má stará 8800 GTS dokáže počítat 358 milionů MD5 hashů za sekundu a porovnávat je se vzorem. Nyní je načase ukázat si, na jakou hodnotu se lze dostat se (skoro) nejvýkonnější jednočipovou grafickou kartou od Nvidie, s GTX 280. Silnější sestřičku, GTX 285, bohužel nemám k dispozici, i tak ale uvidíte, jak se o mnoho silnější GPU podepíše na době crackování.

Test: 8800 GTS vs. GTX 280

V minulé kapitole jste se mohli na vlastní oči přesvědčit, že „crackování“ MD5 hashů opravdu s grafickou kartou od Nvidie je možné a že funguje náramně dobře. 8800 GTS však přeci jen patří trochu do starého železa: pozornější by mohli namítat, že současná GTS 250 není de facto nic moc jiného, přesto by to chtělo srovnání s něčím aktuálnějším. A nejlépe mnohem výkonnějším.

Pro účely testu jsem se vybavil kartou GeForce GTX 280, po GTX 285 je to druhá nejvýkonnější jednočipová grafická karta na trhu od kalifornské společnosti zelených goblinů. S prvním testovacím kódem (tj. s parametrem -c charsets/charsetfull) si poradí GTX 280 následovně:

CMD

S o dost méně náročnějším -c charsets/charsetloweruppernumeric pak GTX 280 dosáhne výborného času 163 sekund.

CMD

Pro lepší orientaci a vzájemné srovnání jsem si připravil shrnující graf – časový rozdíl zejména u náročnější znakové sady je dostatečně markantní, hůře viditelný je pak rozdíl u sady jednodušší.

Graf

Dnešní článek vám předvedl, že hrozba prolamování hesel díky nedostatečně zabezpečeným databázím je reálná a velmi jednoduše proveditelná. Bezpečnosti šifrování a ukládání hesel je nutno věnovat maximální pozornost a ani tak bohužel není zaručeno, že se únik nemůže zdařit.

Multihash CUDA Brute Forcer jasně ukázal cestu: je zdarma, má otevřený zdrojový kód a funguje na všech třech rozšířených platformách. Verze 0.7 navíc nabídla podporu prolamování SHA1 hashů.

Do budoucna autor plánuje velké změny programu, kterými by se jeho užitečnost podstatně zvětšila. Na pořadu dne je to podpora více GPU, tj. podpora SLI systémů. Tu ještě znásobí podpora zasíťování počítačů, v praxi tedy snad bude možné použít určité množství počítačů ke společnému počítání otisků. Za relativně malé prostředky si budete moci postavit crackovací farmu s obrovským výkonem a lámat hesla jedna báseň.

Hacking

bitcoin_skoleni

Co se týče přepsání aplikace např. pro OpenCL, autor sám to v úmyslu příliš nemá a zveřejněním zdrojového kódu spíše spoléhá na to, že se toho ujme někdo jiný. Pro majitele ATi karet tedy v současnosti (aspoň co vím) k dispozici žádná takováto aplikace není a nevím ani o tom, že by měla být v plánu.

Bude zajímavé sledovat, jak zahýbe výkonem plánované jádro GT300. Oproti GTX 280 by mělo mít celých 512 stream procesorů na frekvenci 1,6 GHz, paměťová propustnost 256 GB/s zní rovněž velmi lákavě. Snad se v recenzi dočkáme i testu crackování, abychom si mohli výkon přesně porovnat.