# 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来分享你的黑客技巧。