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

前言

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

洞源实验室

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/579001.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux:程序地址空间详解

目录 一、堆、栈、环境参数所在位置 二、进程地址空间底层实现原理 ​编辑 三、什么是地址空间 四、为什么要有进程地址空间 五、细谈写实拷贝的实现及意义 在C/C学习中,都学习过如上图所示的一套存储结构,我们大致知道一般存储空间分为堆区&#…

社交网络的未来:Facebook如何塑造数字社交的下一章

引言 社交网络已成为我们生活中不可或缺的一部分,而Facebook作为其领军者,一直在塑造着数字社交的未来。本文将深入探讨Facebook在未来如何塑造数字社交的下一章,并对社交网络的发展趋势进行展望和分析。 1. 引领虚拟社交的潮流 Facebook将…

建立一个简单的网页音乐盒模型效果#css#h5

“音乐盒”可以看做一个大盒子&#xff0c;用<div>标签进行定义。大盒子的上面为文本内容&#xff0c;可以在<div>标签中嵌套<h2>和<p>标签来实现&#xff1b;大盒子下面为图像&#xff0c;通过在<div>标签中嵌套<img/>标签来实现。 样式…

R语言实现——网状 Meta 分析

近来年&#xff0c;网状 Meta 分析相关研究不断涌现&#xff0c;此类研究不但能发表在国内各大核心期刊上&#xff0c;还能在SCI期刊甚至医学4大刊上看到其身影。随手在pubmed上面一搜索&#xff0c;就能得到一万多篇相关文献。俨然成为医学文献研究的“大杀器”&#xff01; P…

2024批量下载微博内容导出excel,数据包含微博链接,内容,点赞数,转发数,评论数,话题等

以歌手李健这个号为例&#xff0c;共抓取727条微博&#xff0c;导出的excel微博数据包含微博链接,微博正文,原始图片链接,被转发微博原始图片链接,是否为原创微博,微博视频链接,发布位置,发布时间,发布工具,点赞数,转发数,评论数,话题等 第一条微博发布于2010年5月31 。 再根据…

C++进阶,手把手带你学继承

&#x1fa90;&#x1fa90;&#x1fa90;欢迎来到程序员餐厅&#x1f4ab;&#x1f4ab;&#x1f4ab; 主厨&#xff1a;邪王真眼 主厨的主页&#xff1a;Chef‘s blog 所属专栏&#xff1a;c大冒险 总有光环在陨落&#xff0c;总有新星在闪烁 【本节目标】 1.继…

《HelloGitHub》第 96 期

兴趣是最好的老师&#xff0c;HelloGitHub 让你对编程感兴趣&#xff01; 简介 HelloGitHub 分享 GitHub 上有趣、入门级的开源项目。 https://github.com/521xueweihan/HelloGitHub 这里有实战项目、入门教程、黑科技、开源书籍、大厂开源项目等&#xff0c;涵盖多种编程语言 …

vue中使用图片url直接下载图片

vue中使用图片url直接下载图片 // 下载图片downloadByBlob(url, name) {let image new Image()image.setAttribute(crossOrigin, anonymous)image.src urlimage.onload () > {let canvas document.createElement(canvas)canvas.width image.widthcanvas.height image…

如何在 Linux 中查找命令的执行时间

在 Linux 操作系统中&#xff0c;查找命令的执行时间对于优化系统性能、调试程序以及评估脚本效率至关重要。本文将介绍几种方法来准确地测量命令的执行时间。 使用时间命令 时间命令&#xff08;time&#xff09;是一个内置的 shell 命令&#xff0c;用于测量其他命令或程序的…

谷歌浏览器如何查看HTTP版本

在谷歌浏览器中查看HTTP版本&#xff0c;你可以按照以下步骤操作&#xff1a; 首先&#xff0c;你需要打开谷歌浏览器&#xff0c;然后访问你想要查看HTTP版本的网页&#xff1b; 在页面上&#xff0c;按下F12键或右键点击页面任意位置&#xff0c;选择 “检查”&#xff08;I…

Leetcode 剑指 Offer II 071.按权重随机选择

题目难度: 中等 原题链接 今天继续更新 Leetcode 的剑指 Offer&#xff08;专项突击版&#xff09;系列, 大家在公众号 算法精选 里回复 剑指offer2 就能看到该系列当前连载的所有文章了, 记得关注哦~ 题目描述 给定一个正整数数组 w &#xff0c;其中 w[i] 代表下标 i 的权重…

基于java+springboot+vue实现的电商个性化推荐系统(文末源码+Lw+ppt)23-389

摘 要 伴随着我国社会的发展&#xff0c;人民生活质量日益提高。于是对电商个性化推荐进行规范而严格是十分有必要的&#xff0c;所以许许多多的信息管理系统应运而生。此时单靠人力应对这些事务就显得有些力不从心了。所以本论文将设计一套电商个性化推荐系统&#xff0c;帮…