mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-23 21:24:06 +00:00
107 lines
7.2 KiB
Markdown
107 lines
7.2 KiB
Markdown
# 通过永久等待实现LFI2RCE
|
||
|
||
<details>
|
||
|
||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks云 ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 推特 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 YouTube 🎥</strong></a></summary>
|
||
|
||
* 你在一家**网络安全公司**工作吗?想要在HackTricks中看到你的**公司广告**吗?或者你想要**获取PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||
* 发现我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品——[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
|
||
* 获取[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
|
||
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f)或[**电报群组**](https://t.me/peass),或者**关注**我在**Twitter**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
|
||
* **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享你的黑客技巧。**
|
||
|
||
</details>
|
||
|
||
## 基本信息
|
||
|
||
默认情况下,当一个文件被上传到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永不结束,我们将有足够的时间来暴力破解已上传的文件并找到其中的任何一个。
|
||
|
||
这种技术的优点包括:
|
||
|
||
* 您只需要控制包含语句中的相对路径
|
||
* 不需要nginx或意外级别的访问来记录文件
|
||
* 不需要零日漏洞来导致分段错误
|
||
* 不需要路径泄露
|
||
|
||
这种技术的主要问题包括:
|
||
|
||
* 需要特定的文件存在(可能还有更多)
|
||
* 潜在文件名的数量巨大:56800235584
|
||
* 如果服务器不使用数字,则总潜在数量为:19770609664
|
||
* 默认情况下,每个请求只能上传20个文件。
|
||
* 使用的服务器的最大并行工作进程数。
|
||
* 这些限制可能导致攻击持续时间过长
|
||
* PHP请求的超时时间。理想情况下,这应该是永久的,或者应该在不删除临时上传文件的情况下终止PHP进程,否则这也将是一个问题。
|
||
|
||
那么,如何使PHP包含永不结束呢?只需包含文件`/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" %}
|
||
请注意,在上面的示例中,我们正在**完全拒绝为其他客户端提供服务**!
|
||
{% endhint %}
|
||
|
||
如果Apache服务器得到改进,我们可以滥用**4000个连接**(接近最大连接数的一半)。我们可以创建`3999*20 = 79980`个**文件**,这将**减少**时间到约**19.7小时**或**6.9小时**(10小时,3.5小时50%的概率)。
|
||
|
||
## PHP-FPM
|
||
|
||
如果网页使用的是**PHP-FPM**而不是常规的Apache php模块来运行PHP脚本(这可以提高网页的效率,所以很常见),还可以采取其他措施来改进技术。
|
||
|
||
PHP-FPM允许在**`/etc/php/<php-version>/fpm/pool.d/www.conf`**中配置**`request_terminate_timeout`**参数。\
|
||
此参数指示**请求到达PHP后必须终止的最大秒数**(默认为无限,但如果取消注释,则为30秒)。当请求被PHP处理的时间达到指定的秒数时,它将被**终止**。这意味着,如果请求正在上传临时文件,由于**PHP处理被停止**,这些**文件将不会被删除**。因此,如果您可以使请求持续那么长时间,您可以**生成数千个不会被删除的临时文件**,这将**加快找到它们的过程**,并降低通过消耗所有连接来消耗平台的DoS的概率。
|
||
|
||
因此,为了**避免DoS**,假设攻击者一次只使用**100个连接**,而php-fpm的最大处理时间(`request_terminate_timeout`)为**30秒**。因此,每秒可以生成的**临时文件数**为`100*20/30 = 66.67`。
|
||
|
||
然后,要生成**10000个文件**,攻击者需要:**`10000/66.67 = 150秒`**(要生成**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个临时文件:
|
||
|
||
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (3).png" alt=""><figcaption></figcaption></figure>
|
||
|
||
{% hint style="warning" %}
|
||
请注意,为了触发超时,**只需包含易受攻击的LFI页面**,使其进入无限包含循环。
|
||
{% endhint %}
|
||
|
||
## Nginx
|
||
|
||
默认情况下,Nginx支持**512个并行连接**(此数字可以改进)。
|