Skip Ribbon Commands
Skip to main content

Ondrej Sevecek's Blog

:

Engineering and troubleshooting by Directory Master!
Ondrej Sevecek's Blog > Posts > Vyhledávání AES klíčů v paměti procesů
říjen 13
Vyhledávání AES klíčů v paměti procesů

Kvůli některým svým pokusům, pentestům a zkoumání volatile state jsem si napsal prográmek na vyhledávání AES klíčů v paměti. Vzhledem k tomu, že to je zajímavý koncept a přitom poměrně neznámý, tak jsem si říkal, že udělám kamarádovi radost a napíšu i něco techničtějšího než kalendář :-)

Je to součást mého nástroje BitColdKit, přesněji jeho funkce BitColdKit-FindAesKeys. Funkce hledá AES klíče buď v nějakém souboru na disku (nejspíš asi memory dump provedený procdumpem nebo celý RAM imidž - ten vytvářím třeba pomocí nástroje RamCapturer). Umí ale hledat i přímo v paměti nějakého běžícího procesu, stačí zadat jeho jméno, nebo process Id.

AES klíče jsou bezva :-) Cokoliv je dneska šifrované AESem. BitLocker například. Nebo webové aplikace a služby (web service) velmi rády využívají šifrované cookies, nebo view state. SQL databáze mohou být šifrované. ADFS i microsoft identity manager (FIM/MIM/MIIS/ILM) si šifrují nějaké tajné údaje v databázi. SharePoint má hesla managed accountů i jiné tajné údaje samozřejmě šifrovaná v databázi. Rozličné password managery (keepass) také šifrují svoje databáze hesel pomocí AES a mají tedy tyto šifrovací klíče v paměti po dobu svého běhu.

Jak to funguje

Nemusíte vůbec vědět, kde ty klíče v paměti jsou. AES klíče jsou sice jen 16B (AES 128) až 32B (AES 256) dlouhé. Takže jak je najdete aniž byste věděli, kde by v té paměti přibližně měly být? Mohli byste začít tím, že vyhledáte bloky paměti s vysokou entropií - klíče budou nejspíš hodně náhodné, aby byla šifra kvalitní. Ale tohle není efektivní, jak jsem prověřil. Paměť je plná různých entropických bloků. Tohle není cesta.

Lepší je využít key schedule. Na šifrování se nepoužívá přímo jen AES klíč. Nejprve se AES key rozšíří do tzv. key schedule, což je blok o velikosti 176B pro AES 128, délce 208B pro AES 192 a velikosti 240B pro AES 256. A teprve touto key schedule se projíždí a xorují vstupní data a vzniká výsledný šifrát. Generování key schedule je zbytečně pomalé na to, aby se to dělalo při každém požadavku na šifrování. Takže všechny AES knihovny vždycky při inicializaci klíče vytvoří rovnou key schedule a tu mají dlouhodobě v paměti místo toho klíče. Dělají to tak samozřejmě i netfx třídy RijndaelManaged a AesCryptoServiceProvider.

Není až tak důležité, jak taková AES key schedule vzniká z klíče, ale můžete se podívat na obrázky:


Části klíče se prostě nějak zaxorují do sebe a tak se postupuje až je to komplet tak dlouhé, jak je potřeba. No a máme key schedule.

Co je na tom parádní, že na začátku je přímo ten AES key. A za ním následuje mnoho bajtů, které jsou z něho přímo vypočítány. Takže se to krásně hledá.

Prostě jedete po paměti, u každého bajtu se zastavíte a zkusíte to od jeho pozice vzít jako potenciální AESový klíč. Podle těchto 16B/32B napočítáte, jak by vypadala šedula, kdyby to byl opravdu klíč. A porovnáte to s tím, co je ve stutečnosti v paměti. Pokud to sedí, tak to byl klíč. Pokud to nesedí, tak to klíč nebyl.

Napsal jsem si tedy svoji vlastní implementaci AESu do C# (viz. zdrojáky BitColdKitu) a používám svoji počítačku key schedule.

Jak to vyzkoušet

Pokud to chcete otestovat, prostě si stáhněte BitColdKit. Přímo z paměti procesu můžete klíče hledat buď pokud proces běží pod stejným účtem jako BitColdKit - to ani nemusíte být členem skupiny Administrators. Pokud proces běží pod jiným účtem, budete muset být členem skupiny Administrators, aby mu mohl BitColdKit přečíst paměť. Přesněji řečeno, pro čtení paměti cizích procesů potřebujete právo (user right) Debug programs (SeDebugPrivilege).

Nejjednodušší a nejhezčí je pokus na BitLocker. Jestli máte na počítači BitLockerem zašifrovaný, a aktuálně odemčený, nějaký oddíl, jeho AES klíč je v paměti RAM. Udělejte si memory dump pomocí RamCapturer a ve výsledku najdete AES klíče (neboli FVEK). Trvá to cca 20 minut pro 8 GB RAM memory image pro jednu délku klíče, pokud víte jakou hledáte.

Dá se to zkusit také na lsass, nebo nějaké w3wp procesy IISka. A cokoliv jiného, co šifruje AESem.

Krásně to funguje na keepass. Keepass si šifruje databázi hesel právě AES klíčem odvozeným z vašeho vstupního hesla. Stačí ho tedy spustit, zadat to vstupní heslo (master password) a potom pomocí BitColdKit-FindAesKeys -process keepass klíč vyndat z paměti.

Jen tak bokem, keepass má také v paměti všechna uložená hesla, která jste použili, v čisté formě, takže se také dají získat z memory dumpu. BitColdKit má na to funkci BitColdKit-FindString, která právě hledá v paměti procesů nějaké řetězce v čisté formě.

Comments

Re: Vyhledávání AES klíčů v paměti procesů

Díky za parádní článek na čtvrteční ráno!
pipp on 13.10.2016 8:46

Re: Vyhledávání AES klíčů v paměti procesů

Na tom je zajímavý i fakt, že pro to lze použít vysoko úrovňový nástroj, jako je .NET, který by vlastně měl podobným prasárnám (přístup k paměti cizího procesu apod.) z hlediska svého paradigma zabraňovat. To ani nemluvím o vlastnostech Windows (ochrana procesů apod.), kde by tohle mělo jít jen s debug právy atd.
PS: Zdrojáky jsem ještě neviděl, tohle je pouze teoretická úvaha. Je mi samozřejmě jasné, že to jde.
Kamil on 13.10.2016 17:40

Re: Vyhledávání AES klíčů v paměti procesů

Na tom je zajímavý i fakt, že pro to lze použít vysoko úrovňový nástroj, jako je .NET, který by vlastně měl podobným prasárnám (přístup k paměti cizího procesu apod.) z hlediska svého paradigma zabraňovat. To ani nemluvím o vlastnostech Windows (ochrana procesů apod.), kde by tohle mělo jít jen s debug právy atd.
PS: Zdrojáky jsem ještě neviděl, tohle je pouze teoretická úvaha. Je mi samozřejmě jasné, že to jde.
Kamil on 13.10.2016 17:43

Re: Vyhledávání AES klíčů v paměti procesů

Na tom je zajímavý i fakt, že pro to lze použít vysoko úrovňový nástroj, jako je .NET, který by vlastně měl podobným prasárnám (přístup k paměti cizího procesu apod.) z hlediska svého paradigma zabraňovat. To ani nemluvím o vlastnostech Windows (ochrana procesů apod.), kde by tohle mělo jít jen s debug právy atd.
PS: Zdrojáky jsem ještě neviděl, tohle je pouze teoretická úvaha. Je mi samozřejmě jasné, že to jde.
Kamil on 13.10.2016 17:43

ahoj

Jsem proti Vám téměř laik a nechci zabíhat do podrobností,
zajímala by mne jedna věc.
K memory dumpu, je potřeba mít přístup k počítači.

Znamená to tedy, že pokud dostatečně zabezpečím, aby se mi k pc nikdo nedostal, ať už fyzicky, či elektronickou cestou, nelze tedy ani provádět analýzu paměti ?

Když to tak čtu, taky nejbezpečnější pamětí bude ta moje a to ještě musím spolehat na svoji sklerozu :-)
Martin on 16.10.2016 9:08

Re: Vyhledávání AES klíčů v paměti procesů

ad vysokoúrovňovost netfx a - já na to používám pinvoke, takže to není zase až tak vysokoúrovňové. to se dá na netfx zablokovat. jenom prostě netfx umí volat Win32 API, pokud to není zakázáno politikou. principiální windows bezpečnost je o tom, že oddělení kódu se dělá pomocí uživatelských účtů a jinak to nejde. takže pokud dva programy běží pod stejným účtem, tak budou mít prostě cesty, jak se ovlivňovat. netfx se narozdíl od WinRT (UWA) nikdy netvářil, že pracuje v sandboxu, pokud se to pořádně neomezí explicitně. proto takty má kód vždycky běžet v nějakém svém vlastním servisním účtu, například IIS používá od Windows 2008 R2 by default ApplicationPoolIdentity, což jsou separátní lokální účty, aby se na to nemusely definovat účty doménové.
ondass on 17.10.2016 6:10

Re: Vyhledávání AES klíčů v paměti procesů

ad fyzický přístup - ano přesně tak, pokud k tomu zařízení nikoho nepustíte, tak vám paměťový obraz neudělá. na to, aby někdo mohl provést memorydump, tak by si k tomu musel spustit na vašem počítači nějaký svůj dumpovací proces. ten proces by musel běžet pod členem lokální skupiny Administrators, což je dneska omezeno také pomocí User Account Control (UAC - takové to potvrzování "spusit jako správce"). Takže tohle není určitě útok proti obyčejným uživatelům, kterým by někdo poslal mailem exploitík. Memory dump mohou dělat ručně forensní vyšetřovatelé, pokud se snaží zjistit, co se na počítači dělo/děje, když byl třeba napaden, nebo když na něm pracoval nějaký zločinec. Například takové zločinecké programy si šifrují svoje ukradená data pomocí AES někde na disku, no a když to chcete dešifrovat, tak tomu zločineckému programu třeba uděláte dump paměti a ty klíče si z toho vyndáte.
ondass on 17.10.2016 6:19

Tohle ale může být rychle zrušeno implementací

Opravte můj laický pohlred: řekněme že aplikace, která chce použít AES si vygeneruje  pole náhodných bajtů o velikosti AES key schledule. Poté při zadání klíče AES  vytvoří key schledule tak, že před uložením do paměti každý bajt  key schledule xoruje s korespondujícím bajtem náhodné tabulky .  tím je klíč v paměti nenalezitelný. při vlastním šifrování/dešifrování se přečtou bajty jak z klíče, tak z onoho bloku náhodných bajtů xrornou a potom se teprve použijí k šifrování...
ntpt on 17.10.2016 16:46

Re: Vyhledávání AES klíčů v paměti procesů

to je samozřejmě možnost, nějak proprietárně tu šedulu zamaskovat, ale podle mě k tomu ani není vlastně důvod. Ono to hledání klíčů je možné jenom v případě, že máte k dispozici paměťový obraz buď RAM, nebo paměti procesu. Pokud toto máte, a ty klíče v tom jsou, tak je vždycky nějak najdete, při nejhorším to bude trvat pár týdnů, než disasemblujete ten paměťový obraz a najdete to tam potom přesně, nebo si upravíte svůj algoritmus hledání schedule podle toho disassemblu. Sice by to bylo zdlouhavější, ale vždycky to půjde.

Druhá věc je, jestli se program používající standardní implementaci AESu chce vůbec chránit proti útoku když má někdo jeho paměťový obraz. Mít paměťový obraz znamená buď být členem lokálních Administrators, nebo mít alespoň Debug privilege, nebo váš dumpovací proces musí běžet pod stejným účtem, jako běží ta oběť. A tohle jsou situace, které nelze jen tak zneužít. Proti tomu se musíte chránit správnými postupy.

Já jsem se tady zabýval hlavně tou krásou toho hledání samotného když máte obraz. Tzn. například forenzní vyšetřovatel, který stihnul zachytit počítač v přihlášením stavu. Nebo jiný administrator na stejném počítači.
ondass on 19.10.2016 8:34

Re: Vyhledávání AES klíčů v paměti procesů

Moc pěkný...
Zas ti dám na chvíli pokoj :)
Borek on 23.10.2016 12:35

Add Comment

Sorry comments are disable due to the constant load of spam *


Omlouvám se, ale příval spamu nelze kontrolovat, takže mi prosím pošlete email, pokud máte nějaký dotaz, nebo připomínku.

Title


Pole Title nemusíte vyplňovat, doplní se to samo na stejnou hodnotu jako je nadpis článku.

Author *


Pole Author nesmí být stejné jako pole Title! Mám to tu jako ochranu proti spamu. Roboti to nevyplní dobře :-)

Body *


Email


Emailová adresa, pokud na ni chcete ode mě dostat odpověď. Nikdo jiný než já vaši emailovou adresu neuvidí.

Attachments