Overview
Voleur is a medium-difficulty Windows machine built around an Active Directory
environment with NTLM authentication fully disabled. The challenge begins as an
assumed breach, with low-privileged credentials for ryan.naylor provided as the
starting point.
The full attack chain covers: Kerberos setup and SMB enumeration leading to a
password-protected Excel file whose cracked contents expose service account
credentials; BloodHound-driven discovery of a WriteSPN misconfiguration enabling
targeted Kerberoasting against svc_winrm; Active Directory Recycle Bin abuse to
restore a deleted user; offline DPAPI credential decryption to recover a
higher-privileged account; and finally, pivoting through a Windows Subsystem for Linux
instance to extract backup copies of ntds.dit, SYSTEM, and SECURITY - yielding
the Administrator NT hash and full domain compromise.
| |
Reconnaissance
Port scanning
| |
Relevant results:
| |
The port profile is classic Windows Domain Controller. The standout is port 2222
running OpenSSH for Ubuntu Linux - identified by nmap as a Linux kernel co-existing on
the same host. This immediately signals Windows Subsystem for Linux (WSL), which will
become the privilege escalation path. The domain name voleur.htb is leaked through
LDAP.
Kerberos configuration
Attempting to authenticate with ryan.naylor:HollowOct31Nyt via SMB returns
STATUS_NOT_SUPPORTED - NTLM is disabled across the board. Every tool and connection
must use Kerberos.
Kerberos requires three things to work reliably from a Linux attack host: proper
hostname resolution, a valid /etc/krb5.conf, and a synchronized clock. Kerberos will
reject tickets if the client clock differs from the DC by more than five minutes
(KRB_AP_ERR_SKEW).
| |
/etc/krb5.conf is configured to point the VOLEUR.HTB realm at dc.voleur.htb:
| |
SMB enumeration
With Kerberos configured, listing shares using ryan.naylor:
| |
The IT share is readable. Spidering it recursively:
| |
This turns up //DC.voleur.htb/IT/First-Line Support/Access_Review.xlsx. Downloading
it:
| |
Excel password cracking
The file is password-protected. Extracting the embedded hash:
| |
Password recovered: football1.
The decrypted spreadsheet is an internal access review - a list of users, their roles, permissions, and operational notes. It’s sitting on a readable network share with only spreadsheet-level encryption for protection:
| Account | Notes |
|---|---|
| Ryan.Naylor | Kerberos Pre-Auth disabled temporarily |
| Todd.Wolfe | Leaver. Password reset to NightT1meP1dg3on14, account deleted |
| Jeremy.Combs | Third-Line Support; access to Software folder |
| svc_ldap | P/W - M1XyC9pW7qT5Vn |
| svc_iis | P/W - N5pXyW1VqM7CZ8 |
| svc_backup | “Speak to Jeremy!” |
| svc_winrm | “Need to ask Lacey as she reset this recently” |
Spraying the extracted credentials against SMB with --continue-on-success:
| |
Output confirms svc_ldap:M1XyC9pW7qT5Vn and svc_iis:N5pXyW1VqM7CZ8 are valid.
svc_backup fails pre-auth, consistent with its password not being listed.
Initial Access
BloodHound and WriteSPN abuse
Collecting domain data with bloodhound-python:
| |
After importing and analyzing the graph, a critical edge appears: SVC_LDAP has
WriteSPN rights over SVC_WINRM.
WriteSPN means svc_ldap can set or modify the servicePrincipalName attribute on
svc_winrm. If an SPN is assigned to an account, any domain user can request a
Kerberos service ticket (TGS) for it - and that ticket is encrypted with the target
account’s NT hash, making it suitable for offline cracking. This is the primitive for
a targeted Kerberoasting attack.
Targeted Kerberoasting
Requesting a TGT for svc_ldap:
| |
Running the targeted attack with targetedKerberoast:
| |
TGS hashes are produced for both lacey.miller and svc_winrm. Cracking with
hashcat:
| |
svc_winrm cracks: AFireInsidedeOzarctica980219afi. The lacey.miller hash
exhausts the wordlist without a hit.
WinRM access as svc_winrm
NTLM being disabled means a Kerberos ticket is required before Evil-WinRM will connect:
| |
| |
The user flag is on the desktop:
| |
Lateral Movement
AD Recycle Bin - restoring Todd Wolfe
BloodHound also revealed that svc_ldap is a member of a non-standard group named
Restore Users. This group suggests it can restore deleted objects from the Active
Directory Recycle Bin - a feature that preserves deleted AD objects (users, groups,
computers) in a marked-deleted state before they are permanently purged.
Uploading RunasCs.exe to the WinRM session and executing commands as svc_ldap with
logon type 9 (network logon) to query deleted objects:
| |
Output:
| |
This is the same Todd Wolfe from the spreadsheet, whose reset password
(NightT1meP1dg3on14) was documented before deletion. Restoring the account:
| |
Re-querying deleted objects confirms Todd Wolfe no longer appears - the account is active and authenticatable with its documented password.
DPAPI offline decryption - recovering jeremy.combs
After getting a TGT for the restored account:
| |
The IT share is readable. Spidering it as Todd Wolfe reveals an archived home
directory at IT/Second-Line Support/Archived Users/todd.wolfe/. Browsing with
impacket-smbclient:
| |
Inside the archived profile, the AppData\Roaming\Microsoft directory contains two
critical artifacts:
- Credential blob:
Credentials\772275FAD58525253490A9B0039791D3 - DPAPI master key:
Protect\S-1-5-21-3927696377-1337352550-2781715495-1110\08949382-134f-4c63-b93c-ce52efc0aa88
Both are downloaded with get.
Windows DPAPI protects credential blobs using a per-user master key, which is itself
encrypted using the user’s password and SID. Since both are known
(NightT1meP1dg3on14 and S-1-5-21-3927696377-1337352550-2781715495-1110), offline
decryption is possible without touching the live system.
Decrypt the master key:
| |
Output:
| |
Using this key to decrypt the credential blob:
| |
Output:
| |
Cross-referencing with the spreadsheet, Jeremy Combs is a Third-Line Support
Technician with broader system access - and the note for svc_backup explicitly
directed readers to speak to Jeremy.
Privilege Escalation
Accessing C:\IT\Third-Line Support as jeremy.combs
| |
| |
Navigating to C:\IT\Third-Line Support:
| |
The note:
| |
The combination of an id_rsa private key and a mention of WSL-based backup tooling
- alongside the earlier nmap finding of Ubuntu OpenSSH on port 2222 - makes the next
step clear. This key likely authenticates to the WSL instance as
svc_backup.
Pivoting into WSL via SSH
| |
| |
Checking sudo privileges:
| |
Unrestricted, passwordless sudo. Escalating to root within WSL is trivial:
| |
More important than the WSL root shell is what it exposes - the Windows filesystem is
mounted at /mnt/c. Exploring the backup directory:
| |
ntds.dit, SYSTEM, and SECURITY - the full set needed for offline domain
credential extraction.
Extracting domain credentials
The files are transferred via SCP from Kali, quoting the path to handle the space in
Third-Line Support:
| |
Running secretsdump against the local files:
| |
Output (key entries):
| |
The Administrator NT hash is e656e07c56d831611b577b160b259ad2.
Root access
NTLM authentication is disabled on the network, so pass-the-hash against SMB or WinRM
directly won’t work. However, impacket-getTGT supports NT hash authentication and
can request a valid Kerberos TGT, which any Kerberos-capable service will accept:
| |
| |
Detection and Mitigation
| Stage | Root cause | Mitigation |
|---|---|---|
| Credential leak in a share | Access_Review.xlsx readable by any domain user, protected only by a spreadsheet password | Never store credentials in documents on network shares, regardless of document-level encryption |
| WriteSPN Kerberoasting | svc_ldap had WriteSPN over svc_winrm | Audit SPN-write permissions on non-computer objects; enforce strong, long service-account passwords |
| AD Recycle Bin abuse | Restore Users group could reinstate a deleted account with a known password | Tightly control membership of Recycle Bin restore groups; purge credentials before archiving accounts |
| DPAPI recovery from an archived profile | Master key and credential blob survived in an “archived” home directory | Explicitly purge DPAPI-protected material before archiving decommissioned profiles |
| WSL privilege escalation | svc_backup had unrestricted, passwordless sudo inside WSL with /mnt/c access | Apply least privilege to WSL distributions; treat WSL as part of the Windows security boundary |
Detection signals:
Restore-ADObjectcalls against Deleted Objects outside of expected maintenance windows.- Reads of
msDS-KeyCredentialLink/DPAPI-related files (Credentials\*,Protect\<SID>\*) from archived profile shares. - SSH logins to a WSL distribution followed by access to
/mnt/cpaths containingSYSTEM,SECURITY, orntds.dit. impacket-getTGT/ Kerberos TGT requests using raw NT hashes (-hashes :<hash>) for privileged accounts.
Lessons Learned
- Sensitive credentials in a readable share.
Access_Review.xlsxwas stored in a network share accessible to any authenticated domain user, protected only by a spreadsheet password that cracked in under ten seconds. The file contained plaintext credentials for multiple service accounts, a deleted user’s reset password, and enough operational context to map the entire privilege chain. - WriteSPN as a Kerberoasting primitive.
svc_ldapholding WriteSPN oversvc_winrmis a textbook misconfiguration: the ability to register a servicePrincipalName on an account is all that’s needed to make it Kerberoastable. - AD Recycle Bin as an attack surface.
Restore Usersgroup membership allowed re-activating a deleted account whose credentials were already documented. - DPAPI secrets surviving in archived profiles. Todd Wolfe’s DPAPI-protected credential blob remained decryptable from an archived home directory years after the account was logically decommissioned, because the master key decryption only requires the user’s SID and password - both of which were documented in the leaked spreadsheet.
- WSL expanding the Windows attack surface. The WSL instance ran as
svc_backupwith full, passwordless sudo rights and transparent read/write access to the Windows filesystem at/mnt/c. A key found in a Windows directory unlocked root-equivalent access to Active Directory backup files that would otherwise require Domain Admin privileges to touch.
Command Reference
| |