8 KiB
LFI2RCE 通过永久等待
从零开始学习 AWS 黑客技术,成为 htARTE (HackTricks AWS 红队专家)!
支持 HackTricks 的其他方式:
- 如果您想在 HackTricks 中看到您的公司广告 或 下载 HackTricks 的 PDF,请查看 订阅计划!
- 获取 官方 PEASS & HackTricks 商品
- 发现 PEASS 家族,我们独家的 NFT 集合
- 加入 💬 Discord 群组 或 telegram 群组 或在 Twitter 🐦 上 关注 我 @carlospolopm。
- 通过向 HackTricks 和 HackTricks Cloud github 仓库提交 PR 来分享您的黑客技巧。
基本信息
默认情况下,当文件被上传到 PHP(即使它没有预期到),它会在 /tmp
中生成一个临时文件,名称类似于 php[a-zA-Z0-9]{6}
,尽管我见过一些 docker 镜像生成的文件中不包含数字。
在本地文件包含中,如果你设法包含了那个上传的文件,你将获得 RCE。
请注意,默认情况下 PHP 只允许在单个请求中上传 20 个文件(在 /etc/php/<version>/apache2/php.ini
中设置):
; Maximum number of files that can be uploaded via a single request
max_file_uploads = 20
也就是说,潜在文件名的数量是 62*62*62*62*62*62 = 56800235584
其他技术
其他技术依赖于攻击 PHP 协议(如果您只能控制路径的最后一部分,您将无法做到),泄露文件路径,滥用预期文件,或者让 PHP 遭受段错误,以便不会删除上传的临时文件。
这项技术与上一项非常相似,但不需要找到零日漏洞。
永恒等待技术
在这项技术中,我们只需要控制相对路径。如果我们设法上传文件并使得LFI 永无止境,我们将有“足够的时间”来暴力破解上传的文件并找到任何上传的文件。
这项技术的优点:
- 您只需要控制 include 内的相对路径
- 不需要 nginx 或对日志文件的意外访问级别
- 不需要 0 day 来引起段错误
- 不需要路径泄露
这项技术的主要问题是:
- 需要特定的文件存在(可能还有更多)
- 潜在文件名的疯狂数量:56800235584
- 如果服务器不使用数字,总潜在数量是:19770609664
- 默认情况下,单个请求中只能上传20个文件。
- 服务器使用的最大并行工作数。
- 这个限制加上前面的限制可能会导致这种攻击持续太久
- PHP 请求的超时时间。理想情况下,这应该是永久的,或者应该在不删除临时上传文件的情况下终止 PHP 进程,否则,这也将是一个问题
那么,您如何让 PHP include 永无止境?只需包含文件**/sys/kernel/security/apparmor/revision
(不幸的是不适用于 Docker 容器**...)。
尝试调用:
php -a # open php cli
include("/sys/kernel/security/apparmor/revision");
Apache2
默认情况下,Apache 支持 150个并发连接,根据 https://ubiq.co/tech-blog/increase-max-connections-apache/ 的指南,可以将这个数字提升至8000。按照这个教程使用 PHP 和该模块:https://www.digitalocean.com/community/tutorials/how-to-configure-apache-http-with-mpm-event-and-php-fpm-on-ubuntu-18-04。
默认情况下(根据我的测试),PHP进程可以无限期运行。
我们来做些计算:
- 我们可以使用 149个连接 生成 149 * 20 = 2980个临时文件,里面包含我们的webshell。
- 然后,使用 最后一个连接 来 暴力破解 可能的文件。
- 以 每秒10个请求 的速度,时间为:
- 56800235584 / 2980 / 10 / 3600 ≈ 530小时(50%的机会在265小时)
- (不带小数)19770609664 / 2980 / 10 / 3600 ≈ 185小时(50%的机会在93小时)
{% hint style="warning" %} 注意,在上述示例中,我们 完全DoS了其他客户端! {% endhint %}
如果Apache服务器得到改进,我们可以滥用 4000个连接(达到最大数量的一半)。我们可以创建 3999*20 = 79980
个文件,那么 数字 将会 减少 到大约 19.7小时 或 6.9小时(10小时,3.5小时有50%的机会)。
PHP-FMP
如果不使用常规的apache php模块来运行PHP脚本,而是网页正在使用 PHP-FMP(这提高了网页的效率,所以常见),还有其他方法可以改进这项技术。
PHP-FMP 允许在 /etc/php/<php-version>/fpm/pool.d/www.conf
中配置参数 request_terminate_timeout
。
这个参数指示 请求到PHP必须终止 的最大秒数(默认无限,但如果参数被取消注释,则为30秒)。当PHP正在处理请求并达到指定的秒数时,它会被 终止。这意味着,如果请求在上传临时文件时,因为 php处理被停止,那些 文件不会被删除。因此,如果你能让一个请求持续那么长时间,你就可以 生成数千个不会被删除的临时文件,这将 加快找到它们的过程 并减少因消耗所有连接而对平台造成DoS的可能性。
因此,为了 避免DoS,假设攻击者同时只使用 100个连接,并且php最大处理时间由 php-fmp(request_terminate_timeout
) 设置为 30秒。因此,每秒可以生成的 临时文件 数量为 100*20/30 = 66.67
。
然后,攻击者需要:10000/66.67 = 150秒
来生成 10000个文件(生成 100000个文件 的时间将是 25分钟)。
然后,攻击者可以使用这 100个连接 来进行 暴力破解搜索。 **** 假设速度为每秒300个请求,利用这个漏洞所需的时间如下:
- 56800235584 / 10000 / 300 / 3600 ≈ 5.25小时(50%的机会在2.63小时)
- (有100000个文件)56800235584 / 100000 / 300 / 3600 ≈ 0.525小时(50%的机会在0.263小时)
是的,在EC2中等大小的实例上可以生成100000个临时文件:
{% hint style="warning" %} 注意,为了触发超时,只需包含易受攻击的LFI页面,这样它就会进入一个无限循环。 {% endhint %}
Nginx
看起来默认情况下Nginx同时支持 512个并行连接(这个数字可以提高)。
从零开始学习AWS黑客攻击直到成为专家,通过 htARTE (HackTricks AWS Red Team Expert)!
支持HackTricks的其他方式:
- 如果你想在 HackTricks 中看到你的 公司广告 或 下载HackTricks的PDF,请查看 订阅计划!
- 获取 官方PEASS & HackTricks商品
- 发现 PEASS家族,我们独家的 NFTs系列
- 加入 💬 Discord群组 或 telegram群组 或在 Twitter 🐦 上 关注 我 @carlospolopm。
- 通过向 HackTricks 和 HackTricks Cloud github仓库提交PR来分享你的黑客技巧。