0x00 Jar包

针对Jar包的远程调试,就拿Behinder举例,首先IDEA新建一个项目,并在项目中创建一个lib文件夹,将Behinder的Jar包放入其中,右击该Jar包选择作为库添加(Add as Library…),对弹出的窗口点击OK。现在就能看到Behinder Jar包中反编译后的源码。

下一步,点击上图右上边的编辑配置(Add Configurations…),进入到如下窗口,单击左上角的+,选择Remote JVM Debug,修改下名称,其他默认保持不变,不过需要注意端口冲突,如下第二张图所示。

最后,将上图中的参数添加至运行命令中,不过需要注意的一点是将suspend参数值修改为y,它表示是否暂停程序等待调试器的连接。最终,使用如下命令将Behinder启动起来。

1
2
3
4
# ls                                                                  ~/SecTools/Behinder_v3.0_Beta_11.t00ls
Behinder.jar data.db server 更新日志.txt
# java -jar -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005 Behinder.jar
Listening for transport dt_socket at address: 5005

回到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
2
3
4
5
6
7
8
# cat docker-compose.yml
version: '2'
services:
web:
image: vulhub/shiro:1.2.4
ports:
- "8080:8080"
- "5005:5005"

然后,启动容器。

1
# docker compose up -d

进入容器,查看靶场环境的启动命令,如下PID为1的进程,正如开头对Behinder进行远程调试一样,都是一个Jar包启动的。

1
2
3
4
5
6
# docker exec -it 5fa8722e9d13 /bin/bash
root@5fa8722e9d13:/# ps -ax
PID TTY STAT TIME COMMAND
1 ? Ssl 0:52 /usr/bin/java java -jar /shirodemo-1.0-SNAPSHOT.jar
40 pts/0 Ssl 0:00 /bin/bash /bin/bash
47 ? Rl+ 0:00 ps -ax

这样我们可以继续修改docker-compose.yml文件,添加上边IDEA中的命令行参数(suspend参数值修改为y),在启动容器时替换默认的命令。修改后,重新启动容器即可。

1
2
3
4
5
6
7
8
9
10
# cat docker-compose.yml
version: '2'
services:
web:
image: vulhub/shiro:1.2.4
ports:
- "8080:8080"
- "5005:5005"
command: /usr/bin/java -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005 -jar /shirodemo-1.0-SNAPSHOT.jar
# docker compose up -d

接下来,还需配置依赖,先将容器中的Jar拷贝出来,并作为库添加。

1
2
# docker cp c0475028d3b2:/shirodemo-1.0-SNAPSHOT.jar ../../base/shiro/1.2.4/code
Successfully copied 22.3MB to /Users/r00t/SEC/vulnEnv/vulhub/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
2
3
4
5
6
7
8
# cat docker-compose.yml
version: '2'
services:
weblogic:
image: vulhub/weblogic:10.3.6.0-2017
ports:
- "7001:7001"
- "8453:8453"

启动并进入到容器中。

1
2
3
4
5
6
# docker compose up -d
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2cec5c91ab51 vulhub/weblogic:10.3.6.0-2017 "startWebLogic.sh" 47 minutes ago Up 47 minutes 0.0.0.0:5005->5005/tcp, :::5005->5005/tcp, 0.0.0.0:7001->7001/tcp, :::7001->7001/tcp, 5556/tcp cve-2017-10271_weblogic_1
# docker exec -it 2cec5c91ab51 /bin/bash
root@2cec5c91ab51:~/Oracle/Middleware#

修改WebLogic的setDomainEnv.sh文件,该文件位于/root/Oracle/Middleware/user_projects/domains/base_domain/bin/目录下,在如下图中的位置添加如下两行内容。

1
2
debugFlag="true"
export debugFlag

退出容器,并重新启动容器。

1
2
# docker restart 2cec5c91ab51
2cec5c91ab51

再次进入容器,将/root/Oracle/Middleware目录下的modules文件夹和wlserver_10.3文件夹复制出来到一个新目录。

1
2
3
4
5
6
7
8
# docker exec -it 2cec5c91ab51 /bin/bash
root@2cec5c91ab51:~/Oracle/Middleware# tar -czvf modules.tar.gz modules/ && tar -czvf wlserver_10.3.tar.gz wlserver_10.3/
root@2cec5c91ab51:~/Oracle/Middleware# exit
# docker cp 2cec5c91ab51:/root/Oracle/Middleware/modules.tar.gz source/
# docker cp 2cec5c91ab51:/root/Oracle/Middleware/wlserver_10.3.tar.gz source/
# ls source/ && cd source/
modules.tar.gz wlserver_10.3.tar.gz
# tar -zxf modules.tar.gz && tar -zxf wlserver_10.3.tar.gz

使用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,如下图,成功进行调试。