在Linux 容器中对php-fpm缓冲区溢出漏洞的复现分析 ( CVE-2019-11043 )

来源:岁月联盟 编辑:猪蛋儿 时间:2020-01-29

CVE-2019-11043是php-fpm中的一个缓冲区溢出漏洞,在某些情况下会导致远程执行。PHuiP-FPizdaM有一个针对某些nginx和php-fpm配置的漏洞复现测试,他们描述了如何使用Docker来测试此漏洞。
在本文中,我们使用LXD来测试漏洞并验证其是否真实有效。
当nginx配置为php-fpm以特定方式处理时,该漏洞很容易触发,Nextcloud的配置说明建议使用这种错误的配置方式。在本文中,我们尝试在不安装Nextcloud的情况下实现此漏洞的复现。
在下面创建了两个系统容器:vulnerable和hacker。在第一个容器中,我们根据漏洞利用页面的需要进行设置nginx和php-fpm(最新版本,仍然存在缓冲区溢出)并进行配置。在另一个容器中,我们针对第一个容器运行漏洞利用代码。
0x01 配置存在漏洞的容器环境
我们创建容器vulnerable并安装软件包nginx和php-fpm。php-fpm的版本必须是一个存在漏洞的版本。存在缓冲区溢出漏洞的版本是php-fpm-7.2.19-0ubuntu0.18.04.2。
http://security.ubuntu.com/ubuntu/pool/universe/p/php7.2/
 $ lxc launch ubuntu:18.04 vulnerable
 Creating vulnerable
 Starting vulnerable
 $ lxc exec vulnerable -- sudo --user ubuntu --login
 To run a command as administrator (user "root"), use "sudo ".
 See "man sudo_root" for details.
  ubuntu@vulnerable:~$ sudo apt update
 ...
 ubuntu@vulnerable:~$ sudo apt install -y nginx php-fpm
 ...
 ubuntu@vulnerable:~$ apt policy php-fpm
 php-fpm:
  Installed: 1:7.2+60ubuntu1
  Candidate: 1:7.2+60ubuntu1
  Version table:
 *** 1:7.2+60ubuntu1 500
        500 http://archive.ubuntu.com/ubuntu bionic/universe amd64 Packages
        100 /var/lib/dpkg/status
 ubuntu@vulnerable:~$ apt policy php7.2-fpm
 php7.2-fpm:
   Installed: 7.2.19-0ubuntu0.18.04.2
   Candidate: 7.2.19-0ubuntu0.18.04.2
   Version table:
  *** 7.2.19-0ubuntu0.18.04.2 500
         500 http://archive.ubuntu.com/ubuntu bionic-updates/universe amd64 Packages
         500 http://security.ubuntu.com/ubuntu bionic-security/universe amd64 Packages
         100 /var/lib/dpkg/status
      7.2.3-1ubuntu1 500
         500 http://archive.ubuntu.com/ubuntu bionic/universe amd64 Packages
 ubuntu@vulnerable:~$ logout
 $
给vulnerable为刚刚安装nginx和php-fpm的当前状态的容器拍摄快照。如果要重新开始测试,可以轻松切换回此状态。
在此处展示如何还原以及删除快照:
 $ lxc snapshot vulnerable stock-install
 $ lxc info vulnerable
 Name: vulnerable
 ...
 Snapshots:
    stock-install (taken at 2019/10/28 10:11 UTC) (stateless)
 $ lxc restore vulnerable stock-install
 $ lxc delete vulnerable/stock-install
默认情况下,php-fpm没有在nginx服务器(即虚拟主机)中启用,现在启用一下。首先尝试使用Ubuntu中的默认配置进行设置。以下是nginx中的默认网站配置,删除了所有不重要的内容,并启用了PHP支持。现在还尚未配置php-fpm为易受攻击状态。
 # 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 snippets/fastcgi-php.conf;
              fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
        }
 }
最后创建一个index.php并在其中添加一些简单的PHP。然后,我们验证PHP代码是否可以运行。要漏洞利用的话,我们还可以使用一个空的.php文件。
 ubuntu@vulnerable:~$ lxc exec vulnerable -- sudo --user ubuntu --login
 ubuntu@vulnerable:~$ echo "'; ?> " | sudo tee /var/www/html/index.php

[1] [2] [3]  下一页