Online version

Talk detail

Jak jsem v “domácích podmínkách” cracknul skoro všechna hesla z Mall.cz za půl dne. Hesla se dnes nelámou pomocí předpočítaných tabulek nebo zkoušením každé možné kombinace pomocí brute-force útoků. Díky analýzám uniklých dat totiž víme, jak uživatelé hesla vytváří a toho se dá využít k efektivnímu zkoušení vhodných tzv. kandidátů. Přijďte, ukážu vám jak se to dělá. Z toho všeho nám mimo jiné vyplyne, proč je hesla potřeba ukládat správně za použití relativně pomalých hashovacích funkcí jako např. bcrypt nebo Argon2i.

Date and event

7. 10. 2017, LinuxDays 2017 (talk duration 25 minutes, 34 slides, video)

Slides

Crackování hesel

#1 Přednáška o moderním lámání (“crackování”) hesel. Najdete v ní popsané techniky a používané programy i něco o tom, na jakém hardware se spouští a jaký to má ve finále výkon.

Pepa92 → hash

#2 Když aplikace ukládá hesla uživatelů, měla by je ukládat tzv. hashovaná. Ale to jistě už víte, že? Že jo? Probíhá to tak, že z hesla nějakou hashovací funkcí (nejlépe tou správnou) vypočítáme hash a ten pak uložíme do databáze.

Pepa92 ↚ hash

#3 Hashovací funkce jsou tzv. jednosměrné funkce, z vypočítaného hashe tedy nelze zpětně nijak “rozhashovat” původní heslo. Tím se hashování liší od šifrování, při kterém lze při znalosti správného klíče data zpět dešifrovat do původní podoby. Hashování je svým způsobem jakýsi kontrolní součet nebo otisk prstu, ze kterého člověka, který otisk zanechal, zatím neumí zpětně získat ani američtí vědci. Kdybychom měli otisky prstů všech osob, tak porovnáním zjistíme, kdo je majitelem prstu, jehož otisk jsme na místě činu našli.

Hesla ⇛ hashe == hash?

#4 Podobně je to u crackování hesel. Nějakým způsobem generujeme tzv. kandidáty na heslo, spočítáme jejich hashe a porovnáme, jestli se náhodou nerovnají hashům, které jsme získali z databáze. Tomu se říká offline útok na hesla: útočník má hashe k dispozici a může si je zkoušet lámat klidně i bez připojení k Internetu. Oproti tomu online útokem nazýváme to, kdy útočník opravdu hesla zadává do přihlašovacích formulářů, samozřejmě nějak automatizovaně. Na rychlosti generování a “kvalitě” kandidátů záleží za jak dlouho hesla crackneme.

Brute-force

#5 Kandidáty můžeme generovat a na hesla útočit “hrubou silou”. Anglicky se tento způsob nazývá brute-force attack, ne “brutal force”.

aaa, aab, aac, aad, aae, aaf ⇛ hashe == hash?

#6 Brute-force spočívá ve zkoušení všech možných kombinací. Pro heslo o osmi znacích bychom tedy museli vypočítat hashe z:

  • aaaaaaaa
  • aaaaaaab
  • aaaaaaac
  • aaaaaaad
  • aaaaaaae

… a tak dále a porovnat je s jedním nebo více hashi, které máme např. z databáze. Tato metoda je vcelku pomalá, protože většinu kandidátů, které vygeneruje, nikdy nikdo jako heslo nepoužije, uživatelé totiž vytváří hesla předvídatelně. Teda samozřejmě pokud nepoužijí nějakého správce hesel. Ale hesla vytvořená v password manageru jsou běžně dlouhá 15 a víc znaků a na ty se metoda brute-force také nehodí, trvalo by věčnost, možná i dvě, než by takové kandidáty vygenerovala.

Dictionary Attack

#7 Další známou možností jak generovat kandidáty je “slovníkový útok”. Místo všech možných kombinací zkoušíme jen slova, která jsou uvedená v nějakém seznamu nebo slovníku, protože uživatelé taková slova znají a tedy často používají jako hesla. Pri vytváření se snaží být trochu chytřejší a zvolené slovo nějak upraví nebo doplní třeba i proto, že jim to politika hesel často nařizuje pomocí výhružných chybových hlášek typu heslo musí mít alespoň jedno velké písmeno a číslo! Klasický slovníkový útok tedy také není moc úspěšný.

Rainbow Tables

#8 Rainbow Tables, “duhové tabulky”, je konkrétní implementace tzv. předpočítaných tabulek. Tento způsob lámání hesel se hojně používal dříve, dnes je již překonán.

Předpočítané tabulky

#9 Předpočítané tabulky využívají předem vytvořené databáze hashů a původních hesel. Při znalosti hashe je tedy velmi rychlé nalézt heslo, ze kterého byl ten hash vypočítán. Nevýhoda předpočítaných tabulek je jejich velikost (která se redukuje použitím “rainbow table”), často obsahují nepravděpodobné kandidáty, a nutnost generovat nové tabulky pro každý algoritmus. Použití saltu při hashování navíc jejich použití znemožní. Salt je unikátní pro každé heslo a bylo by tedy nutné tabulky pro každé heslo předpočítat znovu, čímž to celé ztrácí smysl.

CrackStation

#10 Používání předpočítaných tabulek si můžete vyzkoušet díky nástroji CrackStation i ve svém prohlížeči. Pro hashe MD5 a SHA-1 obsahuje databáze nástroje 190 GB dat, což dává 15 miliard záznamů, včetně obsahu článků z Wikipedie z roku 2018 a známých úniků. Předpočítou tabulku s 19 GB dat si můžete stáhnout na takové to domácí crackování.

NVIDIA GTX 1080 Ti

#11 Na lámání hesel se dnes používají výkonné grafické karty jako např. tahle kráska. NVIDIA GTX 1080 Ti je aktuálně nejvýkonnější běžně dostupná karta na crackování hesel: zvládne vypočítat 31 miliard MD5 hashů za vteřinu. Na crackování hesel chcete Founder's Edi­tion, tedy referenční kartu, která používá skoro až přehnaně kvalitní komponenty a díky tomu vydrží 100% zátěž 24 hodin denně, 7 dní v týdnu. Jenže GTX 1080 Ti Founder's Edition už nekoupíte, budete si muset počkat na referenční karty nové řady s chipem NVIDIA Volta. Pro porovnání: GTX 1080 Ti umí vytvořit cca. 650 bcrypt hashů za vteřinu s počtem opakování 210 (benchmark je pro rychlost 25) a GTX 1080 je o pětinu pomalejší.

ASUS ROG POSEIDON GeForce GTX 1080Ti Platinum edition OC 11GB

#12 “Herní” edice grafických karet (poznáte je podle mohutných a často různobarevných větráků) nejsou na crackování vhodné. Z důvodu snížení výrobních nákladů nepoužívají tak kvalitní komponenty a výrobci často ani nezmění návrh a použijí architekturu z předchozí řady a jen vymění chip za novější. Ostatně podívejte se sami na poznámku k nejdražší kartě (25 999 Kč s DPH) s GTX 1080 Ti Hodinky s vodotryskem edition na Alze: nejdražší a nejvýkonnější karta prý není vhodná pro užití při vysokých zátěžích a náročných procesech. Pokud poznámku nevidíte, tak se nedivte, v mobilní verzi chybí.

Alzák: ¯\_(ツ)_/¯

#13 Ale co, ona i Alza na to má svůj názor: ¯\_(ツ)_/¯. Takže na crackování prostě opravdu chcete Founder's Edition.

[a-zA-Z0-9]{8}: 218 340 mld., 7043 sec, 2 hod

#14 31 miliard MD5 hashů za vteřinu je obrovské číslo a pokud nejste zrovna bývalý ministr financí, tak si ani tu miliardu asi nedokážete představit. Pojďme ho teď ale trochu zasadit do kontextu, myslím to číslo samozřejmě. Počet všech možných kombinací pro heslo složené z 8 znaků, které mohou být malé písmeno, velké písmeno nebo číslo je 218 bilionů. Vygenerovat tolik MD5 hashů zabere kartě GTX 1080 Ti přibližně 2 hodiny, přesněji 7043 vteřin.

[a-zA-Z0-9]{9}: 13 537 086 mld., 436 680 sec, 5 dní

#15 Projít všechny kombinace hesla o devíti znacích složeného z malých a velkých písmen a čísel zabere 62× tolik času, tedy cca. 5 dní.

[a-zA-Z0-9]{10}: 62^10, 27M sec, 313 dní

#16 Desetiznakové heslo složené z malých a velkých písmen a čísel má 6210 možných kombinací. Vygenerovat tolik MD5 hashů zvládne GTX 1080 Ti za 313 dní.

[a-zA-Z0-9]{11}: 62^11, Moc sec, 53 let

#17 Vygenerovat hashe pro všechny možné kombinace 11 znakového hesla (malá a velká písmena a čísla) by trvalo dnes nejvýkonnější kartě GTX 1080 Ti celkem 53 let.

[a-zA-Z0-9]{12}: 62^12, Moc sec, 3 300 let

#18 A poslední matematické okénko: GTX 1080 Ti by generovala MD5 hashe ze všech možných kombinací hesla dlouhého 12 znaků asi tři tisíce tři sta let. Z toho plyne, že i když aplikace ukládá vaše heslo pomocí totálně nedoporučovaného (nejen na ukládání hesel) a rychlého algoritmu MD5, tak útočníkovi bude na jedné fakt hodně výkonné kartě trvat 3 300 let, než vyzkouší všechny kombinace a-zA-Z0-9. A když budete heslo generovat ve správci hesel, tak mu ani nic jiného nezbude. Ještě jinak: pokud máte náhodně generované heslo dlouhé 12 a více znaků, tak je celkem bezpečně uloženo i při použití MD5. Přidejte jeden znak a bude to trvat 62× déle a to ani nechci počítat kolik to dá, když k malým a velkým písmenům a číslům přidáte speciální znaky. Jenže většina uživatelů hesla takto nevytváří.

8× GPU GeForce GTX

#19 Čas lámání lze zkrátit použitím více GPU. Stroje s 8× GTX 1080 Ti (nebo jinými GPU) staví společnost Sagitta HPC (HPC v tomto případě znamená High Performance ComputingCrac­king) a když chcete (a máte dostatek elektřiny a zlaťáků), tak vám jich do clusteru zapojí třeba deset.

Logo Mall.cz

#20 ---8<--- Střih ---8<---

Provozovatel české nákupní galerie Mall.cz na konci srpna 2017 musel vymazat (“resetovat”) hesla zhruba 1,3 milionu uživatelů. Je možné, že e-mail s touto informací přišel i vám, podobně jako mě.

Mallér

#21 Mall.cz totiž potkal malér. Zatím nevíme kdy přesně, ale víme, že to nebylo nic příjemného. Do podobné situace se dostal i například prodejce her Xzone.cz nebo slovenský web SkTorrent a stovky a tisíce dalších.

Screenshot článku na Lupě

#22 Na konci července 2017 se na službě pro anonymní sdílení jakýchkoliv textů Pastebin.com objevil odkaz na stažení 750 tisíc účtů a hesel uživatelů Mall.cz. Odkaz vedl na Ulož.to, ale v době resetování hesel již nefungoval. Později se zjistilo, že v onom souboru na Ulož.to bylo 750 tisíc hesel v čitelné podobě (381 908 unikát­ních). Mall ale údajně hesla v čitelné podobě nikdy neukládal. Do roku 2012 používal pro ukládání uživatelských hesel hashovací funkci MD5, poté SHA-1 s kryptografickou solí a od podzimu roku 2016 používá jeden z doporučovaných způsobů ukládání hesel, hashovací algoritmus bcrypt. Detaily sleduje můj projekt se seznamem firem, které již zveřejnily způsob ukládání hesel. Moc to s hesly v čitelné podobě nejde dohromady, co? Jenže Mall.cz stará hesla správně nepřehashoval a tvrdil, že uniklá hesla jsou právě z dob, kdy používali MD5. Při vylepšování ukládání hesel je potřeba správně přehashovat i existující hesla.

Tesla Model S před benzínovou pumpou

#23 Hned se samozřejmě vyrojily různé teorie, že Mall hesla ukládal v čitelné podobě a že jsou neschopní a tak podobně. Já si myslím, že hesla opravdu unikla nějak hashovaná a někdo je cracknul. Tomu by odpovídalo i to, že Mall.cz resetoval hesla zhruba dvojnásobku uživatelů (1,3 milionu), než byl počet účtů, které se objevily na Ulož.to (750 tisíc). Abych to ověřil, tak jsem si pronajal Teslu a šel to vyzkoušet. A jéje, sorry, špatnej obrázek.

NVIDIA Tesla K80 GPU

#24 Tuhle Teslu. V nabídce “cloudu” Amazon Web Services nenajdete GTX 1080 Ti a tak jsem si pronajal stroj s grafickou kartou NVIDIA Tesla K80. Tyto karty se používají na různé výpočty na GPU, ne na zobrazování na monitory. Všimněte si, že nemá žádný výstup. Oproti GTX 1080 Ti je o řád pomalejší, zvládne “jen” 4,5 miliardy MD5 hashů za vteřinu. Aktualizace: od 25. října 2017 nabízí Amazon i stroje s kartami NVIDIA Tesla V100, jedna spočítá 53 miliard MD5 hashů za vteřinu a jen 1700 bcrypt hashů za vteřinu při rychlosti 210 (benchmark bcryptu se počítá pro rychlost 25).

16× NVIDIA Tesla K80 GPU + hashcat

#25 Slabší výkon karet Tesla K80 se dá trochu dohnat jejich počtem. Pronajal jsem si tedy nejsilnější instanci p2.16xlarge s 16× GPU a celkovým výkonem 73 miliard MD5 hashů za vteřinu (aktualizace: p3.16xlarge s 8× GPU Tesla V100 umí spočítat 420 miliard MD5 hashů/s) a zkusil hesla vycrackovat, tak jak to nejspíš udělal někdo, kdo 750 tisíc účtů zveřejnil. Hesla k těm účtům jsem zahashoval do MD5 a bez nějaké velké přípravy (profík by tuto část nepodcenil) se mi za 12 hodin (pak jsem šel spát a server vypnul) povedlo cracknout skoro všechna, zbylo mi jich 935 necracknutých, přičemž za 45 minut jsem měl vylámáno 165 tisíc hesel, tedy cca 43 %. Na crackování jsem použil nástroj hashcat, dalším známým a používaným je John the Ripper.

Cracknutá hesla

#26 Toto jsou některá hesla, která se podařilo cracknout, všechna byla vytvořena v hlavě:

  • Renik2510!! – jméno (nejspíš Renata), číslo a vykřičníky na předvídatelné po­zici
  • andalusan89T@ – slovo a čísla a nějaké další znaky na konci
  • čokoládamilka – dvě česká slova i s diakritikou
  • lindisfarne793 – název ostrova a tři čísla na konci (ta čísla navíc odpovídají nějakému letopočtu)
  • kobylamamalybok – 4 česká slova, program palindromy nezkouší
  • asdfghjkl0123456789 – “procházka po klávesnici” asdfghjkl + číselná řada

… a další, z nichž některá najdete v článku na Lupě.

Heslo ve slovníku rockyou.txt: "to neuhodnes"

#27 Jako slovníky (občas se slovníku říká “word list”) se často používají seznamy již uniklých hesel. Takovou klasikou je seznam rockyou.txt, ve kterém je přes 14 milionů hesel v čitelné podobě. Je v něm mimo jiné i heslo to neuhodnes (hele, spíš asi jo), které také bylo v úniku z Mallu, nebo cokoladamilka, tentokrát bez háčků a čárek. Pro sestavení vlastních seznamů slov můžete použít nástroj Wordsmith a můžete čerpat třeba ze seznamu českých slov.

Kombinatorický útok (jmena.txt + prijmeni.txt)

#28 Pro generování “kvalitních” kandidátů se používá tzv. kombinatorický útok (“combinator attack”). Ten pracuje tak, že kombinuje slova ze dvou seznamů, takže můžete generovat kandidáty např. ve tvaru jmenoprijmeni, což mohou být někdy docela dlouhá hesla. Seznam jmen a příjmení užívaných v ČR najdete na stránkách Ministerstva vnitra ČR. Můžete samozřejmě kombinovat i jiné seznamy a pokud byste chtěli kombinovat tři dohromady, tak hashcat na to má prográmek.

PRINCE (PRobability INfinite Chained Elements)

#29 Algoritmus (a generátor) PRINCE je jakousi nadstavbou kombinatorického útoku. Generuje kandidáty z jednoho seznamu, ale ta slova kombinuje. Takže když chcete vygenerovat kandidáta dlouhého 4 znaky, tak PRINCE zkusí nejdřív slovo dlouhé 4 znaky (tady), pak dvě slova dlouhá 2 znaky (ja + ty), pak slovo o jednom znaku a tříznakové slovo (a + hle) a obráceně (you + i), pak slovo o 2 znacích a dvě jednoznaková (we + u + i) a tak dále. Mimochodem, tímto útokem se podařilo cracknout heslo kobylamamalybok.

Pravidla pro přidání více kandidátů

#30 Všechny tyto útoky se navíc dají upravit a rozšířit pomocí pravidel, která například nahrazují písmena za čísla (a4, e3, o0 a další, takže se zkusí kandidat i k4nd1d4t) nebo zdvojují a obrací slova, přidávají do vygenerovaných hesel na různá místa čísla nebo speciální znaky, mění některá písmena za velká apod.

Heslo fm9fytmf7qkckct

#31 V souboru na Ulož.to nebylo ani jedno heslo generované password managerem (ani to moje). Jak to vím? Předpokládejme, že ta hesla, která jsem cracknul opravdu správcem vytvořená nebyla (password manager by vytvořil silné heslo, které by za 12 hodin cracknout nešlo) a ten zbytek jsem ručně prošel. Některá hesla vypadala jako generovaná, například toto: fm9fytmf7qkckct.

Vyhledávání fm9fytmf7qkckct

#32 Jenže ho evidentně zná Google, takže bylo v jednom nebo dokonce více seznamech hesel, které jsem pro lámání používal. Heslo fm9fytmf7qkckct je začátek nějakého licenčního čísla na Microsoft Office XP. Když budete používat správce hesel, tak vaše heslo nepůjde v rozumném čase nijak cracknout.

Necracknutá hesla

#33 Nestihl jsem cracknout třeba tato hesla, nicméně všechna jsou také nějak předvídatelná:

  • passwordusuniversalis – dvě slova rozšířená o -us a -is
  • 3681913234731michal – číslo (ve skutečnosti CD key ke hře) + jméno (ne, to není to moje heslo)
  • j4 n3v1m v073 – já nevím, vole, takhle předvídatelně nahrazovat znaky…
  • ●●●●●●●●●●● – moc nechápu, jak se to tam dostalo, nicméně o tři znaky delší varianta ●●●●●●●●●●●●●● se cracknout podařila

… některá další jsou opět v článku na Lupě.

ABC: Always Be Cracking

#34 Zaujalo vás crackování hesel? Pořiďte si knížku Hash Crack: Password Cracking Manual, podívejte se na přednášku Password Cracking 201: Beyond the Basics a další videa z konferencí Passwords a BSides Las Vegas.

Jako uživatelé byste měli používat nějakého správce hesel. A pokud provozujete aplikaci, která ukládá hesla uživatelů, tak je ukládejte správně (pomocí algoritmů bcrypt, Argon2i, scrypt, v PHP pomocí funkce password_hash(..., PASSWORD_DEFAULT)), způsob ukládání pak zveřejněte, ať vás můžu přidat do svého projektu, který sleduje zveřejněné způsoby ukládání hesel. A nezapomeňte přehashovat i stará, existující hesla. A také vás rád uvítám na některém svém školení bezpečnosti.

Video recording

https://www.youtube.com/watch?v=oYNnvTXwlAw

Česky