前言
在做代码审计时,通常需要将源码运行起来,用于验证漏洞是否真实存在,通过debug可以更加直观的观察程序的运行细节,可以比较快的确认有效漏洞,debug也是开发人员在代码调试测试阶段经常用到的方法。但源码开始运行前的编译阶段有时候不会很顺利,比如缺少依赖、组件版本不兼容、数据库连接异常等等,对于大型项目,通常还要配置多个中间件提供各项基础功能,要搭建好一个稳定运行的系统往往需要一定时间成本,本文主要介绍几类debug的远程方案,减少审计人员在环境搭建上投入的精力。
dokcer远程调试
不修改配置文件的调试
**1、**用docker远程debug是个省事的选择,节省了环境部署准备的时间,这一小节主要介绍不修改容器配置文件的一般调试方法。
**2、**以dataease这个数据可视化分析工具为例, docker部署后在Inspect找到已经编译好的完整jar包,导出保存这个jar文件。
**3、**在IDEA新建java项目将jar添加到依赖中,解压jar包放到项目根目录,然后右键BOOT-INF下的lib目录选择Add as Library将这些jar全部添加到依赖中。
**4、**将要调试的class文件夹添加到依赖关系中,这里就是BOOT-INF目录下的所有文件。
**5、**在idea配置调试环境,添加一个“Remote JVM Debug”,配置端口,选择对应jdk版本,添加项目类文件。
**6、**复制要调试的jar包的docker启动命令。
**7、**在复制好的docker启动参数末尾追加如下参数:-jar后面的jar包路径就是第一步中得到的docker中jar包的路径,
`java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=500``5 -jar /opt/apps/backend-1.18.4.jar`
ps:原始docker命令中jar文件路径前带了—env参数名,我们调试的时候使用的是java -jar命令,java命令没有—env这样的参数名,把“--env=JAVA_APP_JAR=”这部分字符串删掉就行。
**8、**在复制好的docker启动参数后追加如下参数:通过5005端口进行调试通信
-p 127.0.0.1:5005:5005。
**9、**如果是Windows环境,可以使用追加了参数的docker命令从的WSL unubtu终端启动docker镜像;MAC则直接在命令行执行即可。
**10、**如果有源码,也可以像第6步中一样,直接在idea设置debug后,也可以正常debug。
**11、**如果只是对jar文件进行远程调试,步骤和上面基本一致,区别在于docker中的应用使用docker命令启动,本地的jar文件使用java命令启动,在命令行运行jar文件时追加IDEA中的jvm调试参数即可。
修改配置文件的调试
在docker远程调试时,部分项目需要修改容器内的配置文件,我们以elasticsearch的docker远程调试为例,介绍这种类型的调试方法:
**1、**调试elasticsearch,IDEA的debug配置要用大于JDK9的参数。
**2、**在DockerDesktop中,找到elasticsearch容器实例的/usr/share/elasticsearch/config/jvm.options这个配置文件,在最后一行添加上一步IDEA中的jvm调试参数。
**3、**在elasticsearch容器实例启动的docker参数中增加端口转发的参数。-p 5005:5005将docker容器实例中的jvm的debug端口5005转发给物理机中IDEA监听的5005端口,这也是调试docker中应用程序的通用方法,需要将容器内部的调试端口转发给物理机监听调试的端口,让二者可以正常通信:
docker run --name elasticsearch --net elastic -p 9200:9200 -p 9300:9300 -p 5005:5005 -e "discovery.type=single-node" -t docker.elastic.co/elasticsearch/elasticsearch:8.10.2
**4、**然后就可以给IDEA中的目标代码设置断点,当elasticsearch容器实例启动后就可以顺利调试elasticsearch源码。
Vscode远程调试
**1、**首先在vscode的插件市场下载Remote SSH这个插件。
**2、**新建一个远程连接,连接到远程服务器,输入服务器连接地址和密码。
**3、**连接后打开服务器要调试的项目代码所在目录。
**4、**在目标代码设置断点,选中调试按钮。
**5、**创建launch.json文件,以python项目为例,需要在launch.json文件中设置python解释器的路径。
**6、**此时切换回要调试的源码标签页,再次点击调试按钮,即可正常调试。
GoLand远程调试
1、 GoLand是 jetbrains发布的具备强大功能的go集成开发环境,调试前,在本地准备一份和服务器上的可执行文件对应的源码,首先在 GoLand 中选择Run ->Edit Configurations。
**2、**点击 +,选择 Go Remote。
**3、**Host使用远程服务器的ip,Port可以保持默认值。
**4、**go开发中,一般使用dlv来完成远程调试,在远程服务器安装dlv:https://github.com/go-delve/delve
**5、**在本地源码设置断点,使用dlv启动服务器上使用该源码编译好的可执行文件,触发断点,即可正常debug
dlv --listen=:2345 --headless=true --api-version=2 --accept-multiclient exec ./demo.exe
Eclipse远程调试
Eclipse是著名的跨平台集成开发环境(IDE)。主要用来Java语言开发,通过插件也可以支持C++和Python的开发:
1、 远程服务器部署的是编译好的war包,在Eclipse中准备一份跟服务器war包对应的项目源代码。根据业务需要开启远程服务器端口,如8080,8000,9988:运行命令iptables -I INPUT -p tcp --dport 8080 -j ACCEPT
**2、**启动tomcat服务器前,在tomcat安装目录的bin目录下,在catalina.sh文件最后一行新增如下jvm参数用于调试端口通信
JAVA_OPTS="$JAVA_OPTS -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=6666"
**3、**运行startup.sh启动tomcat
**4、**在Eclipse中配置远程调试参数,依次选择debug-Debug Configurations-Java Application-Remote Java Application
**5、**填入远程服务器地址端口,选择debug目标为本地项目源码,保存配置,在目标代码设置断点即可正常调试。