介是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版本要大于等于1.13。以下面的命令执行: phuip-fpizdam [url] (假设你已经把 `$GOPATH/bin`变量丢到`$PATH`里去了,否则,要把路径打全),类似下面的输出就是正常了:
这之后呢,你就可以在任意的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发布 | 转载请注明出处 |
|