冰蝎源码(Behinder)分析---代码审计
字数 1317 2025-08-29 22:41:10
冰蝎(Behinder)源码分析:Java字节码发送机制详解
1. JSP木马概述
JSP木马与常规的ASP、PHP木马不同,冰蝎(Behinder)和哥斯拉等工具采用发送Java字节码的方式,其中字节码中藏有恶意函数。
传统JSP木马特点:
- 直接包含Runtime、Process类和exec方法
- 容易被静态杀毒软件检测和查杀
主流JSP木马特点:
- 采用加载字节码的方式
- 虽然仍可能被杀毒软件检测,但免杀效果更好
- 是目前最常用的免杀方式
2. 冰蝎字节码发送机制
冰蝎连接后提供的功能包括:
- 基本信息获取
- 命令执行
- 文件管理
- 内网穿透等
这些功能的字节码来源于冰蝎源码中的payload/java目录。
3. 核心工具:Javassist
冰蝎使用Javassist库动态生成和修改Java字节码。
Javassist核心功能
- 动态生成类:在运行时创建新的Java类
- 修改现有类:修改已编译类的结构(添加/修改字段、方法)
- 代码注入:在方法调用前后注入代码(如添加日志记录)
- 动态代理:实现AOP(面向切面编程)
- 字节码分析:提取类的结构信息(类名、字段、方法等)
Javassist核心组件
- ClassPool:管理CtClass对象的容器,用于查找和修改类
- CtClass:表示一个Java类,用于操作类的结构
- CtMethod和CtField:分别表示类中的方法和字段
Javassist简单用法示例
// 创建ClassPool
ClassPool pool = ClassPool.getDefault();
// 创建新类
CtClass cc = pool.makeClass("HelloWorld");
// 添加方法
CtMethod method = CtNewMethod.make(
"public void sayHello() { System.out.println(\"Hello\"); }", cc);
cc.addMethod(method);
// 写入类文件
cc.writeFile();
4. 冰蝎字节码组装流程
Params.java中的组装流程
Params.java是Java字节码操作工具类的核心方法,通过组合传输协议和参数注入来动态生成类:
- 使用Javassist/CtClass和ASM框架修改字节码
- 支持加密协议处理和参数分块注入
- 生成随机类名混淆
- 实现缓存机制优化重复操作
- 返回处理后的类字节码用于动态加载执行
关键点:
- 函数返回结果是通过Javassist动态修改的类(如Cmd.java+加密函数)
- 返回byte类型可以直接加载修改的类
- 原始Cmd.java中没有加密函数,但通过此操作获得了有加密函数的Cmd实体类
5. 数据传输流程
Utils.java代码块
这是捕获的断点中看到的代码:
- JSP的payload就是通过Params类生成的字节(byte类型)
加密解密机制
冰蝎使用组装过的字节类的加密、解密函数:
- 采用ClassLoader方式
- 使用invoke方法动态调用
- 与原始冰蝎马使用相同的方式
CustomCryptor.java
实现Icrypt接口,处理加密解密功能。
6. 冰蝎Webshell工作原理
原始冰蝎Webshell也使用ClassLoader方式加载字节类:
- 解密函数的编写必须与传输协议一致
- 字节码通过POST传参传送给JSP
- 成功发送Java字节码
7. 总结
冰蝎实现Java字节码发送的关键技术:
- 使用Javassist库动态修改class
- 动态添加方法或变量
- 将动态创建的方法与原始payload的class组装
- 发送组装后的字节码给JSP执行
这种技术使得冰蝎能够绕过传统静态检测,实现更高级的Web攻击功能。