Aneb, proč je čipová karta lepší než přihlašování heslem. A proč je přihlašování otiskem prstu špatné - protože to je ve skutečnosti přihlašování heslem.
Na dnešní večer, místo abyste šli do hospody, můžete využít čtení následujícího článečku. Nebo si to teda můžete přečíst i v hospodě, až ti vožralci naproti vám začnou s postupující hladinou blábolit nesmysly :-) Tedy samozřejmě, pokud na to ještě budete sami vidět :-)
Vykrádání hash aneb pass-the-hash
Potřebujete znát hesla uživatele k tomu, abyste se pomocí něho ověřili vůči nějakému síťovému prostředku? Ne. Na síťové prostředky, jako jsou souborové servery, SQL, LDAP, Exchange, SharePoint apod., se ověřujete pomocí Windows authentication, tedy buď Kerberos, nebo NTLM.
Tyto dva protokoly používají vaše heslo nepřímo - udělají si z něho nejprve MD4 hash a tu teprve použijí pro šifrování dalších komunikací. Když se přihlašujete do Windows, zadáváte heslo. Z něho si bezpečnostní balíčky (security package) Kerberos a MSV1_0 (to je jméno balíčku pro NTLM) rovnou vyrobí MD4 hash a jen tu si uchovávají v paměti po dobu vašeho přihlášení (logon session).
Takže se heslo vlastně nemusí ve Windows v jeho plné verzi (plain-text) pamatovat, tedy ne kvůli Kerberos ani NTLM. Co se pamatuje je MD4 hash.
Když ji ty dva protokoly přímo používají, tak proč bych vůbec potřeboval heslo. Stačí mít tu MD4 hash. Sice se s tím nepřihlásíte interaktivně, ani na jiný protokol než je Kerberos nebo NTLM (pozor VPNkové ověřování MS-CHAP a MS-CHAPv2 je v podstatě to stejné jako NTLM a taky používá tuto MD4 hash), ale pro velikou většinu intranetových komunikací to úplně stačí.
Nešlo by to z paměti dostat? Zláci to klidně zvládnou s WCE - Windows Credentials Editor. Na tom nástroji je tragické, že to lze jen stáhnout a ani se nemusí nic instalovat. Další důvod proč digitálně podepisovat exáče a používat Software Restriction Policy.
Stačí být členem lokálních Administrators a prográmek vám vykrade MD4 hash z paměti. Nejen vám. Všem uživatelům, kteří na daném počítači zrovna mají rozjeté logon session. A samozřejmě MD4 hash umí znovu nainstalovat do vaší paměti, aby se dala použít pro přístup do sítě.
To je útok tak zvanně pass-the-hash. Prostě použijete rovnou hash a pošlete ji do sítě k ověření.
Jak se tomu bránit?
Nelze to úplně, ale můžeme to vylepšit. Potřebujete dvě věci - zakázat NTLM, aby nešla používat ona MD4 hash přímo k ověřování. A za druhé používat k přihlašování čipové karty - tedy Kerberos PKINIT. A možná ještě zkrátit platnost (životnost - lifetime) TGT tiketů. Proč?
Když se přihlašujete čipovou kartou (smart card), nezadáváte heslo, ale vygeneruje se vám přímo TGT Kerberos ticket. Tedy pamatuje si ještě i PIN k čipové kartě, ale to je útočníkovi bez karty na nic. Ověřujete se digitálním podpisem prováděným čipovou kartou. Žádná MD4 hash tedy?
No právě že ne. V tom TGT tiketu vám stejně přijde z řadiče domény (domain controller, DC) vaše MD4 hash, aby vám právě fungovalo NTLM. Už jsem se o tom zmiňoval tu. Takže v paměti i tak bude ona MD4 hash hesla. Uživatel to heslo třeba ani nezná, k přihlašování kartou ho přece nepotřebuje. Ale DC ho zná, heslo vždycky existuje, byť je možná náhodné a dlouhé.
Takže je potřeba obecně zakázat NTLM autentizaci a vynutit přihlašování čipovou kartou (smart card is required for interactive logon). V takovém případě bude MD4 hash na nic. NTLM nepojede a TGT si s ní, bez PKINIT kartou, taky nevygenerujete. Bohužel, NTLM lze zakázat až od Windows 7 a Windows 2008 R2. Navíc si to někdy nemůžete dovolit, protože vám možná nefunguje Kerberos.
Náhodné, ale hlavně dlouhé heslo, a hlavně čipová karta, je dobré proti LM hash krekování
Peklóóó. Co se moc neví, je fakt, že WCE umí vybrat z paměti i LM hash hesla. To je tragédie. Vy sice můžete vypnout to prehistorické a pekelně nebezpečné LM ověřování po síti a vůbec LM hash neukládat v DC. Ale pokud se přihlašujete heslem, Windows si ji stejně vygenerují a spolu s MD4 si ji nechají v paměti. Co kdyby to na něco potřebovaly, že?
Přihlašovat se heslem tedy znamená, že lokální admin terminal serveru má k dispozici vlastně skoro zadarmo kompletní plaintext hesla všech uživatelů, kteří se k němu na vzdálenou plochu (remote desktop) přihlásí. Prostě si je vybere z paměti terminal serveru a doma na to pustí crack pomocí rainbow tables. V případě LM hash lze kreknout jakékoliv heslo v řádu minut.
Kecám. Ne jakékoliv. LM hash se generuje jen z hesel, která jsou maximálně čtrnáctiznaková. Pokud máte heslo delší než 14 znaků, LM hash se vám nevygeneruje a tudíž ani nebude v paměti uložena.
A zase čipové karty. Pokud se přihlašujete čipovou kartou (smart card), ano, LM hash by se vám mohla také stáhnout z řadiče. Jenže tam to máte asi vypnuté a vůbec ji neukládáte, takže není co stahovat. Za druhé, pokud se hlásíte čipovou kartou, nejspíš máte taky randomizované heslo, které je super bezpečné a LM hash se mu ani nevytváří.
Pass-the-TGT
Ach ouvej. Tak už se přihlašujete pomocí smart card, máte vypnuté LM hash i NTLM. Jediné co vám v paměti zbude použitelného, je TGT. No právě. WCE umí vybrat z paměti i vaše TGT a uložit je do souboru. Opět umí vzít tato TGT ze souboru a naimportovat vám je do nějaké jiné logon session, abyste se mohly použít pro přístup do sítě.
Co teď? Proti tomu je jediná obrana zkrátit trvanlivost (lifetime) pro Kerberos tikety. Na to je Group Policy zásada - Computer Configuration - Policies - Windows Settings - Security Settings - Local Policies - Account Policies - Kerberos. Zbytečně to moc nepřehánějte, ale výchozích deset hodin je zbytečně moc. Kdokoliv má vaše TGT, může ho používat aniž byste o tom věděli, ještě 10 hodin.
Vadí snad, že správce vzdálené plochy bude mít nějakou dobu vaše TGT? Nevadí ve skutečnosti, pokud to nebude zbytečně dlouho. On vám stejně může do profilu podstrčit cokoliv, co si sami nechtěně spustíte. Takže po dobu vašeho přihlášení na terminálovém serveru vás má stejně pod kontrolou. O co jde je nedat mu TGT na o moc delší dobu, aby si s tím nemohl hrát po pracovní době.
Panebože! Pass-the-password
Podívejte se na obrázek. V úvodu jsem říkal, že si dva bezpečnostní balíčky - Kerberos a MSV1_0 (tedy NTLM) - udržují v paměti nějaké přihlašovací údaje - tedy MD4 hash, PIN čipové karty, TGT tiket a případně i LM hash, pokud máte krátké heslo. Když se ale podíváte do seznamu SecurityPackages na obrázku, uvidíte ještě další balíčky.
Na Windows 8 jsou jmenovitě následující security packages - SChannel, PKU2U, LiveSSP, WDigest a TSPKG. Na Windows 7 chybí LiveSSP, na Windows XP chybí i PKU2U a TSPKG, ale TSPKG se tam dá doinstalovat. Co si tihle kámoši pamatují?
Schannel dělá TLS client certificate authentication, tedy certifikátové ověření pro TLS/SSL spojení (obvykle HTTPS). Ten si nic sám nepamatuje. Tedy nic co by nás ohrožovalo. Ok kámoši, ty tady zůstaň.
PKU2U dělá ověřování v peer-to-peer sítích, ověřuje přístupy v HomeGroup - tzn. nezadáváte žádné přihlašovací údaje a přitom se díváte na sdílené soubory ostatních počítačů ve stejné HomeGroup. Samozřejmě to musí být nějak ověřené, takže ona ta HomeGroup nějaké heslo sama má atd. Ale to je pro nás nezajímavé, domácí prostředí je principiálně nebezpečné, takže sere pes. Já se bojím terminal serverů.
LiveSSP umí zřejmě ověřovat vůči Windows Live, neboli .NET Passport, neboli Microsoft Account. Nevím jak to funguje a co to umí, ale to je znovu domácí fíčura. Rozhodně to ale někdy prozkoumám.
No a to nás dostává k WDigest a TSPKG.
WDigest je SSP pro HTTP Digest ověřování do webových serverů. Digest ověřování používá sice MD5, takže by to teoreticky mohlo uchovávat v paměti pouze tuto MD5 hash. Jenže ta heš musí být zasolena loginem a doménou - což jsou věci, které zjistíte až v okamžiku, kdy se připojujete na konkrétní web server. A to znamená, tramtadá, že WDigest SSP ukládá v paměti celé vaše plain-text přihlašovací heslo. Tedy pokud ho použijete, protože jste naopak nepoužili čipovou kartu.
Peklóóóóóóóóó. A to je in XPčkách!
Dalším adeptem na debila roku je TSPKG. Zde se jedná o součástku Remote Desktop Single Sign On (RDP SSO, TS SSO). Pamatuje si buď vaše plain-text heslo, nebo PIN do čipové karty. Pokud potom povolíte a správně nastavíte Credentials Delegation, za spolupráce TSPKG a CredSSP dojde k přeposlání vašeho plain-textového hesla do terminálového serveru (remote desktop session host).
Remote desktop (terminal server) ověřování je totiž z přincipu basic autentication, aby nebyla potřeba Kerberos delegace a fungovalo to jako normální interaktivní přihlašování se vším všudy.
CredSSP není na vině. CredSSP je jenom transportní přenašeč libovolných přihlašovacích údajů, který pomocí standardního TLS spojení šifruje komunikaci mezi klientem a serverem. To právě TSPKG balíček na klientovi mu dává plné heslo uživatele, aby ho přenesl do TSPKG balíčku na RDP serveru. Takže pokud máte TSPKG kvůli SSO, tak ano, tak si po přihlášení pamatujete uživatelovo plné heslo.
A je jedno, jestli máte SSO vůbec nakonfigurováno. Vůbec nemusíte. Stačí, že máte TSPKG. Tenhle balíček si prostě vaše plaintextové heslo pamatuje pro jistotu vždycky.
Dá se zabránit WDigest a TSPKG pamatovat si plain-text hesla?
Podporované to není, ale mohli byste ty dvě hodnoty odstranit z oné Security Packages registrové hodnoty. Nevím jak by to dopadlo.
Jediné podporované řešení jsou čipové karty. Když to heslo do Windows nezadáte, tak si ho prostě nemá ten zlý správce terminal serveru kde vzít! A má po srandě.