JDWP 是 Java Debug Wire Protocol 的缩写,在JPDA(Java Platform Debugger Architecture)中,它定义了调试器(debugger)和被调试的 Java 虚拟机(target vm)之间的通信协议。
与PHP的 Xdebug
类似,当其调试端口直接开放在公网上时,很容易被攻击者攻击并且获取系统权限。
JDWP:https://docs.oracle.com/en/java/javase/11/docs/specs/jdwp/jdwp-protocol.html
JDPA:https://docs.oracle.com/en/java/javase/11/docs/specs/jpda/architecture.html
具体协议标准请参照:
https://www.ibm.com/developerworks/cn/java/j-lo-jpda1/index.html?ca=drs-
JDWP并无固定的端口,当未指定调试端口时,则会随机指定一个空闲端口。
启动JDWP参数:
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000 -jar spring-boot-demo-helloworld.jarnmap
nmap -sT 192.168.0.100 -p8000 -sV
测试了一下,并不是特别的精准,需要扫描多次。
通过握手包特征字符串 JDWP-Handshake
,可以使Masscan识别特定服务。
规则配置文件:
https://github.com/IOActive/jdwp-shellifier/blob/master/jdwp-masscan.cfg
默认为扫全球,并且限定了端口,请自行修改。
demo(python2):
import socket client = socket.socket() client.connect(("192.168.0.100", 8000)) client.send("JDWP-Handshake") if client.recv(14)=="JDWP-Handshake": print "[*] Detected JDWP service" client.close()
项目地址:
https://github.com/IOActive/jdwp-shellifier
作者通过编写了一个JDI(JDWP客户端),通过下断点的方式,获得线程上下文从而调用方法执行命令。
具体实现:http://blog.ioactive.com/2014/04/hacking-java-debug-wire-protocol-or-how.html
优点: 轻量,容易集成到扫描器中
缺点: 使用下断点的方式执行命令,需要猜测调用的方法,并且需要等待直到触发击中断点。
与jdwp-shellifier不同,这个exp的作者想到了更为直接的办法:直接去sleeping的线程,下发单步指令,然后就可以断下来了...具体原理我也没有太弄清楚。
优点: 更为通用,不用猜测调用方法以及等待
缺点: 依赖metasploit框架,直接上传msf木马而不是执行命令,容易被发现。
java debugger,随JDK安装。
远程attach调试:
jdb -attach 192.168.0.100:8000
利用方式, 这里直接使用msf中exp的姿势:
threads
命令查看所有线程,查找sleeping的线程thread 线程id
命令优点: 非常直接,简单的利用
缺点: 不容易集成
通过学习以上几种利用方式,通过抓包分析、学习协议,结合jdwp-shellifier中实现的JDWP-CLIENT,非常容易重现msf的exp,实现轻量方便的利用。
项目地址:
https://github.com/Lz1y/jdwp-shellifier
可以发现原版脚本执行,断点一旦没有猜中,给我们的就是无尽的等待,修改后的脚本则可以实时的得到反馈。
此文章主要还是利用层面占比较重。在原理方面,文中的链接已经说明非常清晰了,没有必要在复述一遍。