Zerologon – rychlá cesta k ovládnutí Active Directory (praktická ukázka)

Zerologon je název zranitelnosti identifikované jako CVE-2020-1472, kterou objevil Tom Tervoort, bezpečnostní expert společnosti Secura’s Security. Pro stručné vysvětlení: Zerologon byl způsoben chybou v kryptografickém autentizačním schématu používaném protokolem Netlogon Remote Protocol (MS-NRPC), která způsobuje obcházení autentizace. Obejitím autentizačního tokenu pro konkrétní funkci Netlogon mohl útočník zavolat funkci, která nastavila heslo doménového řadiče (DC) na známou hodnotu. Poté může útočník DC ovládnout a ukrást přihlašovací údaje všech uživatelů domény.

zerologon1

Zranitelné systémy

  • Windows Server 2008 R2 for x64-based Systems Service Pack 1
  • Windows Server 2008 R2 for x64-based Systems Service Pack 1 (Server Core installation)
  • Windows Server 2012
  • Windows Server 2012 (Server Core installation)
  • Windows Server 2012 R2
  • Windows Server 2012 R2 (Server Core installation)
  • Windows Server 2016
  • Windows Server 2016 (Server Core installation)
  • Windows Server 2019
  • Windows Server 2019 (Server Core installation)
  • Windows Server, version 1903 (Server Core installation)
  • Windows Server, version 1909 (Server Core installation)
  • Windows Server, version 2004 (Server Core installation)

Příprava

Než exploit použijeme, je potřeba splnění několika prerekvizit:

Instalace Impacketu & Zerologon skriptu

  1. pokud používáte starou verzi impacketu, můžete ji odinstalovat tímto příkazem: apt remove - purge impacket-scripts python3-impacket
  2. naklonujte nejnovější verzi Impacket pomocí tohoto příkazu: git clone https://github.com/SecureAuthCorp/impacket a poté cd impacket
  3. .pip3 install .
  4. poté naklonování skriptu Zerologon z GitHubu VoidSec: git clonehttps://github.com/VoidSec/CVE-2020-1472
  5. a instalace všech nutných modulů (použitím pipu v CVE-2020–1472 adresáři): pip3 install -r requirements.txt

Exploitace

Jako první je potřeba si uvědomit zásadní věc, před kterou varuje i VoidSec (překlad):

“Pravděpodobně dojde k rozbití věcí v produkčním prostředí (např. funkčnost DNS, komunikace s replikačními řadiči domény atd.); cíloví klienti se pak již nebudou moci autentizovat vůči doméně a jejich synchronizaci bude nutné provést pouze ručně.”

Proto opatrně, pokud tento skript budete spouštět v produkčním prostředí – vždy byste měli uvědomit nebo vyžádat si povolení od správce!

V tomto článku zranitelnost využijeme až do kroku získání příkazového řádku na DC. Nyní skript spustíme a podíváme se, co potřebujeme:

zerologon2

Abychom mohli skript spustit, musíme nejprve znát název DC, resp. NetBIOS název. K tomu je možné použít nástroj Nbtscan nebo Nmap. Pokud název DC není správný, skript by pak skončil chybovou hláškou STATUS_INVALID_COMPUTER_NAME.

zerologon3
zerologon4

Když už název DC známe, nic nám nebrání exploit spustit s následující syntaxí:

python3 cve-2020–1472-exploit.py -n <DC-NAME> -t <IP-Target>

zerologon5

Jak vidíme, skript před samotnou exploitací požádá o schválení pokračování zneužití změnou hesla řadiče domény. Pokud zvolíte N, pak skript funguje pouze jako check, pokud zvolíte Y, pak by skript měl vést k tomu, že heslo účtu řadiče domény bude změněno na prázdný řetězec.

Po úspěšné změně hesla účtu řadiče domény na prázdný řetězec bychom v tomto okamžiku měli být schopni spustit modul Impacket secretsdump.py v adresáři /Impacket/examples

Secretsdump tzv. „vydumpuje“ veškerá credentials z Active Directory, příkaz:

python3 secretsdump.py -no-pass -just-dc <Domain>/<DC-Name>\$@<IP-Target>

zerologon6

Následně už můžeme získat příkazovou řádku na DC pomocí modulu wmiexec.py, a to tak, že k autentizaci použijeme NTLM hash účtu Administrátor získaného z DC. Příkaz:

python3 wmiexec.py -hashes <hash-value> <domain>/<User>@<IP-Target>

zerologon7

Obnovení do původního stavu

Jak už bylo řečeno na začátku, po úspěšné změně hesla DC nefunguje Active Directory správně. Pro další normální fungování DC je nutná obnovení původního hashe hesla.

Protože už disponujeme právy doménového administrátora, znovu tedy použijeme wmiexec.py a stáhneme si z DC zálohu registrů, resp. SYSTEM, SAM a SECURITY:

zerologon8

Pak použijeme opět secretsdump.py, ale tentokrát pro dump výše zmíněných souborů – z nich totiž získáme zpět hash DC stroje jako takového:

python3 secretsdump.py -sam sam.save -system system.save -security security.save LOCAL

zerologon9

Teď již můžeme obnovit účet DC do původního stavu. K tomu použijeme skript reinstall_original_pw.py.

Poznámka: někdy je potřeba pro úspěšnou obnovu spustit skript vícekrát.

python3 reinstall_original_pw.py <DC-Name> <IP> <ORIGINAL-NT-HASH>

zerologon10

Pro ověření, že heslo je opět v původním stavu můžeme spustit opět secretsdump.py - tentokrát by již však měl skončit chybou, protože jsme ztratili oprávnění doménového administrátora.

python3 secretsdump.py -no-pass -just-dc <Domain>/<DC-Name>\$@<IP-Target>

zerologon11

Mitigace a závěr

9. února 2021 Microsoft oznámil druhou fázi aktualizací zabezpečení Windows systémů právě vůči této zranitelnosti. Tato aktualizace ve výchozím nastavení povoluje režim vynucení (enforcement) na všech podporovaných doménových řadičích a zablokuje zranitelné připojení z nevyhovujících zařízení, pokud nejsou ručně přidána do skupiny, na kterou se odkazuje v části "Řadič domény: Povolit zranitelná připojení zabezpečeného kanálu Netlogon" doménových politik. Aby byli před Zerologonem plně chránění, Microsoft důrazně doporučuje všem zákazníkům instalaci všech bezpečnostních aktualizací z února 2021.

Výše zmíněnou aktualizaci jsem následně aplikoval i na svůj pokusný doménový řadič, na kterém v tomto článku byla zranitelnost testována – exploatace opravdu byla neúspěšná a zranitelnost Zerologon opravena.