root@thehacksparrow:~/writeups$ SYSTEM ONLINE
root@sparrow:~/writeups$ cat voleur.md
// writeups

Voleur

5 Jul 2025 · 24 min read · root access
Voleur - maquina de Hack The Box

Executive summary — Voleur (French for "thief") is a Domain Controller with one detail that shapes the entire operation: NTLM is disabled (NTLM:False), so every authentication step — from the very first kinit to root.txt — has to go through Kerberos. It's an assumed breach box: it starts from a first-line support credential and chains six Active Directory techniques, each unlocking the next: an encrypted Excel file leaks service-account passwords and the password of an already-deleted account; a Targeted Kerberoasting via ACL abuse grants WinRM access; the AD Recycle Bin resurrects that deleted account; its DPAPI blobs, archived on an SMB share, hide a third user's password; that user reaches an SSH key that opens a WSL instance running inside the DC itself with passwordless sudo; and there, a poorly guarded Active Directory backup hands over a full ntds.dit for an offline dump and an overpass-the-hash all the way to Domain Admin.

PlatformHack The Box
Operating systemWindows (Active Directory, Kerberos-only)
DifficultyMedium
StatusRetired
Target IP10.129.49.32

Attack map

[Assumed breach] ryan.naylor : HollowOct31Nyt -- NTLM:False, everything over Kerberos
   |  SMB \\DC\IT -> encrypted Access_Review.xlsx
   v
[office2john + rockyou] "football1" -> svc_ldap / svc_iis / todd.wolfe creds (DELETED)
   |  svc_ldap holds WriteSPN over svc_winrm (ACL abuse)
   v
[Targeted Kerberoasting] fake SPN on svc_winrm -> TGS -> crack -> AFireInsidedeOzarctica980219afi
   |  svc_winrm in Remote Management Users
   v
[WinRM] svc_winrm -> user.txt
   |  svc_ldap in Restore_Users -> Reanimate Tombstone (AD Recycle Bin)
   v
[Restore] todd.wolfe -- archived profile on SMB \\IT\...\Archived Users
   |  DPAPI blobs (masterkey + credential) decryptable with todd's password
   v
[DPAPI] -> jeremy.combs : qT3V9pLXyN7W4m
   |  SMB \\IT\Third-Line Support -> svc_backup's id_rsa
   v
[SSH :2222] Linux WSL INSIDE the DC -> svc_backup (sudo NOPASSWD:ALL)
   |  /mnt/c/... AD backup: ntds.dit + SYSTEM + SECURITY
   v
[offline secretsdump] Administrator NTLM + AES256
   v
[ROOT] overpass-the-hash -> Kerberos TGT -> wmiexec Domain Admin -> root.txt

1. Reconnaissance and Kerberos environment setup

The starting point isn't a vulnerability, it's a credential: ryan.naylor : HollowOct31Nyt, a typical assumed breach where the goal isn't initial access but everything that follows it. Before touching anything there's an infrastructure problem of my own to fix: with NTLM disabled, every operation — SMB, LDAP, WinRM — requires a valid Kerberos ticket, and Kerberos has zero tolerance for clock drift.

sudo timedatectl set-ntp false
sudo systemctl disable --now systemd-timesyncd
sudo ntpdate -u 10.129.49.32                # repeat right before operating

The DC was running about 8 hours ahead of the local clock, and Kerberos rejects any ticket with a skew above 5 minutes (KRB_AP_ERR_SKEW). Syncing once isn't enough: systemd-timesyncd and VirtualBox's virtual clock both tend to revert the time as soon as networking reconnects, so both get disabled and the sync gets repeated by hand before every working session.

The second, less obvious fix turned out to be decisive: forcing TCP for the KDC.

[libdefaults]
    default_realm = VOLEUR.HTB
    dns_lookup_kdc = false
    rdns = false
    dns_canonicalize_hostname = false
    udp_preference_limit = 1        # forces TCP: kills intermittent timeouts
[realms]
    VOLEUR.HTB = { kdc = DC.voleur.htb }
[domain_realm]
    .voleur.htb = VOLEUR.HTB

A Kerberos ticket carrying a large PAC (Privilege Attribute Certificate) — the case for accounts in many groups, as would later show up with todd.wolfe — doesn't fit in a single UDP datagram. Without udp_preference_limit = 1, those packets fragment and the box's KDC drops them intermittently, which surfaces as erratic errors (a phantom KRB_AP_ERR_SKEW, Invalid token) that have nothing to do with the clock or the credential. Forcing TCP in krb5.conf removes them at the root.

echo '10.129.49.32 voleur.htb DC.voleur.htb DC' | sudo tee -a /etc/hosts
echo 'HollowOct31Nyt' | kinit ryan.naylor@VOLEUR.HTB
sudo nmap -Pn -p- --min-rate 2000 10.129.49.32

The port profile is a textbook DC — 53, 88, 135, 139, 389, 445, 464, 593, 636, 3268/3269, 5985 (WinRM), 9389 (ADWS) — except for one port that doesn't fit: 2222, an SSH service on a non-standard port that, unknowingly at this point, is the back door into a Linux subsystem running inside the domain controller itself.

SMB   10.129.49.32  445  DC  (name:DC) (domain:voleur.htb) (signing:True) (NTLM:False)

NTLM:False confirms on the ground what was already suspected: the domain enforces pure Kerberos, with no NTLM fallback available even for quick checks.

export KRB5CCNAME=/tmp/krb5cc_1000
netexec ldap DC.voleur.htb -k --use-kcache --users

Eleven users, with a support hierarchy visible right in the names — first-, second- and third-line technicians — plus four service accounts that will become the protagonists: svc_ldap, svc_backup, svc_iis, svc_winrm.

netexec smb DC.voleur.htb -k --use-kcache --shares
# ... IT (READ), Finance, HR, NETLOGON, SYSVOL ...

bloodhound-python -d voleur.htb -u ryan.naylor -k -no-pass -ns 10.129.49.32 \
  --dns-tcp --auth-method kerberos -c all --zip -dc DC.voleur.htb

The IT share, readable by ryan.naylor, already points to where to look first. BloodHound, over the ACL graph, surfaces the edge that acts as the hinge between the first and second hop of the chain:

SVC_LDAP@VOLEUR.HTB   --WriteSPN-->   SVC_WINRM@VOLEUR.HTB

svc_ldap can write the servicePrincipalName attribute of svc_winrm. There's no credential for svc_ldap yet, but it's already clear what to do with one as soon as it shows up: a Targeted Kerberoasting.

🔒 Clearance required

This content is Root Access only. Everything else on the site — the free tier, the whole public library — stays open.

See Root Access plans

No account? Create one free then upgrade from your console.