hacktricks/pentesting-web/file-inclusion/lfi2rce-via-eternal-waiting.md

8 KiB
Raw Blame History

LFI2RCE 通过永久等待

从零开始学习 AWS 黑客技术,成为 htARTE (HackTricks AWS 红队专家)

支持 HackTricks 的其他方式:

基本信息

默认情况下,当文件被上传到 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-fmprequest_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的其他方式