JAVA漏洞分析常备IDEA 配置&调试手册
mieea 漏洞分析 1391浏览 · 2024-05-30 07:18

Configuration

自动格式化

REF: Intellij Idea 代码格式化/保存时自动格式化
preferences -> plugins中搜索两个插件进行下载:

  • google-java-format

有可能在IDEA中直接install会失败,可以尝试从插件Web页面进行跳转下载。

  • save actions

安装插件完成后,进行如下配置即可:

pom.xml导入

  1. 以ysoserial项目为例,将项目目录下的pom.xml拖动到IDEA应用上打开。
  2. 先和常规项目一样在proj structure中调整SDK。通常情况下此时就可以顺利Build,如果不行则go on。

  3. 在右边侧栏打开Maven,可以先尝试左3的按钮进行拉取,如果不行则前往Maven Settings。

  4. 勾选Automatically download,同时记得调整JDK。这样之后再刷新一下应该能Build了。

注意事项
20210824 - pom.xml再次飙红,突发奇想猜测是download的问题,把网络线路换一下就OK了。

pom.xml飙红

有时候虽然用了前面pom.xml的操作,但还是有部分爆红。一开始试图直接从网上下载jar然后直接把jar加到lib里,但识别会出问题。所以搜索后参考这篇文章直接手动安装本地maven依赖。
在网络上搜索groupId+artifactId+version,可以下载到jar包。例如我此次ysoserial有三个需要自己手动配置依赖的,搜到的对应下载地址:

在macOS,IDEA自带mvn位于如下路径:

/Applications/IntelliJ IDEA.app/Contents/plugins/maven/lib/maven3/bin

执行命令类似如下即可:

mvn install:install-file -DgroupId=javax.el -DartifactId=javax.el-api -Dversion=3.0.0 -Dpackaging=jar -Dfile=/Users/mieea/Documents/SecTools/javax.el-api-3.0.0.jar
mvn install:install-file -DgroupId=de.odysseus.juel -DartifactId=juel-impl -Dversion=2.2.7 -Dpackaging=jar -Dfile=/Users/mieea/Documents/SecTools/juel-impl-2.2.7.jar
mvn install:install-file -DgroupId=de.odysseus.juel -DartifactId=juel-api -Dversion=2.2.7 -Dpackaging=jar -Dfile=/Users/mieea/Documents/SecTools/juel-api-2.2.7.jar
  • -DgroupId对应为pom文件中的groupId
  • -DartifactId对应为pom文件中的artifactId
  • -Dversion对应为pom文件中的version
  • -Dpackaging导入包的类型是jar包的话就是jar
  • -Dfile你下载下来的jar包放的路径

运行命令后便可以在本地maven资源库中看到对应的jar包,然后重新执行mvn clean install编译打包即可。

Test导致Maven项目package失败

marshalsec项目package失败,根据左下方的报错发现编译过程是存在一些warning但无关紧要,测试用例产生的告警级别更高,似乎阻拦了项目最终package成jar。尝试把test目录下java文件全删除,成功package。

Maven打包

打包Jar

  1. maven-jar-plugin: This plugin provides the capability to build and sign JARs. But it just compiles the java files under src/main/java and src/main/resources/. It doesn't include the dependencies JAR files.
  2. maven-assembly-plugin: This plugin extracts all dependency JARs into raw classes and groups them together. It can also be used to build an executable JAR by specifying the main class. It works in project with less dependencies only; for large project with many dependencies, it will cause Java class names to conflict.
  3. maven-shade-plugin: It packages all dependencies into one uber-JAR. It can also be used to build an executable JAR by specifying the main class. This plugin is particularly useful as it merges content of specific files instead of overwriting them by relocating classes. This is needed when there are resource files that have the same name across the JARs and the plugin tries to package all the resource files together.

REF:https://stackoverflow.com/questions/38548271/difference-between-maven-plugins-assembly-plugins-jar-plugins-shaded-plugi

Debug

注意事项⚠️

调试断点时可能会看到variables debug info not available的提示。但现有的调试信息仍然有效。

注意在反序列化调试过程中,因为会经常性的在最终触发点下断点,然而可能因为项目本身或各种原因,该触发点可能会产生多次非预期的正常触发。此时不要惊慌,找一找可能就发现了目标断点栈。

计算表达式

  1. 项目下断点,Debug模式走到断点处。
  2. 上方菜单栏 - RUN - Debugging Actions - Evaluate Expression
  3. 计算任意表达式

变量哈希

REF:Tomcat中一种半通用回显方法
这里起的是一个spring boot,先试着往Controller里面注入一个response

为了确保我们获取到的response对象确实是tomcat的response,我们顺着堆栈一直往下。
可以发现request和response几乎就是一路传递的,并且在内存中都是同一个变量(变量toString最后的数字就是当前变量的部分哈希)

这样,就没有问题,只要我们能获取到这些堆栈中,任何一个类的response实例即可。

获取IDEA中jsp生成的java/class文件

运行时能在IDEA下方的Server输出中找到类似于这样的路径:

访问对应路径就能定位到项目运行时,jsp所生成的java和class文件了。

反编译Jar包神器java-decompiler.jar

运行命令示例:

/Applications/IntelliJ\ IDEA.app/Contents/jbr/Contents/Home/bin/java  -cp "/Applications/IntelliJ IDEA.app/Contents/plugins/java-decompiler/lib/java-decompiler.jar" org.jetbrains.java.decompiler.main.decompiler.ConsoleDecompiler -hdc=0 -dgs=1 -rsy=1 -rbr=1 -lit=1 -nls=1 -mpm=60 ./Behinder.jar ./behindersrc
  • java用的是IDEA内置的(保持与decomiler.jar的版本一致)
  • ./Behinder.jar 被反编译的jar包
  • ./behindersrc 输出反编译后jar包的路径,即还需要自己解压反编译后jar

注意使用和java-decompiler.jar相符的java版本,否则运行报错类似如下:

调试Jar包

参考官方tutorial即可:https://www.jetbrains.com/help/idea/tutorial-remote-debug.html#550a9ac1
实践示例如下:
将调试目标添加到Ext Libs中,此处我的调试目标是Behinder.jar。

需要注意的是,即使用java-decompiler.jar反编译了一套java源码出来,实际上调试断点还是在Ext Libs中的class文件。
调试配置如下:

然后以相同参数运行jar:

跑起来后就可以在IDEA中开Debug了。

字节码查看插件 - jclasslib Bytecode Viewer

REF:字节码增强技术探索
Install:https://plugins.jetbrains.com/plugin/9248-jclasslib-bytecode-viewer

ASM字节码辅助插件 - ASM Bytecode Outline

REF:字节码增强技术探索
Install:https://plugins.jetbrains.com/plugin/5918-asm-bytecode-outline

在当前项目+所有依赖中搜索指定类

command+o快捷键打开搜索窗口。
此技巧目前可用于快速查看EXP最终触发点的调用栈。

类继承关系图

XMLDecoder解析流程分析中发现了一个比较实用的trick,IDEA的绘图。

绘图方式:
Step 1. Show Diagram和Show Diagram Popup区别在于初始构图是否包含该类本身,不过这不太重要,即使不包含后面也能再添加到图中。

Step 2.一开始只有纯粹的类信息,可以在Show Categories中选择更多信息。

选择Show Implementations就可以在图中添加需要的类。

Step 3.更快捷地达到文章里面大图的效果可以先Collapse Nodes,再进行Expand Nodes。

效果如下:

快速定位抛出的异常原因


当Bug比较奇怪时,如果直接到mieea.memscan.agent.Agent.getSuspiciousClassesInfo(Agent.java:508)去思考可能想不明白。这时可以直接在抛出异常的类下断点,这样Bug的整个调用栈就很清晰。

针对Java Agent的调试方式

之前开发MemScanV1.0时发现一直无法调试以agentmain方式加载的Java Agent,这次联想到Arthas既然是支持agentmain方式加载,那么庞大的项目必然会涉及调试。于是找到了:Debug Arthas In IDEA,解决了问题。
其实和常规remote式的调试一致,但需要注意的是,通过idea调试参数启动的是被attach的java应用。

Tomcat & SpringBoot War 远程调试

需要注意的是,假如应用使用了 Spring 的 WebFlux 功能,那么是不支持 war 包部署的。

Spring Boot 项目打成 war 包部署,接口报 404 问题

@SpringBootApplication
public class AppQuickStart extends SpringBootServletInitializer {

    private static Logger logger = LoggerFactory.getLogger(AppQuickStart.class);

    public static void main(String[] args) {
        System.out.println(Thread.currentThread().getName());
        logger.info("app begin to start...");
        SpringApplication.run(AppQuickStart.class, args);
        logger.info("app start success...");
    }
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(AppQuickStart.class);
    }
}

Tomcat远程调试

(一开始一直想用tomcat的docker改一下配置即可,无奈总是失败。)
下载Ubuntu/CentOS(这里选用了CentOS7)的docker,根据选用的Tomcat版本,在容器中安装JDK与Tomcat。

修改/apache-tomcat-x.xx.xx/bin/catalina.sh的jpda配置部分:

if [ "$1" = "jpda" ] ; then
  if [ -z "$JPDA_TRANSPORT" ]; then
    JPDA_TRANSPORT="dt_socket"
  fi
  if [ -z "$JPDA_ADDRESS" ]; then
    JPDA_ADDRESS="0.0.0.0:5005"
  fi
  if [ -z "$JPDA_SUSPEND" ]; then
    JPDA_SUSPEND="n"
  fi
  if [ -z "$JPDA_OPTS" ]; then
    JPDA_OPTS="-agentlib:jdwp=transport=$JPDA_TRANSPORT,address=$JPDA_ADDRESS,server=y,suspend=$JPDA_SUSPEND"
  fi
  CATALINA_OPTS="$JPDA_OPTS $CATALINA_OPTS"
  shift
fi

正常来说只需要修改JPDA_ADDRESS,特别注意的是:

# 自定义端口
set JPDA_ADDRESS=localhost:8001
# 上面这种配置只能localhost访问,远程访问一般都不在自己的机器上,需要配置成:
set JPDA_ADDRESS=0.0.0.0:8001

(Linux下)然后启动:./catalina.sh jpda start
在IDEA添加Remote JVM Debug,配置如下:

此时已经可以正常远程调试 :D
REF:
Spring Boot 项目打成 war 包部署,接口报 404 问题
Intellij IDEA远程调试Tomcat和Spring Boot项目

Question

Maven - zip END header not found

Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project core: Compilation failure
error: error reading /Users/mieea/.m2/repository/commons-fileupload/commons-fileupload/1.3.1/commons-fileupload-1.3.1.jar; zip END header not found

直接删除repository下的commons-fileupload文件夹,让maven重新下载,即可解决。
REF:https://blog.csdn.net/nianbingsihan/article/details/87191076

0 条评论
某人
表情
可输入 255