# LFI2RCE 通过永久等待
从零开始学习 AWS 黑客技术,成为 htARTE (HackTricks AWS 红队专家) 支持 HackTricks 的其他方式: * 如果您想在 **HackTricks 中看到您的公司广告** 或 **下载 HackTricks 的 PDF**,请查看 [**订阅计划**](https://github.com/sponsors/carlospolop)! * 获取 [**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com) * 发现 [**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们独家的 [**NFT 集合**](https://opensea.io/collection/the-peass-family) * **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram 群组**](https://t.me/peass) 或在 **Twitter** 🐦 上 **关注** 我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。** * **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享您的黑客技巧。
## 基本信息 默认情况下,当文件被上传到 PHP(即使它没有预期到),它会在 `/tmp` 中生成一个临时文件,名称类似于 **`php[a-zA-Z0-9]{6}`**,尽管我见过一些 docker 镜像生成的文件中不包含数字。 在本地文件包含中,**如果你设法包含了那个上传的文件,你将获得 RCE**。 请注意,默认情况下 **PHP 只允许在单个请求中上传 20 个文件**(在 `/etc/php//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 容器**...)。 尝试调用: ```bash php -a # open php cli include("/sys/kernel/security/apparmor/revision"); ``` ## Apache2 默认情况下,Apache 支持 **150个并发连接**,根据 [https://ubiq.co/tech-blog/increase-max-connections-apache/](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](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//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**,请查看 [**订阅计划**](https://github.com/sponsors/carlospolop)! * 获取 [**官方PEASS & HackTricks商品**](https://peass.creator-spring.com) * 发现 [**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的 [**NFTs系列**](https://opensea.io/collection/the-peass-family) * **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在 **Twitter** 🐦 上 **关注** 我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。** * **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享你的黑客技巧。