Asi není žádnou novinkou, že ukládat hesla do prohlížečů není úplně dobrý nápad, ale stále to lidé běžně dělají. Ať už proto, že neznají jinou variantu pro jejich ukládání nebo například netuší, jako moc snadné je hesla získat a to i vzdáleně. Cílem tohoto článku bude právě poukázat na to, jak lehce lze vykrást hesla z prohlížečů, jak to technicky na pozadí funguje a v poslední řadě několik tipů, jak je ukládat daleko bezpečněji.
Internet Explorer/Microsoft Edge
Pokud přistoupíme na webovou stránku, kde je nutné se přihlásit a zadáme naše uživatelské jméno a heslo, prohlížeč nám velice ochotně nabídne možnost heslo si uložit. Velice pohodlné, to ano. Navíc vše se ještě tváří tak, že přihlašovací údaje jsou uloženy zcela bezpečně a není se čeho obávat. Když si totiž otevřu nastavení v Edge a kliknu na spravovat hesla, vidím jen přihlašovací jméno a tečky namísto hesla. To stejné v případě, že si v ovládacím panelu otevřu Credential Manager a kouknu na Web Credentials, kde sice mám možnost heslo zobrazit, ale to vyžaduje zadání hesla k mému Windows účtu.

Problém ale nastává ve chvíli, kdy využiji nějaký nástroj, který mi je hesla schopný vykrást. Jedním z nich je například VaultPasswordView od Nirsoft. Po spuštění se zobrazí všechny webové stránky, kam si uživatel přihlašovací údaje uložil a to včetně uživatelského jména i hesla.

Toto je schopný udělat každý (i bez znalosti hesla Windows účtu), kdo se dostane k počítači fyzicky nebo vzdáleně po síti a spustí program s administrátorskými právy. Ano, musí být admin, ale to je naprostá většina uživatelských účtů, pod kterými uživatelé jsou do Windows přihlášeni a to i často ve firemních prostředích. Pokud jsem u počítače fyzicky a není zašifrovaný disk, administrátorský účet si vyrobím snadno 🙂
Technical background
Windows ukládá hesla do Windows Vault, který přišel s Windows 7. Vault je uložený v cestě %localappdata%\Microsoft\Vault\<GUID> a je složen ze tří souborů. Policy.vpol, <GUID>.vsch (schema), <GUID>.vcrd (zašifrovaná hesla).

Ve schématu například vidíme, že poukazuje na Windows Web Password Credential a také jsou v něm uvedeny popisy k jednotlivým polím.

<GUID>.vcrd je však šifrovaný a hesla v něm nejsou uložena v plain textu. Můžeme je rozšifrovat pomocí klíčů z policy.vpol, které ale šifruje Master key daného uživatele. Ten najdeme v %APPDATA%\Microsoft\Protect\%SID%. Nejdříve musíme zjistit, jaký je SID uživatele, abychom použili ten správný Master key. S tím nám pomůže příkaz whoami /all

Ve složce Protect je tedy zjevné, kde přesně je Master Key pro našeho uživatele uložen.

Smůla je, že i Master Key je šifrovaný pomocí AES algoritmu a to heslem uživatele, přesněji tedy jeho SHA-1 hashem (v případě doménového uživatele MD4 hashem). Hash můžeme obstarat z LSASS procesu.

Pokud tedy nyní rozšifrujeme Master Key uživatelovým SHA-1 hashem a poté pomocí Master Key rozšifrujeme Vault, dopracujeme se ke stejnému výsledku, jako udělal VaultPasswordView. To si nakonec můžeme i pomocí něj ověřit, jelikož když ho spustíme, zadáme mu cesty k Vault, Protect a do pole hesla vložíme SHA-1 hash, zobrazí se nám rozšifrované Web Credentials.


Pokud jsme tedy schopni vzdáleně na počítači dumpnout uživatelův SHA-1 hash (nebo jen uložit LSASS dump do souboru), můžeme jednoduše odkopírovat tyto soubory a hesla si dešifrovat u sebe.
PS: Technicky je to ještě trošku komplikovanější a při tvorbě Master Key se používá ještě SID uživatele a random data, vytváří se credhist, můžeme v případě domény využít privátní certifikát z DC pro dekrypci…, ale o tom zase někdy příště, šlo mi primárně o to ukázat princip.
Google Chrome

Databázi s uloženými hesly najdeme v %localappdata%\google\chrome\user data\default\Login Data, kde jsme schopni zjistit server, uživatelské jméno, ale heslo je zašifrované pomocí Windows funkce CryptProtectData.

Jako Master Key se používá heslo Windows účtu uživatele. Opět existuje program od Nirsoft a to ChromePass. Ten pomocí CryptUnprotectData funkce rozšifruje databázi s hesly a vypíše nám ji.

Mozilla Firefox
Nakonec nám zbývá Mozilla Firefox. I v nejnovější verzi 65.0.2 (v době testování) si stále ve výchozím stavu dokážu zobrazit uložené heslo přímo v prohlížeči, aniž bych pro to musel cokoliv udělat.

Hesla je možné chránit použítím master heslem. Databáze je uložena v cestě %AppData%\Mozilla\Firefox\Profiles\<randomstring>.default\logins.json

V tomto případě by šel například použít nějaky keylogger na odchycení master hesla nebo například brute-forcovat, pokud by měl uživatel slabé master heslo.