AUTOR
Radek Smejkal
29
.
10
2018
|

Statistika hesel, vytváření slovníků, optimalizace lámání hesel

Hesla.
Všichni je používáme, ověřují naši identitu, ale můžeme jim skutečně věřit?

Každou chvíli se dozvídáme o nějakém úniku dat, nejčastěji hesel a emailových adres. Jen od ledna minulého roku si server Have I Been Pwned přidal do sbírky 1 750 802 970 různých záznamů. Zde se nejedná pouze o hesla, ale také o další údaje jako jsou jména, emailové adresy, data narození, telefonní čísla nebo dokonce čísla kreditních karet. Neunikly i Vaše údaje? Máte skutečně bezpečná hesla?

Cílem tohoto článku rozhodně není vzbudit dojem, že žádné heslo není bezpečné a veškerá zabezpečení jsou snadno prolomitelná. Cílem článku je přiblížit koncovým uživatelům, jak prolamování hesel probíhá v praxi a co udělat pro to, aby útočník heslo neprolomil, nebo ho prolamoval co nejdéle.

Have I Been Pwned

Have I Been Pwned je web, který obsahuje velkou sbírku emailových adres a hashů hesel a každý si může vyzkoušet, jestli jeho údaje náhodou neunikly v některém z evidovaných datových úniků.

   

Have I Been Pwned nasbíral velmi mnoho uniklých záznamů, k dnešnímu dni dokonce mnohem více, než je lidí na Internetu. Přesto ani zdaleka nemůže obsahovat všechny úniky, ke kterým kdy došlo. A přirozeně nemůže poskytnout žádnou záruku, že Vaše údaje neunikly.

Ukládání hesel na serveru

Než si ukážeme, jak se prolamují hesla, musíme si říct něco o jejich ukládání. Služby neukládají hesla v čitelné podobě, jak je uživatel zadá (aspoň by neměly). Místo toho používají speciální jednosměrné funkce (tzv. hashovací) a ukládají pouze jejich výstupy (hashe). To vše právě pro ochranu dat v případě zcizení. Pokud se uživatel chce ke službě přihlásit, zadá heslo a aplikace na něj aplikuje hashovací funkci, jejíž výsledek porovná s údajem uloženým v databázi. Jestliže se rovnají, je uživatel přihlášen, příp. mu je umožněn další krok při použití vícefaktorové autentizace.

Hashovací funkce mají spoustu využití. Pro ukládání hesel se používají tzv. „kryptograficky bezpečné hashovací funkce”, které mají z pohledu bezpečnosti lepší vlastnosti. Např. jsou mnohem pomalejší, čímž se při útoku snižuje rychlost generování hashů. Pro ztížení lámání hesel se navíc používají tzv. soli - několik náhodných bitů, které se přidají k heslu. Tím se předchází předpočítaným hash tabulkám, protože ze stejného hesla může vzniknout mnoho různých hashů (právě díky náhodné soli).

V následující ukázce můžeme vidět, jak se změní hash při změně jednoho znaku.

   

Způsob přihlášení potom probíhá tak, že jakmile uživatel zadá údaje, služba přidá stejnou sůl, kterou si pamatuje z vytvoření hesla, použije stejnou hashovací funkci a porovná výsledek s uloženým záznamem v databázi.

Útoky na hesla

Typů útoků vedoucích k zcizení hesel je nepočítaně. Spousta z nich vyžaduje větší či menší interakci od uživatele (phishing, malware, …). My se zaměříme na ty, které jsou proveditelné bez uživatelů. Tyto útoky můžeme rozdělit na dvě hlavní kategorie.

Online

Útok probíhá přímo proti službě. Z pohledu služby vypadá, jako když se uživatel snaží přihlásit mnohokrát za sebou v krátkém čase. Nevýhody jsou zřejmé. I když útok provádí stroj, je značně pomalý a snadno detekovatelný. Pokud služba detekuje příliš mnoho pokusů o přihlášení, může zvyšovat časové prodlevy mezi dalšími pokusy o přihlášení, čímž výrazně sníží rychlost zkoušení hesel, nebo dokonce účet zablokovat, což se nedoporučuje z důvodu snadného zneužití.

Offline

Tento způsob útoku probíhá na stroji útočníka nebo na strojích pod jeho kontrolou a útočí na zahashovaná hesla, která unikla ze serveru služby. Kvůli jednosměrnosti hashovací funkce lze získat původní vstup jen postupným hashováním různých vstupů a porovnávání shody. Pokud se při ukládání hesla nepoužije sůl, útočník může použít již dříve zmíněné předpočítané hashe - tzv. “rainbow tables”. Tyto tabulky obsahují nepředstavitelné množství předpočítaných záznamů (řádově až 10.000.000.000.000.000 i více) a obsahují až TB dat. Ovšem s dostatečně dlouhou solí je nereálné takovou tabulku uložit. Výhodou offline útoků je obrovská rychlost zkoušení hesel, ale data musí nejprve uniknout (což je velmi běžné).

Potřebný HW

Hashovací funkce nepotřebují složité a komplexní instrukce, jaké nabízejí dnešní CPU. Místo toho používají řadu jednoduchých matematických operací. Dnešní procesory obsahují pouze několik jader, zato dokáží provádět širokou škálu instrukcí vč. operací s virtuální pamětí. Hashe samozřejmě počítat umějí, nicméně nejsou optimalizované pro takové operace.

GPU sice nepodporují mnoho operací, jsou ale optimalizované na výpočetní operace a obsahují až tisíce jader. Právě díky mnohonásobně většímu počtu jader a paralelnímu zpracování mohou počítat obrazové body mnohem rychleji než CPU, ale nejsou tak flexibilní. Počítání hashovací funkce se velmi podobá počítání obrazových bodů.

Proto se pro lámání hesel využívají právě grafické karty resp. série grafických karet či pronajatý výkon z cloudu. Eventuálně lze využít i specializované jednoúčelové obvody, ale jejich cena je většinou vyšší než u grafických karet.

   

Běžná hesla

Úniky hesel jsou také zajímavý materiál pro datové analytiky. Pokud vidíte svoje heslo mezi těmito, je váš účet nejspíše kompromitovaný.

   

Taková hesla byla v oblibě před několika lety, díky své jednoduchosti na psaní i zapamatování. Nutno podotknout, že se tato hesla stále drží v čele kvůli vysoké četnosti použití v minulosti. Ale i dnes se najde spousta lidí, kteří je stále používají.

Co děláme špatně?

Asi každý se někdy při zakládání účtu potýkal s nároky služby na složitost hesla. Každý musel vymyslet alespoň 8 znaků dlouhé heslo, obvykle včetně alespoň jednoho velkého písmena nebo číslice.

   

Není tedy náhoda, že statisticky nejčastější délka hesel je právě 8 znaků. Velké písmeno bude téměř vždy na začátku, protože se to dobře pamatuje. A ještě číslice, které bývají zase na konci a s trochu štěstí to nebude rok narození nebo přibývající číslo po vynucených změnách hesla. Někdo přidá i speciální znak - většinou ‘!’, buď na začátek nebo na konec.

Doporučení měla vést k zvýšení počtu možných znaků, které musí útočník vyzkoušet. To je rozhodně správně, ale nároky na tvoření hesel byly pro lidi často příliš komplikované a došlo k nepochopení principu těchto požadavků. Při představě, že si každý musí pamatovat několik různých hesel, se není čemu divit. Začali jsme situaci zjednodušovat a hesla tvořit podle lehce předvídatelných šablon. I ta se ale pamatují špatně a akorát to vedlo k tomu, že útočník nemusí vyzkoušet všechny možnosti, stačí mu použít slova ze slovníku, která obměňuje podle předvídatelných šablon a doslova heslo uhádne.

Lámání hesel - Hashcat

Pojďme si ukázat jak takové lámání hashů probíhá.

Bruteforce

Začneme s naivním způsobem - bruteforce. Budeme postupně zkoušet všechny kombinace znaků, dokud heslo nenajdeme.

Mějme několik hesel hashovaných s použitím funkce sha1. V oblasti bezpečnosti je již považována za nedostatečnou, nicméně stále se často používá.

123456                    7c4a8d09ca3762af61e59520943dc26494f8941b
qwerty                      b1b3773a05c0ed0176787a4f1574ff0075f7521e
111111                      3d4f2bf07dc1be38b20cd6e46949a1071f9d0e3d
123123                     601f1889667efaebb33b8c12572835da3f027f78
123456789               f7c3bc1d808e04732adf679965ccc34ca7ae3441
password1               e38ad214943daad1d64c102faec29de4afe9da3d
qwertyuiop               b0399d2029f64d445bd131ffaa399a42d2f8e7dc
1q2w3e4r5t              b80a9aed8af17118e51d4d0c2d7872ae26e2109e
Superm@n123        16c3f801fc68e01a5f2e3bf19a9f19fdf4214abf

Použijeme nástroj hashcat.

hashcat -m 100 -a 3 ./hashed_passwords --potfile-disable --force

-m 100                   … druh hashovací funkce
-a 3                        … bruteforce útok
--potfile-disable      … přeskočí dříve prolomená hesla
--force                    … potřeba pokud nemáme grafickou kartu (karty)

Po chvíli se nám podařilo prolomit tato hesla:

7c4a8d09ca3762af61e59520943dc26494f8941b:123456
601f1889667efaebb33b8c12572835da3f027f78:123123
3d4f2bf07dc1be38b20cd6e46949a1071f9d0e3d:111111
b1b3773a05c0ed0176787a4f1574ff0075f7521e:qwerty

Všechna z nich mají 6 znaků. Když hashcat necháme běžet dál, určitě prolomíme i další, jen to bude trvat hodně dlouho. V následující tabulce najdeme odhady rychlosti prolamování pomocí bruteforce. (Skutečná rychlost závisí nejen na rychlosti stroje, ale také na použité hashovací funkci).

   

Vidíme, že prolomit krátká hesla pomocí bruteforce je poměrně snadné a rychlé. Problémem jsou delší hesla (více než 8 znaků). Délka hesla se pohybuje v průměru okolo osmi znaků, což je velmi málo. Na hesla s 12-ti znaky a více bruteforce nedostačuje.

Slovníkový útok s pravidly

Útočník by použil nejspíše slovníkový útok s pravidly nebo jeho obměnu. A dopadl by nějak takto:

hashcat -m 100 ./hashed_passwords ./slovnik -r ./pravidla_fast --potfile-disable

Vzhledem k tomu, že se jednalo o velmi jednoduchá a častá hesla, slovník nejspíše obsahoval alespoň základy těchto slov. Proto hashcat prolomil všechna hesla prakticky okamžitě.

3d4f2bf07dc1be38b20cd6e46949a1071f9d0e3d:111111
601f1889667efaebb33b8c12572835da3f027f78:123123
7c4a8d09ca3762af61e59520943dc26494f8941b:123456
f7c3bc1d808e04732adf679965ccc34ca7ae3441:123456789
b80a9aed8af17118e51d4d0c2d7872ae26e2109e:1q2w3e4r5t
e38ad214943daad1d64c102faec29de4afe9da3d:password1
b0399d2029f64d445bd131ffaa399a42d2f8e7dc:qwertyuiop
b1b3773a05c0ed0176787a4f1574ff0075f7521e:qwerty  
16c3f801fc68e01a5f2e3bf19a9f19fdf4214abf:Superm@n123

Podívejme se jak tento útok vlastně funguje. Jako příklad mějme malý slovník o třech slovech:

123456
qwerty
password

a typické špatné heslo - qwerty123. Heslo má dostatek znaků, aby bruteforce útok trval dlouho a byl neefektivní. Sha1 hash qwerty123 je:

5cec175b165e3d5e62c9e13ce848ef6feac81bff

Kdybychom pustili pouze slovníkový útok bez pravidel, hash neprolomíme, protože heslo není ve slovníku. My tentokrát použijeme slovníkový útok s pravidly. Pravidla se budou aplikovat na všechna slova ve slovníku a budou generovat podobná slova těm ve slovníku.

Náš počáteční soubor s pravidly vypadá takto:

:                 … původní slovo ze slovníku
$1 $2 $3    … přidání 123 za slovo

Spustíme hashcat:

hashcat -m 100 ./hashed_passwords ./slovnik -r ./pravidla --potfile-disable --force

-m 100                              … druh hashovací funkce
./hashed_passwords        … cesta k souboru se zahashovanymi hesly
./slovnik                            … cesta ke slovníku
-r ./pravidla                       … cesta k souboru s pravidly
--potfile-disable                 … přeskočí dříve prolomené hesla
--force                               … potřeba, pokud nemáme grafickou kartu (karty)

Vidíme, že hashcat zkusil 6 slov (3 ze slovníku x 2 pravidla) a heslo prolomil okamžitě:

5cec175b165e3d5e62c9e13ce848ef6feac81bff:qwerty123

Kombinace pravidel

Zkusme složitější, ale stále špatná hesla:

ytrewq                   22837024f941f67c2ff80c49e6bccf110c062149
qwertyqwerty        cf7c906bfbb48e72288fc016bac0e6ed58b0dc2a
PASSWORD         112bb791304791ddcf692e29fd5cf149b35fea37
Password666!       32f7541f4a93d94bbfbfee0a5d23d8739871d6a3
P@ssw0rd            21bd12dc183f740ee76f27b78eb39c8ad972a757

pravidla jen lehce obměníme:

:
$1 $2 $3
$6 $6 $6
$!
T0        … otočí velikost prvního písmena
r           … otočí slovo
u           … všechna písmena velká
d           … zduplikuje slovo

Když spustíme hashcat znovu, prolomíme jen 3 z nich.

hashcat -m 100 ./hashed_passwords ./slovnik -r pravidla --potfile-disable --force

22837024f941f67c2ff80c49e6bccf110c062149:ytrewq  
cf7c906bfbb48e72288fc016bac0e6ed58b0dc2a:qwertyqwerty
112bb791304791ddcf692e29fd5cf149b35fea37:PASSWORD

Proč jsme neprolomili heslo “Password666!” když jsme přidali pravidlo pro přidání “666”, “!” i velké první písmeno? Pomůže nám přepínač --stdout, který jen vypíše slova, která by hashcat zkoušel.

123456                       qwerty                       password
123456123                 qwerty123                 password123
123456!                      qwerty!                      password!
123456666                 qwerty666                 password666
123456                       Qwerty                      Password
654321                       ytrewq                       drowssap
123456                       QWERTY                  PASSWORD
123456123456           qwertyqwerty            passwordpassword

Heslo “Password666!” v nich skutečně není, protože hashcat nezkouší kombinace pravidel. Abychom měli i kombinace pravidel, musíme pravidla zřetězit za sebe tj. “T0 $6 $6 $6 $!”. Pro zjednodušení stačí pravidla rozdělit do více souborů (např. podle podobného charakteru) a hashcat udělá kombinace za nás.

Jak jsme si ukázali, přestože jsme zvolili heslo, které splňuje všechny doporučované požadavky,

  • 12 znaků dlouhé
  • velké písmeno
  • malé písmeno
  • číslice
  • speciální znak

dokázali jsme ho prolomit okamžitě i na domácím počítači. Stejně by dopadl i známý “leetspeak” (náhrada písmen za číslice) s pravidlem pro substituce znaků: “T0 so0 sa@”.

Hashcat pravidel je mnohem více než jsme si ukázali. Další jsou např: předpony, změny velikostí písmen, posuny abecedy, rotace slova, vypouštění znaků, atd. Pravidly lze popsat pravděpodobně jakoukoliv modifikaci, která Vás napadne. Všechna pravidla najdete na pravidla pro hashcat. Stejná pravidla používá i podobný nástroj John The Ripper

Rychlost generování hashů velmi záleží na použité hashovací funkci. U funkce sha1 na výkonných strojích nejsou desítky miliard hashů za vteřinu problém. V praxi se používají mnohem větší slovníky než jsme si ukázali (řádově miliony až miliardy slov) a také větší sady pravidel (až statisíce pravidel), která vznikají podle již prolomených hesel. Hesla také unikají po větších počtech než naše modelová situace. Cílem útočníků není prolomit všechna hesla za každou cenu, ale prolomit co nejvíce hesel s rozumnými náklady (v rozumném čase).

Nová doporučení NIST

Problém předchozího standardu byl, že vznikaly špatně zapamatovatelná hesla, která se strojově snadno hádají. Nová doporučení NIST se snaží více podpořit uživatele. NIST upouští od používání komplexních hesel, která se nedají zapamatovat. Místo toho se upřednostňuje tzv. passphrase - heslovitá fráze o několika náhodně zvolených slovech

   

Passphrase se ukázaly být mnohem snazší na zapamatování a přitom těžké na uhádnutí. Útočník sice nemusí zkoušet všechny možné kombinace znaků, dokonce mu stačí jen kombinace slov ze známých slovníků, ale i tak musí zkusit větší počet kombinací než u současných hesel.

   

Z tabulky vidíme, že počty kombinací nejsou malé ani u běžných hesel s dostatečnou délkou. Útočník ale nezkouší všechny možné kombinace, zkouší hesla podle šablon, což útok značně zrychluje. Cíl passphrase je lepší zapamatování pro uživatele, ale hlavně znemožnění předvídání struktury hesla díky náhodné volbě slov.

Obecná doporučení a password manager

Abychom co nejvíce omezily riziko těchto “hádacích” útoků, naše heslo by nemělo mít předvídatelnou strukturu. Spasí nás taková hesla: “eE3p^3xefj_h-RnD!JzrRafxAB=@=8” ? Sice nejsou snadná na uhodnutí, ale mají velkou nevýhodu: Nedají se zapamatovat.

Většina lidí si nepamatuje ani svoje slabá hesla, natož jen část takto komplexního hesla. Potom to dopadá tak, že si hesla píšeme na lístečky, monitory, dáváme do peněženky nebo si nastavujeme jednoduché kontrolní otázky, které útočník dohledá a do účtu se dostane i bez hesla.

Riziko je také použití stejného hesla vícekrát nebo sdílení hesla s někým dalším. Pokud použijeme např. heslo k emailu i pro nějakou hru a heslo ze hry unikne, útočník získá také přístup k emailu. Protože většina služeb má obnovení hesla přes email, útočník získá přístup také k těmto službám.

Způsob, jak si zjednodušit život s hesly, je password manager. Jednoduše hesla svěříme programu, který je zašifruje hlavním heslem a uloží. Hlavní heslo by mělo být opravdu bezpečné, aby se v případě zcizení zašifrovaného souboru nedala hesla použít bez znalosti hlavního hesla. Také by mělo být dobře zapamatovatelné, protože toto hlavní heslo nejde obnovit a když ho zapomeneme, ztratíme všechna uložená hesla. Naopak hlavního heslo si neškodí napsat na lísteček, který dáme na bezpečné místo (ne do peněženky nebo na monitor!). Bezpečným místem se myslí takové, kam máme přístup jen my a když heslo zapomeneme, máme zálohu a neztratíme všechna hesla. Pro paranoidní lidi může být takovým ideálním místem bezpečnostní schránka v bance. Neškodí si také vytvořit zálohu zašifrovaných hesel na flashku nebo externí disk pro případ ztráty, krádeže nebo poruchy.

Vícefaktorová autentizace

V poslední době je čím dál populárnější zvyšování bezpečnosti pomocí dalších faktorů autentizace (sms kódy, hw klíče, otisky prstů, …). Mnoho služeb nabízí ověření pomocí sms nebo hw klíčů jako jsou Yubikey od firmy Yubico nebo Titan od firmy Google.

Co vlastně znamenají faktory autentizace?

  • Co znám    (hesla, piny, gesta,...)
  • Co mám    (HW klíče, jednorázové kódy sms)
  • Co jsem    (biometrické údaje)

Mnozí uživatele vnímají další faktory ověření jako zbytečné otravování. Bez telefonu se už nikam nepřihlásí, ztráta telefonu se tedy stala noční můrou. Ale pro útočníka další faktory nepopiratelně znamenají větší složitost pro úspěšnou kompromitaci účtu. Protože jak jsme si ukázali, uhodnutí pouze hesla není takový problém.

Nicméně spousta expertů přestává považovat sms kódy za dostatečný faktor, protože nesplňují požadavky na druhý faktor - “Co mám”. I když to na první pohled nevypadá, sms kód není spjatý s unikátním zařízením, jak požaduje druhý faktor. Svoji roli hraje operátor jako třetí strana. V případě odposlechu telefonní sítě nebo kompromitace operátora mohou být odcizeny i sms kódy. Navíc telefon může být také napadený a pak mohou být sms kódy taktéž kompromitovány.

V tomto ohledu jsou hw klíče bezpečnější. Nespoléhají na službu třetí strany, obsahují mnohem delší kód a jsou odolné proti phishingu. Dají se použít nejen pro přihlášení do emailu a dalších služeb, ale také pro přístup k password managerům jako je např. KeePass.

Použití hw klíče s password managerem nás může hesel v podstatě úplně zbavit. Sice je budeme stále používat, ale nemusíme si je pamatovat a dokonce je nikdy nemusíme ani vidět. Ale musíme si uvědomit, že ztráta/odcizení hw klíče (tak jako zapomenutí hlavního hesla) u password manageru pro nás znamená ztrátu všech hesel. Velkým rizikem je také otevření resp. napsání hlavního hesla v kompromitovaném počítači. Útočník tak může získat přístup ke všem uloženým heslům. Proto je nutné dbát také na další oblasti IT bezpečnosti jako např. aktuální systémy, antivir atd.

Závěr

Nyní se některým z Vás může zdát, že žádný z Vašich účtů není v bezpečí. Nechám každému na zvážení jaké používá zabezpečení. 

Příčinou úspěšných útoků je většinou podcenění bezpečnosti. Spousta lidí zvolí slabé heslo a spoléhá se na sms kód. To určitě není cílem moderní bezpečnosti. Zvolit silné a dostatečně dlouhé heslo je základ. Netvrdím, že každý musí mít 40 znaků dlouhé heslo a nutně používat hw klíč ke každé službě. Ale také není dobré bezpečnost podcenit. Vždy je potřeba zvážit, jak důležitá služba je a jaký dopad může mít její kompromitace.

Použití password managera považuji za klíčové. Nejen z hlediska bezpečnosti, ale také pro zjednodušení pamatování hesel. Použití druhého faktoru je doporučované (ať už sms nebo lépe hw klíč), nicméně u méně důležitých služeb není nezbytné. Použití silného hesla i dalšího faktoru, zajistí celkem solidní zabezpečení proti prolomení hesla.

Na závěr bych chtěl upozornit, že útočník nemusí použít jen útoky na prolomení hashe hesla, ale existují také další typy útoků. Proto je důležité sledovat podezřelé aktivity, používat aktuální verze systémů a v případě podezření na zcizení účtu vhodně a rychle reagovat.

 

Chcete ověřit jak bezpečně pracuje s hesly vaše aplikace? Ideální je k tomu penetrační test, který pomůže odhalit i další nedostatky v zabezpečení aplikace či firemní sítě.

Přečti si taky