前言
本文将向各位讲一讲国外白帽 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 命令的结构如下:
通过模糊测试,从而得知/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
,能够访问到一些有趣的信息!
注意,白帽小哥一共发现了三个 URL: /download/
、 /faces/
(之前已知)和一个新 URL: /incident-report
。
查看 http://admin.target:8443/admin/incident-report
触发了一些意外的事情:它开始下载一个名为incident-report-xxxxxx.zip的巨大日志文件,而该文件竟是一个实时的日志文件!
每次访问http://admin.target:8443/admin/incident-report
时 ,就会下载一个新的日志文件,而这些日志也是实时生成的。
很多人可能会在此停下并开始撰写漏洞报告,但白帽小哥打算继续深入挖掘!
扩大漏洞影响
通过检查日志文件,白帽小哥发现了一个包含管理员密码的文件:
21232f297a57a5a743894a0e4a801fc3:admin (md5)
文件上显示的密码是旧密码,下一个密码是:2a92e4f4ecc321db24c8f389a287d793:Glglgl123
。
再次登录/admin/faces/jsf/login.xhtml
,尝试admin:Glglgl123 ,竟然可以作为管理员登录访问面板!
登录后,发现一个名为export_step2.xhtml的函数,它具有 Groovy 控制台 ,白帽小哥打算就此打住,并开始撰写漏洞报告,并向厂商申请是否可以进一步尝试RCE操作。
在深入研究之前,让我们先了解一下什么是 Groovy 控制台
Groovy 控制台是一个开发和调试工具,提供执行 Groovy 脚本的界面。
开发人员经常使用它直接在受控环境中测试代码片段、探索 API 和原型功能。
它通常只能由内部系统上的受信任用户访问,因为它允许执行任意代码。
RCE
回到 Groovy控制台的export_step2.xhtml,白帽小哥使用了以下Payload:
可以看到,命令执行了但没有任何输出!
尝试不同的命令:
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输出就在其中!
最终白帽小哥顺利获得$40,000赏金奖励。
经验教训与总结:
- 将漏洞赏金视为游戏:
把漏洞挖掘当作一次探索–即在达到最终目标之前,不要停在子域上的游戏。
在本案例中,最终目标是实现 RCE 并获得 4 万美元的赏金,许多白帽子可能会在发现第一个漏洞时就停下来,并立即报告。
-
当在子域上发现错误时,记得保留它直到完成该子域上的所有测试!
-
重质量而非数量!
感谢阅读,以上内容由骨哥翻译并整理。
原文:https://medium.com/@HX007/a-journey-of-limited-path-traversal-to-rce-with-40-000-bounty-fc63c89576ea