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

124 lines
8 KiB
Markdown
Raw Normal View History

# LFI2RCE 通过永久等待
2022-12-18 23:00:42 +00:00
<details>
<summary><strong>从零开始学习 AWS 黑客技术,成为</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS 红队专家)</strong></a><strong></strong></summary>
2022-12-18 23:00:42 +00:00
支持 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 来分享您的黑客技巧。
2022-12-18 23:00:42 +00:00
</details>
2023-08-03 19:12:22 +00:00
## 基本信息
2022-12-18 23:00:42 +00:00
默认情况下,当文件被上传到 PHP即使它没有预期到它会在 `/tmp` 中生成一个临时文件,名称类似于 **`php[a-zA-Z0-9]{6}`**,尽管我见过一些 docker 镜像生成的文件中不包含数字。
2022-12-18 23:00:42 +00:00
在本地文件包含中,**如果你设法包含了那个上传的文件,你将获得 RCE**。
2022-12-18 23:00:42 +00:00
请注意,默认情况下 **PHP 只允许在单个请求中上传 20 个文件**(在 `/etc/php/<version>/apache2/php.ini` 中设置):
2022-12-18 23:00:42 +00:00
```
; Maximum number of files that can be uploaded via a single request
max_file_uploads = 20
```
也就是说,**潜在文件名的数量是 62\*62\*62\*62\*62\*62 = 56800235584**
2022-12-18 23:00:42 +00:00
2023-08-03 19:12:22 +00:00
### 其他技术
2022-12-18 23:00:42 +00:00
其他技术依赖于攻击 PHP 协议(如果您只能控制路径的最后一部分,您将无法做到),泄露文件路径,滥用预期文件,或者**让 PHP 遭受段错误,以便不会删除上传的临时文件**。\
这项技术与上一项**非常相似,但不需要找到零日漏洞**。
2022-12-18 23:00:42 +00:00
### 永恒等待技术
2022-12-18 23:00:42 +00:00
在这项技术中,**我们只需要控制相对路径**。如果我们设法上传文件并使得**LFI 永无止境**,我们将有“足够的时间”来**暴力破解上传的文件**并**找到**任何上传的文件。
2022-12-18 23:00:42 +00:00
**这项技术的优点**
2022-12-19 15:21:53 +00:00
* 您只需要控制 include 内的相对路径
* 不需要 nginx 或对日志文件的意外访问级别
* 不需要 0 day 来引起段错误
2023-08-03 19:12:22 +00:00
* 不需要路径泄露
2022-12-19 15:21:53 +00:00
这项技术的**主要问题**是:
2022-12-18 23:00:42 +00:00
2023-08-03 19:12:22 +00:00
* 需要特定的文件存在(可能还有更多)
* 潜在文件名的**疯狂**数量:**56800235584**
* 如果服务器**不使用数字**,总潜在数量是:**19770609664**
* 默认情况下,**单个请求**中只能上传**20个文件**。
* 服务器使用的**最大并行工作数**。
* 这个限制加上前面的限制可能会导致这种攻击持续太久
* **PHP 请求的超时时间**。理想情况下,这应该是永久的,或者应该在不删除临时上传文件的情况下终止 PHP 进程,否则,这也将是一个问题
2022-12-19 15:21:53 +00:00
那么,您如何**让 PHP include 永无止境**?只需包含文件**`/sys/kernel/security/apparmor/revision`**(不幸的是**不适用于 Docker 容器**...)。
2022-12-19 15:21:53 +00:00
尝试调用:
2022-12-19 15:21:53 +00:00
```bash
php -a # open php cli
include("/sys/kernel/security/apparmor/revision");
```
2022-12-18 23:00:42 +00:00
## 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)。
2022-12-18 23:00:42 +00:00
默认情况下(根据我的测试),**PHP进程可以无限期运行**。
2022-12-18 23:00:42 +00:00
我们来做些计算:
2022-12-18 23:00:42 +00:00
* 我们可以使用 **149个连接** 生成 **149 \* 20 = 2980个临时文件**里面包含我们的webshell。
* 然后,使用 **最后一个连接****暴力破解** 可能的文件。
***每秒10个请求** 的速度,时间为:
* 56800235584 / 2980 / 10 / 3600 ≈ **530小时**50%的机会在265小时
* 不带小数19770609664 / 2980 / 10 / 3600 ≈ 185小时50%的机会在93小时
2022-12-18 23:00:42 +00:00
{% hint style="warning" %}
注意,在上述示例中,我们 **完全DoS了其他客户端**
2022-12-18 23:00:42 +00:00
{% endhint %}
如果Apache服务器得到改进我们可以滥用 **4000个连接**(达到最大数量的一半)。我们可以创建 `3999*20 = 79980` **个文件**,那么 **数字** 将会 **减少** 到大约 **19.7小时****6.9小时**10小时3.5小时有50%的机会)。
2022-12-18 23:00:42 +00:00
## PHP-FMP
2022-12-19 15:21:53 +00:00
如果不使用常规的apache php模块来运行PHP脚本而是**网页正在使用** **PHP-FMP**(这提高了网页的效率,所以常见),还有其他方法可以改进这项技术。
2022-12-19 15:21:53 +00:00
PHP-FMP 允许在 **`/etc/php/<php-version>/fpm/pool.d/www.conf`** 中**配置**参数 **`request_terminate_timeout`**。\
这个参数指示 **请求到PHP必须终止** 的最大秒数(默认无限,但如果参数被取消注释,则为**30秒**。当PHP正在处理请求并达到指定的秒数时它会被 **终止**。这意味着,如果请求在上传临时文件时,因为 **php处理被停止**,那些 **文件不会被删除**。因此,如果你能让一个请求持续那么长时间,你就可以 **生成数千个不会被删除的临时文件**,这将 **加快找到它们的过程** 并减少因消耗所有连接而对平台造成DoS的可能性。
2022-12-19 15:21:53 +00:00
因此,为了 **避免DoS**,假设攻击者同时只使用 **100个连接**并且php最大处理时间由 **php-fmp**`request_terminate_timeout`**)** 设置为 **30秒**。因此,每秒可以生成的 **临时文件** 数量为 `100*20/30 = 66.67`
2022-12-19 15:21:53 +00:00
然后,攻击者需要:**`10000/66.67 = 150秒`** 来生成 **10000个文件**(生成 **100000个文件** 的时间将是 **25分钟**)。
2022-12-19 15:21:53 +00:00
然后,攻击者可以使用这 **100个连接** 来进行 **暴力破解搜索**。 \*\*\*\* 假设速度为每秒300个请求利用这个漏洞所需的时间如下
2022-12-19 15:21:53 +00:00
* 56800235584 / 10000 / 300 / 3600 ≈ **5.25小时**50%的机会在2.63小时)
* 有100000个文件56800235584 / 100000 / 300 / 3600 ≈ **0.525小时**50%的机会在0.263小时)
2022-12-19 15:21:53 +00:00
是的在EC2中等大小的实例上可以生成100000个临时文件
2022-12-19 16:08:19 +00:00
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (3).png" alt=""><figcaption></figcaption></figure>
2022-12-19 16:08:19 +00:00
{% hint style="warning" %}
注意,为了触发超时,**只需包含易受攻击的LFI页面**,这样它就会进入一个无限循环。
{% endhint %}
2022-12-18 23:00:42 +00:00
## Nginx
看起来默认情况下Nginx同时支持 **512个并行连接**(这个数字可以提高)。
<details>
<summary><strong>从零开始学习AWS黑客攻击直到成为专家通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong></strong></summary>
支持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来分享你的黑客技巧。
</details>