Java程序远程调试
0x00 Jar包
针对Jar包的远程调试,就拿Behinder举例,首先IDEA新建一个项目,并在项目中创建一个lib文件夹,将Behinder的Jar包放入其中,右击该Jar包选择作为库添加(Add as Library…),对弹出的窗口点击OK。现在就能看到Behinder Jar包中反编译后的源码。
下一步,点击上图右上边的编辑配置(Add Configurations…),进入到如下窗口,单击左上角的+,选择Remote JVM Debug,修改下名称,其他默认保持不变,不过需要注意端口冲突,如下第二张图所示。
最后,将上图中的参数添加至运行命令中,不过需要注意的一点是将suspend参数值修改为y,它表示是否暂停程序等待调试器的连接。最终,使用如下命令将Behinder启动起来。
1 | # ls ~/SecTools/Behinder_v3.0_Beta_11.t00ls |
回到IDEA中,将断点打至如下行,再点击右上角Debug绿色按钮,便可对Behinder进行远程调试了。
0x01 虚拟机漏洞环境
一些漏洞环境需要我们自行搭建,将其安装在VMware虚拟机中,以方便本地对靶场进行漏洞复现。在这种情况下又该如何对其调试,下文以泛微Ecology为例,演示如何对虚拟机中的漏洞环境进行远程调试。
首先打开虚拟机,Ecology默认安装在C:\WEAVER\
路径下,Ecology使用的Web服务器为Resin,其配置文件路径位于C:\WEAVER\Resin\conf\resin.properties
,打开该文件并找到jvm_args
,添加如下内容,其中5005表示的是端口。
1 | -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005 |
注意:如果Web服务器使用的是Tomcat,那么只需将如下行添加至Tomcat配置文件中,配置文件位于
tomcat/bin/catalina.sh
,对于Linux,可能在/usr/local/
目录下;对于Windows,取决于用户自行存放的位置。
1 Java_OPTS="-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005"
保存更变,重启Resin服务。
接着,将虚拟机中Ecology的整个安装目录(C:\WEAVER\
)全部拷贝到宿主机系统中,并使用IDEA打开Ecology源码项目(C:\WEAVER\ecology
),同时IDEA中的Java版本要与虚拟机中的保持一致,初次打开项目会更新索引,需要等待一段时间。
在新增Run/Debug Configurations前,先安装Resin插件,之后在窗口左上角进行新增,选择Resin下的Remote,便出现如下配置界面,先修改Host为虚拟机IP地址,Port为5005调试端口。
对Application server进行如下配置。
转到Startup/Connection,将Debug下方的Port修改为5005端口,最后点击OK。
如上配置完毕后,便可以打断点了,将断点打到weaver.security.filter#SecurityMain
方法,使用浏览器访问一个URL,就可以进行调试了。
0x02 Docker容器靶场
譬如Vulhub这样的开源漏洞靶场,利用Docker一键启动漏洞靶场环境,省去了手动搭建环境的繁琐,极其地方便。下文以其中的Shiro CVE-2016-4437漏洞环境为例,介绍如何对Java类型的Docker容器靶场进行远程调试。
首先,该漏洞环境的源码其实就存放于Vulhub项目中的base目录,用IDEA打开base/shiro/1.2.4/code
目录中的项目,先在Project Structure中将JDK版本设置为8,接着新增Run/Debug Configurations。
Host填写靶场的IP,但不过由于是Docker容器,所以localhost也是可行的,Port填写一个不被占用的端口。JDK版本选择8,如上命令行参数在后续将会用到。
下一步,先在docker-compose.yml中新增一组暴露端口的配置,该端口将用于后续的远程调试通信。
1 | # cat docker-compose.yml |
然后,启动容器。
1 | # docker compose up -d |
进入容器,查看靶场环境的启动命令,如下PID为1的进程,正如开头对Behinder进行远程调试一样,都是一个Jar包启动的。
1 | # docker exec -it 5fa8722e9d13 /bin/bash |
这样我们可以继续修改docker-compose.yml文件,添加上边IDEA中的命令行参数(suspend参数值修改为y),在启动容器时替换默认的命令。修改后,重新启动容器即可。
1 | # cat docker-compose.yml |
接下来,还需配置依赖,先将容器中的Jar拷贝出来,并作为库添加。
1 | # docker cp c0475028d3b2:/shirodemo-1.0-SNAPSHOT.jar ../../base/shiro/1.2.4/code |
最后,在IDEA项目中创建一个lib目录,将shirodemo-1.0-SNAPSHOT.jar里BOOT-INF中的lib下所有文件拷贝至IDEA项目中的lib目录里面,并将拷贝出来的所有jar作为库添加。
至此,就可以打断点进行远程调试了。
0x03 WebLogic
WebLogic是一个Jave2E应用服务器,不同于Tomcat服务器那么地轻量。下文将以Vulhub中的CVE-2017-10271漏洞环境为例,展示如何对WebLogic进行配置以达到远程调试。
首先还是修改docker-compose.yml文件,新增一组暴露端口的配置,该8453端口为WebLogic默认的调试端口号。
1 | # cat docker-compose.yml |
启动并进入到容器中。
1 | # docker compose up -d |
修改WebLogic的setDomainEnv.sh文件,该文件位于/root/Oracle/Middleware/user_projects/domains/base_domain/bin/
目录下,在如下图中的位置添加如下两行内容。
1 | debugFlag="true" |
退出容器,并重新启动容器。
1 | # docker restart 2cec5c91ab51 |
再次进入容器,将/root/Oracle/Middleware目录下的modules文件夹和wlserver_10.3文件夹复制出来到一个新目录。
1 | # docker exec -it 2cec5c91ab51 /bin/bash |
使用IDEA打开source目录,并将modules文件夹与w1server_10.3/server/lib文件夹作为库添加。
新增如下Debug配置。
将断点打在wlserver_10.3/server/lib/weblogic.jar!/weblogic/wsee/jaxws/WLSServletAdapter#handle
方法,并点击Debug绿色按钮,使用浏览器访问http://127.0.0.1:7001/wls-wsat/CoordinatorPortType,如下图,成功进行调试。