2024-01-01 18:40:45 +00:00
# LFI2RCE 通过永久等待
2022-12-18 23:00:42 +00:00
< details >
2024-01-01 18:40:45 +00:00
< 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
2024-01-01 18:40:45 +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
2024-01-01 18:40:45 +00:00
默认情况下,当文件被上传到 PHP( 即使它没有预期到) , 它会在 `/tmp` 中生成一个临时文件,名称类似于 ** `php[a-zA-Z0-9]{6}` **,尽管我见过一些 docker 镜像生成的文件中不包含数字。
2022-12-18 23:00:42 +00:00
2024-01-01 18:40:45 +00:00
在本地文件包含中,**如果你设法包含了那个上传的文件,你将获得 RCE**。
2022-12-18 23:00:42 +00:00
2024-01-01 18:40:45 +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
```
2024-01-01 18:40:45 +00:00
也就是说,**潜在文件名的数量是 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
2024-01-01 18:40:45 +00:00
其他技术依赖于攻击 PHP 协议(如果您只能控制路径的最后一部分,您将无法做到),泄露文件路径,滥用预期文件,或者**让 PHP 遭受段错误,以便不会删除上传的临时文件**。\
这项技术与上一项**非常相似,但不需要找到零日漏洞**。
2022-12-18 23:00:42 +00:00
2024-01-01 18:40:45 +00:00
### 永恒等待技术
2022-12-18 23:00:42 +00:00
2024-01-01 18:40:45 +00:00
在这项技术中,**我们只需要控制相对路径**。如果我们设法上传文件并使得**LFI 永无止境**,我们将有“足够的时间”来**暴力破解上传的文件**并**找到**任何上传的文件。
2022-12-18 23:00:42 +00:00
2024-01-01 18:40:45 +00:00
**这项技术的优点**:
2022-12-19 15:21:53 +00:00
2024-01-01 18:40:45 +00:00
* 您只需要控制 include 内的相对路径
* 不需要 nginx 或对日志文件的意外访问级别
* 不需要 0 day 来引起段错误
2023-08-03 19:12:22 +00:00
* 不需要路径泄露
2022-12-19 15:21:53 +00:00
2024-01-01 18:40:45 +00:00
这项技术的**主要问题**是:
2022-12-18 23:00:42 +00:00
2023-08-03 19:12:22 +00:00
* 需要特定的文件存在(可能还有更多)
2024-01-01 18:40:45 +00:00
* 潜在文件名的**疯狂**数量:**56800235584**
* 如果服务器**不使用数字**,总潜在数量是:**19770609664**
* 默认情况下,**单个请求**中只能上传**20个文件**。
* 服务器使用的**最大并行工作数**。
* 这个限制加上前面的限制可能会导致这种攻击持续太久
* **PHP 请求的超时时间**。理想情况下,这应该是永久的,或者应该在不删除临时上传文件的情况下终止 PHP 进程,否则,这也将是一个问题
2022-12-19 15:21:53 +00:00
2024-01-01 18:40:45 +00:00
那么,您如何**让 PHP include 永无止境**?只需包含文件**`/sys/kernel/security/apparmor/revision`**(不幸的是**不适用于 Docker 容器**...)。
2022-12-19 15:21:53 +00:00
2024-01-01 18:40:45 +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
2024-01-01 18:40:45 +00:00
默认情况下, 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
2024-01-01 18:40:45 +00:00
默认情况下(根据我的测试),**PHP进程可以无限期运行**。
2022-12-18 23:00:42 +00:00
2024-01-01 18:40:45 +00:00
我们来做些计算:
2022-12-18 23:00:42 +00:00
2024-01-01 18:40:45 +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" %}
2024-01-01 18:40:45 +00:00
注意,在上述示例中,我们 **完全DoS了其他客户端** !
2022-12-18 23:00:42 +00:00
{% endhint %}
2024-01-01 18:40:45 +00:00
如果Apache服务器得到改进, 我们可以滥用 **4000个连接** (达到最大数量的一半)。我们可以创建 `3999*20 = 79980` **个文件** ,那么 **数字** 将会 **减少** 到大约 **19.7小时** 或 **6.9小时** ( 10小时, 3.5小时有50%的机会)。
2022-12-18 23:00:42 +00:00
2024-01-01 18:40:45 +00:00
## PHP-FMP
2022-12-19 15:21:53 +00:00
2024-01-01 18:40:45 +00:00
如果不使用常规的apache php模块来运行PHP脚本, 而是**网页正在使用** **PHP-FMP** (这提高了网页的效率,所以常见),还有其他方法可以改进这项技术。
2022-12-19 15:21:53 +00:00
2024-01-01 18:40:45 +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
2024-01-01 18:40:45 +00:00
因此,为了 **避免DoS** ,假设攻击者同时只使用 **100个连接** , 并且php最大处理时间由 **php-fmp** ( `request_terminate_timeout`**)** 设置为 **30秒** 。因此,每秒可以生成的 **临时文件** 数量为 `100*20/30 = 66.67` 。
2022-12-19 15:21:53 +00:00
2024-01-01 18:40:45 +00:00
然后,攻击者需要:**`10000/66.67 = 150秒`** 来生成 **10000个文件** (生成 **100000个文件** 的时间将是 **25分钟** )。
2022-12-19 15:21:53 +00:00
2024-01-01 18:40:45 +00:00
然后,攻击者可以使用这 **100个连接** 来进行 **暴力破解搜索** 。 \*\*\*\* 假设速度为每秒300个请求, 利用这个漏洞所需的时间如下:
2022-12-19 15:21:53 +00:00
2024-01-01 18:40:45 +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
2024-01-01 18:40:45 +00:00
是的, 在EC2中等大小的实例上可以生成100000个临时文件:
2022-12-19 16:08:19 +00:00
2023-05-12 14:33:51 +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
2023-03-30 22:05:38 +00:00
{% hint style="warning" %}
2024-01-01 18:40:45 +00:00
注意,为了触发超时,**只需包含易受攻击的LFI页面**,这样它就会进入一个无限循环。
2023-03-30 22:05:38 +00:00
{% endhint %}
2022-12-18 23:00:42 +00:00
## Nginx
2024-01-01 18:40:45 +00:00
看起来默认情况下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 >