背景:ActiveMQ是Apache软件基金会所研发开源的消息中间件。Apache ActiveMQ 5.13.0之前5.x版本中存在安全漏洞,该漏洞源于程序没有限制可在代理中序列化的类。远程攻击者可借助特制的序列化的Java Message Service(JMS)ObjectMessage对象利用该漏洞执行任意代码。
一、准备工作
1.首先需要进入到目录下/vulhub/activemq/CVE-2015-5254,然后启动docker-compose up -d。
之后就开始下载环境。这里下载的activemq版本为5.11.1。
2.环境运行后,将监听61616和8161两个端口。其中61616是工作端口,消息在这个端口进行传递;8161是Web管理页面端口。访问http://your-ip:8161
即可看到web管理页面,不过这个漏洞理论上是不需要web(因为可以通过web查看,也可在服务器上查看生成的文件)。
3.activemq查看版本的路径:http://IP:8161/admin/index.jsp?printable=true
登录后台,路径:http://IP:8161/admin/browse.jsp?JMSDestination=event(登录后台时需要输入用户名密码,默认是admin/admin,之前测试遇到过这样的弹窗,那时还不知道是activemq中间件,今日新知识get)
二、复现(基础)
漏洞利用过程如下:
①构造(可以使用ysoserial)可执行命令的序列化对象;
②作为一个消息,发送给目标61616端口;
③访问web管理页面,读取消息,触发漏洞。
1.官方教程推荐使用jmet复现,因为jmet集成了ysoserial(ysoserial是一款java反序列化利用工具),也集成了其他工具。
2.jmet原理是使用ysoserial生成Payload并发送(其jar内自带ysoserial,无需再自己下载),所以我们需要在ysoserial是gadget中选择一个可以使用的,比如ROME。jmet工具下载地址:https://github.com/matthiaskaiser/jmet/releases/download/0.1.0/jmet-0.1.0-all.jar
3..工具下载完之后,要创建一个external文件夹,与jmet-0.1.0-all.jar放在同一个文件夹下,否则执行过程中可能会爆文件夹不存在的错误。
4.执行命令,可以利用kali虚拟机,也可利用windows物理机。我都试了。
java -jar jmet-0.1.0-all.jar -Q event -I ActiveMQ -s -Y "touch /tmp/success" -Yp ROME 10.155.0.137 61616
命令解释:-Q指定队列消息名(Queues-name中的显示);
-I选择要装载的JMS客户端,这里是ActiveMQ,就是对谁进行操作;
-s是选择ysoserial payload,-Y指定具体的命令(这里是创建一个文件夹);
-Yp指定payload类型,选择的是ROME,其后是ActiveMQ所在机器的ip及工作端口 。
所以这条命令是选择ysoserial工具,使用ROME payload把 touch /success 命令序列化后作为名为event的消息发送给ActiveMQ(对于命令的解释参考自博客https://blog.csdn.net/kinnisoy/article/details/127490168)
windows执行过程:
kali执行过程:
5.执行完成后,web页面可以看到消息列表,数量显示4,是因为我执行了4次。
6.另一种验证方式是,靶机上查看success文件是否被成功创建,成功创建就是利用成功了。第一次去查看时,没有创建的success文件,我以为有延迟,其实是需要人为点击web页面消息后,该命令才会被触发。(利用过程第三步有说明,是我没看仔细,又暴露我自身的一个问题,要好好看教程,要仔细呀!!!)
进入靶机漏洞目录,执行docker compose exec activemq bash,进入tmp文件夹,查看相应文件是否创建成功。