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

2024-04-06 953 0

前言

在做代码审计时,通常需要将源码运行起来,用于验证漏洞是否真实存在,通过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日

洞源实验室


4A评测 - 免责申明

本站提供的一切软件、教程和内容信息仅限用于学习和研究目的。

不得将上述内容用于商业或者非法用途,否则一切后果请用户自负。

本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。

如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。敬请谅解!

程序来源网络,不确保不包含木马病毒等危险内容,请在确保安全的情况下或使用虚拟机使用。

侵权违规投诉邮箱:4ablog168#gmail.com(#换成@)

相关文章

办事处网络安全监控与事件响应;国外员工终端安全性怎么保障 | FB甲方群话题讨论
拿不下总统之位,那就用热加载拿下验证码识别与爆破好了!
Sooty:一款SoC分析一体化与自动化CLI工具
shiro CVE-2016-6802 路径绕过(越权)
Apache Solr 身份验证绕过漏洞(CVE-2024-45216)详解
llama_index的CVE-2024-4181漏洞根因分析

发布评论