JDWP无依赖攻击
2020-03-05 10:41:00 Author: xz.aliyun.com(查看原文) 阅读量:482 收藏

JDWP

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

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

Useful link:

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并无固定的端口,当未指定调试端口时,则会随机指定一个空闲端口。

启动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
测试了一下,并不是特别的精准,需要扫描多次。

Masscan

通过握手包特征字符串 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()

漏洞利用

jdwp-shellifier

项目地址:
https://github.com/IOActive/jdwp-shellifier

作者通过编写了一个JDI(JDWP客户端),通过下断点的方式,获得线程上下文从而调用方法执行命令。
具体实现:http://blog.ioactive.com/2014/04/hacking-java-debug-wire-protocol-or-how.html

优点: 轻量,容易集成到扫描器中
缺点: 使用下断点的方式执行命令,需要猜测调用的方法,并且需要等待直到触发击中断点。

msf

项目地址:
https://github.com/rapid7/metasploit-framework/blob/master/modules/exploits/multi/misc/java_jdwp_debugger.rb

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

优点: 更为通用,不用猜测调用方法以及等待
缺点: 依赖metasploit框架,直接上传msf木马而不是执行命令,容易被发现。

jdb

java debugger,随JDK安装。
远程attach调试:
jdb -attach 192.168.0.100:8000

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

  1. attach远程地址
  2. threads命令查看所有线程,查找sleeping的线程
  3. thread 线程id命令
  4. 通过(print|dump|eval)命令,执行java表达式,从而达成命令执行

优点: 非常直接,简单的利用
缺点: 不容易集成

自实现EXP

通过学习以上几种利用方式,通过抓包分析、学习协议,结合jdwp-shellifier中实现的JDWP-CLIENT,非常容易重现msf的exp,实现轻量方便的利用。
项目地址:
https://github.com/Lz1y/jdwp-shellifier

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

文末

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


文章来源: http://xz.aliyun.com/t/7303
如有侵权请联系:admin#unsafe.sh