白帽故事 · 2025年1月17日 0

$40,000!如何将路径遍历升级为RCE!

前言

本文将向各位讲一讲国外白帽 I& Orwa Atyat 如何成功将有限的路径遍历升级为 RCE 漏洞 ,从而赢得40,000 美刀赏金的故事。

在对目标进行侦察和端口扫描时,白帽小哥发现了一个带有8443的子域, http://admin.target.com:8443 ,虽然响应是404 ,大多数白帽子可能都会忽略任何返回404子域。但白帽小哥从不会轻易放过!

漏洞挖掘

通过模糊测试, http://admin.target.com:8443/FUZZ ,白帽小哥发现了一个 /admin/ 路径 ,它会重定向到登录页面http://admin.target.com:8443/admin/faces/jsf/login.xhtml

测试该登录端点并没有发现漏洞,白帽小哥决定继续在admin路径下进行Fuzz,例如 http://admin.target.com:8443/admin/FUZZ

于是发现 /admin/Download /download/ 端点 ,它们返回了200 响应代码,但响应内容为空。

所以,从端点的名称大致可以推断出它的功能!但是我们缺少正确的参数,我们需要 100% 有效的文件和路径。

由于端点位于/admin/下,白帽小哥通常使用 JavaScript 文件开始测试 LFI 和路径遍历,因此白帽小哥使用admin/js/main.js开始测试。

这种方法可以帮助确定 LFI 和路径遍历漏洞并识别可访问的路径,此外,由于需要确定/download所需的正确参数,因此必须使用已知的有效文件,即/admin/js/main.js 。

这样可以确保我们在Fuzz中查找正确参数时不会有遗漏。Fuzz 命令的结构如下:

file

通过模糊测试,从而得知/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:8443/admin/download?fileName=/WEB-INF/web.xml ,能够访问到一些有趣的信息!

file

注意,白帽小哥一共发现了三个 URL: /download//faces/ (之前已知)和一个新 URL: /incident-report

查看 http://admin.target:8443/admin/incident-report 触发了一些意外的事情:它开始下载一个名为incident-report-xxxxxx.zip的巨大日志文件,而该文件竟是一个实时的日志文件!

file

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

很多人可能会在此停下并开始撰写漏洞报告,但白帽小哥打算继续深入挖掘!

扩大漏洞影响

通过检查日志文件,白帽小哥发现了一个包含管理员密码的文件:

file

21232f297a57a5a743894a0e4a801fc3:admin (md5)文件上显示的密码是旧密码,下一个密码是:2a92e4f4ecc321db24c8f389a287d793:Glglgl123

file

再次登录/admin/faces/jsf/login.xhtml,尝试admin:Glglgl123 ,竟然可以作为管理员登录访问面板!

file

登录后,发现一个名为export_step2.xhtml的函数,它具有 Groovy 控制台 ,白帽小哥打算就此打住,并开始撰写漏洞报告,并向厂商申请是否可以进一步尝试RCE操作。

在深入研究之前,让我们先了解一下什么是 Groovy 控制台

Groovy 控制台是一个开发和调试工具,提供执行 Groovy 脚本的界面。

开发人员经常使用它直接在受控环境中测试代码片段、探索 API 和原型功能。

它通常只能由内部系统上的受信任用户访问,因为它允许执行任意代码。

RCE

回到 Groovy控制台的export_step2.xhtml,白帽小哥使用了以下Payload:

file

可以看到,命令执行了但没有任何输出!

尝试不同的命令:

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

很遗憾,同样的问题仍然存在:命令已执行,但没有返回任何内容。

链接漏洞实现完整RCE

还记得这个函数吗?http://admin.target:8443/admin/incident-report

事实证明,这是获得 RCE 输出的关键!!!

通过访问http://admin.target:8443/admin/incident-report ,我们可以下载新的日志——我们的RCE输出就在其中!

file

最终白帽小哥顺利获得$40,000赏金奖励。

file

经验教训与总结:

  1. 将漏洞赏金视为游戏:

把漏洞挖掘当作一次探索–即在达到最终目标之前,不要停在子域上的游戏。

在本案例中,最终目标是实现 RCE 并获得 4 万美元的赏金,许多白帽子可能会在发现第一个漏洞时就停下来,并立即报告。

  1. 当在子域上发现错误时,记得保留它直到完成该子域上的所有测试!

  2. 重质量而非数量!

感谢阅读,以上内容由骨哥翻译并整理。

原文:https://medium.com/@HX007/a-journey-of-limited-path-traversal-to-rce-with-40-000-bounty-fc63c89576ea