freeBuf
主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

代码审计之远程调试方法介绍
洞源实验室 2024-03-29 18:01:28 214174

前言

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

洞源实验室

# 漏洞分析
本文为 洞源实验室 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
洞源实验室 LV.6
洞察漏洞之源/Insight Bugs
  • 75 文章数
  • 45 关注者
从何同学视频看开源协议的重要性
2024-11-26
从何同学视频看开源协议的重要性
2024-11-26
大语言模型安全,到底是什么的安全
2024-11-11
文章目录