从路径遍历到RCE

文化   2025-01-20 12:03   韩国  

扫码领资料

获网安教程


Track安全社区投稿~  

赢千元稿费!还有保底奖励~(https://bbs.zkaq.cn)

描述

在对目标进行侦察和端口扫描时,我们发现了一个使用端口 8443 的子域名:http://admin.target.com:8443。虽然响应返回了一个 404 状态码,但大多数猎人可能会忽略任何返回 404 的子域名,而我不会!

通过对 http://admin.target.com:8443/FUZZ 进行模糊测试(Fuzzing),我发现了一个路径 /admin/,它会重定向到登录页面 http://admin.target.com:8443/admin/faces/jsf/login.xhtml。在对该登录端点进行测试后,未发现任何漏洞,于是我决定继续在路径 /admin/ 下进行模糊测试,例如 http://admin.target.com:8443/admin/FUZZ。最终,我偶然发现了一个端点 /download/,位于路径 /admin/Download,其返回了一个 200 状态码,但响应内容为空。

从端点名称可以推测出其功能,但我们缺少正确的参数以及一个100%有效的文件路径。由于该端点位于 /admin/ 路径下,因此我们应寻找通常在管理目录中起作用的文件。通常,我会通过测试 JavaScript 文件来尝试本地文件包含(LFI)和路径遍历漏洞,因此我从名为 admin/js/main.js 的文件开始测试。

这种方法可以帮助我们检测LFI和路径遍历漏洞,并识别可访问的路径。此外,由于需要找到 /download 所需的正确参数,我们必须使用一个已知的有效文件,即 /admin/js/main.js。这样可以确保我们在模糊测试正确参数时不会遗漏。模糊测试的命令结构如下:

img

通过此次模糊测试,我们了解到 /admin/download 接受一个名为 filename 的参数。因此,访问 http://admin.target.com:8443/admin/download?filename=/js/main.js 会显示文件内容,位于 http://admin.target.com:8443/admin/js/main.js

我首先尝试实现完整的路径遍历,试图读取 /etc/passwd 文件。不幸的是,/download 功能仅限于访问 /admin/ 路径下的文件,任何超出 /admin/ 路径的内容都无法访问。然而,这验证了我们确实存在一个有限路径遍历漏洞

由于这是一个 Java 环境,我尝试读取 /WEB-INF/web.xml 文件,因为该文件通常包含大量有用信息。通过访问 http://admin.target.com:8443/admin/download?filename=/WEB-INF/web.xml,我成功获取到了一些关键信息

img

注意,我们发现了三个URL:/download//faces/(我们已经知道),以及一个新的:/incident-report。访问 http://admin.target:8443/admin/incident-report 触发了一件意想不到的事情:它开始下载一个名为 incident-report-xxxxxx.zip 的大型日志文件。结果发现,这实际上是一个实时日志文件

日志文件内容如下:

img

每次访问 http://admin.target:8443/admin/incident-report 时,都会下载一个新的日志文件,因为这些日志是实时生成的

提升漏洞影响:

在检查日志文件时,我发现了一个包含管理员密码的文件。

img

21232f297a57a5a743894a0e4a801fc3:admin (md5)` 这个密码已经失效,这是旧密码。新密码是 2a92e4f4ecc321db24c8f389a287d793:Glglgl123。

img

于是,我再次前往登录页面 /admin/faces/jsf/login.xhtml,尝试了 admin:Glglgl123,结果成功登录,并以管理员身份获得了对控制面板的完全访问权限!

img

登录后,我发现了一个名为 export_step2.xhtml 的功能,其中包含一个 Groovy Console。于是,我在这里暂停并报告了漏洞,然后请求项目负责人允许我尝试一下RCE。对方的回应是:

我提到存在潜在的RCE漏洞,并询问是否可以进一步探索并尝试利用它。


在深入研究之前,先了解一下什么是 Groovy Console

Groovy Console 是一个开发和调试工具,提供了一个界面来执行 Groovy 脚本。开发人员通常使用它来测试代码片段、探索 API,以及直接在受控环境中原型化功能。它通常仅对内部系统中的受信任用户可访问,因为它允许执行任意代码。


如果未经适当身份验证访问,会产生的安全问题:

任意代码执行: 如果未经授权的用户获得 Groovy Console 的访问权限,他们可以在服务器上运行任何 Groovy 或 Java 代码。这可能导致远程代码执行(RCE),使攻击者能够窃取数据、危害其他应用程序,甚至完全控制服务器。

敏感信息泄露: 攻击者可以执行命令来读取配置文件、环境变量,甚至是存储在服务器上的凭据。这会为进一步的漏洞利用和横向移动提供机会。

权限提升: 如果 Groovy Console 以高权限运行,攻击者可能执行普通应用用户无法完成的操作,包括创建或删除文件、修改应用逻辑或安装恶意软件。

简而言之,未经授权访问 Groovy Console 会使其成为攻击者的后门工具,为他们提供强大的手段来破坏整个系统。

RCE:

回到 export_step2.xhtml 页面,其中包含 Groovy Console。我使用了以下 payload:

img

但是正如你所看到的,命令执行成功,但没有输出结果

我尝试了不同的命令。

print "id".execute().textprint "sudo cat /etc/passwd".execute().text

不幸的是,同样的问题仍然存在:命令被成功执行,但没有返回任何输出。

链接漏洞以实现完整的RCE:

等等,你还记得功能 http://admin.target:8443/admin/incident-report 吗?

正如之前提到的……

访问 http://admin.target:8443/admin/incident-report 触发了一件意想不到的事情:它开始下载一个名为 incident-report-xxxxxx.zip 的巨大日志文件。事实证明,这是一个实时生成的日志文件

没错!它成了获取 RCE 输出的关键。通过访问 http://admin.target:8443/admin/incident-report,我可以下载最新的日志文件——你猜我在里面发现了什么?RCE 输出!

img

漏洞利用变得非常简单:

1.使用我们发现的凭据登录。
2.进入 Groovy 控制台。
3.运行类似于 print "sudo cat /etc/passwd".execute().text 的命令(或者尝试其他命令)。
4.接下来,导航到日志端点 http://admin.target:8443/admin/incident-report
5.下载最新的日志文件,RCE 的输出就在里面!

为什么我没有尝试 OOB-RCE 或直接在服务器上创建一个文件来绕过这些步骤?我知道你可能会有这样的疑问!答案很简单 :)

原因有两个:

1.OOB-RCE 不可能实现:目标服务器有某种 WAF(Web 应用防火墙)机制,阻止了任何到我的 IP 或其他外部 IP 的出站连接。
2.赏金较低:OOB-RCE 通常会比直接 RCE 得到更低的奖励。相信我——在这个领域久了我很清楚!


最终结果:

目标项目要求我们提交两份单独的报告:一份关于 RCE 的报告,另一份关于发现的凭据的报告。总赏金:$40,000
img

声明:⽂中所涉及的技术、思路和⼯具仅供以安全为⽬的的学习交流使⽤,任何⼈不得将其⽤于⾮法⽤途以及盈利等⽬的,否则后果⾃⾏承担。所有渗透都需获取授权

如果你是一个网络安全爱好者,欢迎加入我的知识星球:zk安全知识星球,我们一起进步一起学习。星球不定期会分享一些前沿漏洞,每周安全面试经验、SRC实战纪实等文章分享,微信识别二维码,即可加入。


白帽子左一
零基础也能学渗透!关注我,跟我一启开启渗透测试工程师成长计划.专注分享网络安全知识技能.
 最新文章