Java程序远程调试
Jar 包
针对 Jar 包的远程调试,就拿 Behinder 举例,首先 IDEA 新建一个项目,并在项目中创建一个 lib 文件夹,将 Behinder 的 Jar 包放入其中,右击该 Jar 包选择作为库添加(Add as Library…),对弹出的窗口点击 OK。现在就能看到 Behinder Jar 包中反编译后的源码。
下一步,点击上图右上边的编辑配置(Add Configurations…),进入到如下窗口,单击左上角的+,选择 Remote JVM Debug,修改下名称,其他默认保持不变,不过需要注意端口冲突,如下第二张图所示。
最后,将上图中的参数添加至运行命令中,不过需要注意的一点是将 suspend 参数值修改为 y,它表示是否暂停程序等待调试器的连接。最终,使用如下命令将 Behinder 启动起来。
1 | ls |
回到 IDEA 中,将断点打至如下行,再点击右上角 Debug 绿色按钮,便可对 Behinder 进行远程调试了。
虚拟机漏洞环境
一些漏洞环境需要我们自行搭建,将其安装在 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,就可以进行调试了。
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 作为库添加。
至此,就可以打断点进行远程调试了。
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,如下图,成功进行调试。