代码审计之远程调试方法介绍

释放双眼,带上耳机,听听看~!

前言

在做代码审计时,通常需要将源码运行起来,用于验证漏洞是否真实存在,通过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=5005 -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目标为本地项目源码,保存配置,在目标代码设置断点即可正常调试。

 

作者:海边的小米粥

2024年3月29日  

洞源实验室

给TA买糖
共{{data.count}}人
人已赞赏
行业热点

【虹科干货】长文预警!使用ntopng和NetFlow/IPFIX检测Dos攻击(上)

2024-4-3 10:04:54

行业热点

数智卫士应用全攻略之“复合两极”

2024-4-3 10:05:20

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索