JDWP

JDWP 是 Java Debug Wire Protocol 的缩写,在JPDA(Java Platform Debugger Architecture)中,它定义了调试器(debugger)和被调试的 Java 虚拟机(target vm)之间的通信协议。

8880b23d1d04d4d8ef128ca20826bbe6.png

与PHP的 Xdebug 类似,当其调试端口直接开放在公网上时,很容易被攻击者攻击并且获取系统权限。

Useful link:

探测 JDWP 服务

JDWP并无固定的端口,当未指定调试端口时,则会随机指定一个空闲端口。

启动JDWP参数:

java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000 -jar spring-boot-demo-helloworld.jar

nmap

nmap -sT 192.168.0.100 -p8000 -sV

测试了一下,并不是特别的精准,需要扫描多次。

0b61b7e0b8025a090e19375aef6d4fb8.png

Masscan

默认为扫全球,并且限定了端口,请自行修改。

自实现

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()

0ba3c27c16ad56bdf6cd633653bf6878.png

漏洞利用

jdwp-shellifier

优点: 轻量,容易集成到扫描器中

缺点: 使用下断点的方式执行命令,需要猜测调用的方法,并且需要等待直到触发击中断点。

msf

与jdwp-shellifier不同,这个exp的作者想到了更为直接的办法:直接去sleeping的线程,下发单步指令,然后就可以断下来了...具体原理我也没有太弄清楚。

优点: 更为通用,不用猜测调用方法以及等待

缺点: 依赖metasploit框架,直接上传msf木马而不是执行命令,容易被发现。

jdb

java debugger,随JDK安装。

远程attach调试:

jdb -attach 192.168.0.100:8000

利用方式, 这里直接使用msf中exp的姿势:

attach远程地址

threads命令查看所有线程,查找sleeping的线程

thread 线程id命令

通过(print|dump|eval)命令,执行java表达式,从而达成命令执行

d032e99ac08df3f6d85ab94718d70423.png

优点: 非常直接,简单的利用

缺点: 不容易集成

自实现EXP

通过学习以上几种利用方式,通过抓包分析、学习协议,结合jdwp-shellifier中实现的JDWP-CLIENT,非常容易重现msf的exp,实现轻量方便的利用。

项目地址:

https://github.com/Lz1y/jdwp-shellifier

POC.gif?raw=true

可以发现原版脚本执行,断点一旦没有猜中,给我们的就是无尽的等待,修改后的脚本则可以实时的得到反馈。

文末

此文章主要还是利用层面占比较重。在原理方面,文中的链接已经说明非常清晰了,没有必要在复述一遍。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐