实战分析某红队魔改哥斯拉Webshell
字数 1247 2025-08-27 12:33:31

魔改哥斯拉WebShell实战分析与防御指南

一、样本概述

1.1 样本背景

  • 该样本是从某次红队演习中获取的WebShell
  • 基于Godzilla(哥斯拉)进行深度魔改
  • 通信流量未触发任何安全告警
  • 在免杀和绕过WAF/IDS方面表现优异

1.2 样本特征

  • JSP格式的WebShell
  • 使用多重编码混淆(Unicode、字节数组等)
  • 硬编码恶意类字节码(Base64编码)
  • 采用非传统加密方式的流量混淆
  • 利用com.sun.jmx.remote.util.OrderClassLoaders加载恶意类

二、技术分析

2.1 免杀实现机制

2.1.1 类加载机制

// 使用OrderClassLoaders而非自定义ClassLoader
Class PB = Class.forName("com.sun.jmx.remote.util.OrderClassLoaders");
java.lang.reflect.Constructor c = PB.getDeclaredConstructor(new Class[]{ClassLoader.class, ClassLoader.class});
c.setAccessible(true);
Object tadfasf = Thread.currentThread().getContextClassLoader();
Object d = c.newInstance(new Object[]{tadfasf, tadfasf});

// 反射调用defineClass方法
java.lang.reflect.Method lll = PB.getSuperclass().getDeclaredMethod("defineClass", 
    new Class[]{byte[].class, int.class, int.class});
lll.setAccessible(true);
Class zz = (Class) lll.invoke(d, new Object[]{var2, 0, var2.length});

2.1.2 混淆技术

  • 关键类名和方法名使用字节数组编码:
    new String(new byte[]{46, 115, 117, 110, 46, 111, 114, 103}) // ".sun.org"
    
  • 插入Unicode空白符混淆
  • 使用JSP标签而非纯Java代码

2.2 命令执行机制

2.2.1 执行流程

  1. 实例化恶意类
  2. 调用equals方法处理输入("解密"流量)
  3. 调用toString方法执行命令并返回结果("加密"响应)

2.2.2 核心恶意类方法

// 命令执行入口
public byte[] run() {
    String className = this.get("evalClassName");
    String methodName = this.get("methodName");
    
    if (methodName != null) {
        if (className == null) {
            // 直接调用方法
        } else {
            // 通过反射调用指定类的方法
            Class clazz = (Class) this.sessionMap.get(className);
            Object instance = clazz.newInstance();
            instance.equals(this.parameterMap);
            instance.toString();
            return (byte[]) this.parameterMap.get("result");
        }
    }
    return "method is null".getBytes();
}

2.3 流量混淆机制

2.3.1 请求处理流程

  1. 提取请求参数值
  2. 替换特定字符(如'm'→'%')
  3. URL解码
  4. 多层解码处理:
    // 字符替换
    todecode = todecode.replaceAll("b", "\n")
                      .replaceAll("a", "=")
                      .replaceAll("c", "&")
                      // ...其他替换规则
    
    // UU解码
    byte[] uu_tmp = Uudecode(todecode.getBytes());
    
    // Base64解码
    var1 = base64Decode((new String(uu_tmp)).substring(13));
    

2.3.2 响应处理流程

  1. 执行命令获取原始结果
  2. GZIP压缩结果
  3. 添加ZIP文件头(PK...)
  4. 通过输出流返回

2.4 通信示例

请求示例

POST /shell.jsp HTTP/1.1
Content-Type: application/x-www-form-urlencoded

password=test&action=login&token=abc123&data=begin+644+encoder.buf...

响应示例

HTTP/1.1 200 OK
Content-Disposition: attachment; filename=1621234567890.zip

PK...<GZIP压缩的命令结果>...

三、防御方案

3.1 检测方案

静态检测

  1. 检测异常JSP标签使用
  2. 识别多重编码特征(Base64+UUencode)
  3. 查找OrderClassLoaders的异常使用
  4. 检测硬编码的字节数组类名

动态检测

  1. 监控异常的defineClass调用
  2. 检测无加密但结构复杂的HTTP流量
  3. 分析异常的响应头(如伪造的ZIP文件)

3.2 防护建议

  1. 代码层面

    • 禁用危险的JSP标签
    • 限制反射操作权限
    • 监控ClassLoader的异常行为
  2. 网络层面

    • 深度解析HTTP参数(不只是键值对)
    • 检测异常的字符替换模式
    • 监控异常的Content-Disposition响应头
  3. 管理层面

    • 定期更新WebShell特征库
    • 加强文件上传检测
    • 实施严格的权限控制

四、技术总结

  1. 免杀创新点

    • 抛弃传统加密,采用多层编码混淆
    • 利用系统类OrderClassLoaders替代自定义ClassLoader
    • 多重编码混淆关键代码
  2. 流量隐蔽性

    • 模拟正常业务参数(password/token等)
    • 使用少见编码方式(UUencode)
    • 响应伪装成ZIP文件
  3. 对抗启示

    • 传统加密WebShell已可被有效检测
    • 编码混淆可能比加密更具隐蔽性
    • 安全设备需结合静态+动态+行为分析

五、附录

关键类结构

public class SimpleVer extends ClassLoader {
    // 核心方法
    public boolean equals(Object var1) { /* 处理输入 */ }
    public String toString() { /* 执行命令并返回 */ }
    public byte[] run() { /* 命令执行入口 */ }
    public void formatParameter() { /* 流量解码 */ }
    
    // 功能方法
    public byte[] getBasicsInfo() { /* 获取系统信息 */ }
    public byte[] include() { /* 动态加载类 */ }
    public static byte[] Uudecode() { /* UU解码 */ }
}

编码对照表

编码字符 实际字符
a =
b \n
c &
... ...
魔改哥斯拉WebShell实战分析与防御指南 一、样本概述 1.1 样本背景 该样本是从某次红队演习中获取的WebShell 基于Godzilla(哥斯拉)进行深度魔改 通信流量未触发任何安全告警 在免杀和绕过WAF/IDS方面表现优异 1.2 样本特征 JSP格式的WebShell 使用多重编码混淆(Unicode、字节数组等) 硬编码恶意类字节码(Base64编码) 采用非传统加密方式的流量混淆 利用 com.sun.jmx.remote.util.OrderClassLoaders 加载恶意类 二、技术分析 2.1 免杀实现机制 2.1.1 类加载机制 2.1.2 混淆技术 关键类名和方法名使用字节数组编码: 插入Unicode空白符混淆 使用JSP标签而非纯Java代码 2.2 命令执行机制 2.2.1 执行流程 实例化恶意类 调用 equals 方法处理输入("解密"流量) 调用 toString 方法执行命令并返回结果("加密"响应) 2.2.2 核心恶意类方法 2.3 流量混淆机制 2.3.1 请求处理流程 提取请求参数值 替换特定字符(如'm'→'%') URL解码 多层解码处理: 2.3.2 响应处理流程 执行命令获取原始结果 GZIP压缩结果 添加ZIP文件头(PK...) 通过输出流返回 2.4 通信示例 请求示例 响应示例 三、防御方案 3.1 检测方案 静态检测 检测异常JSP标签使用 识别多重编码特征(Base64+UUencode) 查找 OrderClassLoaders 的异常使用 检测硬编码的字节数组类名 动态检测 监控异常的 defineClass 调用 检测无加密但结构复杂的HTTP流量 分析异常的响应头(如伪造的ZIP文件) 3.2 防护建议 代码层面 禁用危险的JSP标签 限制反射操作权限 监控ClassLoader的异常行为 网络层面 深度解析HTTP参数(不只是键值对) 检测异常的字符替换模式 监控异常的Content-Disposition响应头 管理层面 定期更新WebShell特征库 加强文件上传检测 实施严格的权限控制 四、技术总结 免杀创新点 抛弃传统加密,采用多层编码混淆 利用系统类 OrderClassLoaders 替代自定义ClassLoader 多重编码混淆关键代码 流量隐蔽性 模拟正常业务参数(password/token等) 使用少见编码方式(UUencode) 响应伪装成ZIP文件 对抗启示 传统加密WebShell已可被有效检测 编码混淆可能比加密更具隐蔽性 安全设备需结合静态+动态+行为分析 五、附录 关键类结构 编码对照表 | 编码字符 | 实际字符 | |---------|---------| | a | = | | b | \n | | c | & | | ... | ... |