Obvykle to ukazuju na svých kurzech v GOPASu (GOC171 - Active Directory Troubleshooting, GOC172 - Kerberos a GOC175 - Windows Security), tak jsem se rozhodl, že to přidám i sem do knihovničky Antihacking. A jak si právě uvědomuju, budu to taky ukazovat na konferenci ShowIT 2014 v Bratislavě už vééélmi brzo - 11-13.února 2014.
Uvědomte si základní vlastnost změny uživatelského hesla. Když si měníte heslo, jeho nová hodnota jde v plné formě na řadič domény (DC - domain controller). Znamená to, že pokud člen skupiny Domain Admins, nebo sám hacknutý DC, chce, tak si ta hesla prostě chytne. Pokud vám tedy něco kompromituje řadiče domény, to že změníte (vyresetujete) nějaká hesla, nemusí vůbec pomoci.
Pokud si uživatel mění na stanici heslo, nebo mu ho resetuje administrátor, musí fungovat toto:
- řadiče domény (DC) je schopen zkontrolovat zásady hesel - tzn. kvalitu hesla, jako je jeho délka, nebo druhy znaků a fakt, jestli to heslo neobsahuje tři a více (sekvenčně) znaků z hesla
- DC musí být schopno uložit si různé verze hash hesla - pro Kerberos DES, Kerberos RC4, NTLM a NTLMv2, nebo třeba MS-CHAP a MS-CHAPv2 musí ukládat MD4 hash, zatímco pro HTTP Digest ukládá MD5 a pro Kerberos AES ukládá SHA1, a pokud byste náhodou měli ještě zapnuto ukládání LM heší, tak ještě tuhle hroznou heš.
- někdy potřebujete nějakou identity integration. Tzn. synchronizaci uživatelů a jejich hesel do úplně cizích systémů jako je Novel, IBM a Sun One, SAP a různé podobné informační systémy, VoIP a VPN getway apod. Tohle umí například Forefront Identity Manager a jeho Password Change Notification Filter.
- a pak samozřejmě jsou hackeři, kteří si od vás chtějí ta hesla vybrat :-)
Aby tohle fungovalo, tak to znamená, že zmeně hesla musí na DC dorazit v plné formě. Klient nemůže vědět, jaké všechny hash má sám vytvořit. Klient taky nemůže konrolovat zásady hesel, protože by se tomu mohl úplně vyhnout, kdyby chtěl.
Neříkám tím, že by komunikace nebyla zašifrovaná - je to buď přes SAM rozhraní (named pipe přes SMB, nebo DCOM náhodný Netlogon port) - tedy zašifrované RPC, nebo přes LDAPS a SASL se 128-bitovým (nebo lepším) symetrickým klíčem.
Takže přenos je bezpečný - je zašifrovaný na kanále ověřeném (authenticated) obvykle pomocí Kerberos. Ale řadič domény to nové heslo dostane v plné formě. Prožene ho přes všechny password filtery a uloží si z něho potřebené heše.
Password filter
To je přesně ono. Active Directory password filter je normální DLL knihovna, která má obvykle za úkol zkontrolovat kvalitu hesla - tedy zásady. Případně by mohla dělat libovolné jiné operace s novým heslem - například ho odeslat do integrovaného systému třetího výrobce. Do své Win32 API funkce PasswordFilter prostě dostane login uživatele a novou hodnotu hesla.
Zdůrazňuji, že dostane jen novou hodnotu hesla, původní heslo nevidí. Původní heslo se použije pouze k autentizaci dopravního kanálu (SAM, LDAP SALS, LDAPS), obvykle pomocí Kerberos.
Password filter DLL knihovnu si může naprogramovat jednoduše každý - například v C, nebo C++. Stačí si najít veřejnou dokumentaci, například tady a tady a tady a tady. Nainstaluje se tak, že se její 32-bitová, respektive 64-bitová verze (podle odpovídající verze OS) nakopíruje do System32 adresáře a zaregistruje se do registrů:
HKLM\System\CurrentControlSet\Control\LSA
NotificationPackages = REG_MULTI_SZ = jmena vsech DLL bez pripony na samostatnych radcich
Někde jsem dokonce viděl NET Framework obalovací password filter, takže nainstalujete jen malinkou proxinku, a skutečnou funkcionalitu si můžete naprogramovat v libovolném C# apod.
Registraci musíte udělat do všech DC, jinak se vám některé změny hesla nebudou registrovat - password filter se volá jen na prvním DC, které přijalo změnu, potom se už distribuují jen hashe přes normální AD replikaci.
Bezpečnostní fakta a zajímavosti
- aby vám to tam nějaký hacker nainstaloval, musel by mít vládu na konkrétním DC, musel by tedy pracovat buď jako člen Domain Admins, Administrators, nebo by musel běžet pod účtem SYSTEM na daném řadiči.
- musí to nahrát do System32, to je taky jeden důvod, proč je žádoucí vypnout administrativní sdílení (administrative share)
- musí to zaregistrovat do registrů, což by se mi líbilo zablokovat službu Remote Registry, ale to nejde, protože DFSR bez ní nefunguje
- RODC nikdy změnu hesla nepříjímá, takže tam to není podstatné
- password filter funguje i pro lokální účty na stanicích a serverech úplně stejně. Takže bacha, pokud vám někdo hackne server, možná si nainstaloval svůj password filter a jestli změníte heslo lokálního administrátora, stejně vám to nepomůže.
- každé DC musí mít filter nainstalován lokálně. Pokud tam tedy máte nějaké legitimní identity integration, nezapoměňte na to při reinstalaci a přidávání řadičů
- AD password filter dostává pouze nové heslo. Staré nevidí. Znamená to tedy, že do integrovaných systémů to může procházet pouze jako reset hesla, nikoliv jako změna hesla. Z toho plynou bezpečnostní požadavky na tyto integrované systémy, kde filtr musí mít oprvánění na reset hesla (nejen změnu hesla), což je přecejenom trošku lepší bezpečnostní kvalita.
Můj demonstrační Active Directory password filter
Vždycky to ukazuju na svém ukázkovém password filteru. Prostě to loguje změnu hesla do souboru v rootu disku. Binárky i zdrojový kód si můžete stáhnout zde jak pro 32-bit tak i pro 64-bit operační systém. Zdrojový kód je tam navíc taky. Upozorňuju, že se jedná o zkušební verzi do testovacího nefunkčního prostředí. Negarantuju, že to funguje spolehlivě. Ale jak jsem to zkoušel, od Windows 2000 po Windows 2012 R2 to jede v pohodě. Jen tam musíte nahrát správnou binární verzi.
Závěr
Dávejte bacha. Hackeři jsou všude. Jestli vám napadnou počítač, nebo nejhůř řadič domény, resetování hesel není samozáchrana!