7.2 KiB
通过永久等待实现LFI2RCE
☁️ HackTricks云 ☁️ -🐦 推特 🐦 - 🎙️ Twitch 🎙️ - 🎥 YouTube 🎥
- 你在一家网络安全公司工作吗?想要在HackTricks中看到你的公司广告吗?或者你想要获取PEASS的最新版本或下载PDF格式的HackTricks吗?请查看订阅计划!
- 发现我们的独家NFTs收藏品——The PEASS Family
- 获取官方PEASS和HackTricks周边产品
- 加入💬 Discord群组或电报群组,或者关注我在Twitter上的🐦@carlospolopm。
- 通过向hacktricks repo 和hacktricks-cloud repo 提交PR来分享你的黑客技巧。
基本信息
默认情况下,当一个文件被上传到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容器中不可用...)。
尝试调用它:
php -a # open php cli
include("/sys/kernel/security/apparmor/revision");
Apache2
默认情况下,Apache支持150个并发连接,根据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。
默认情况下,(根据我的测试),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个临时文件:
{% hint style="warning" %} 请注意,为了触发超时,只需包含易受攻击的LFI页面,使其进入无限包含循环。 {% endhint %}
Nginx
默认情况下,Nginx支持512个并行连接(此数字可以改进)。