Arthas在内存马查杀中的应用
字数 1397 2025-08-30 06:50:27

Arthas在内存马查杀中的应用

引言

内存马(Memory Shell)是一种驻留在内存中的恶意后门程序,由于其不落地磁盘的特性,传统安全防护手段难以检测。本文详细介绍如何使用Arthas工具来检测和清除各种类型的内存马。

Arthas简介

Arthas是阿里巴巴开源的一款Java诊断工具,具有以下特点:

  • 实时诊断运行中的Java应用
  • 无需修改代码或重启服务
  • 支持查看和操作JVM内部状态
  • 提供丰富的命令集进行问题诊断

基础使用

注意事项

  • 避免在命令中使用中文字符,可能导致输入框污染
  • 确保命令格式正确,避免隐藏字符

常用命令

  1. 查找类

    sc *Filter*
    

    查找所有名称包含"Filter"的类

  2. 查看类详细信息

    sm org.apache.catalina.core.StandardContext
    
  3. 查找继承某接口的类

    sc -d javax.servlet.Filter
    
  4. 反编译类

    jad org.apache.catalina.core.StandardContext
    
  5. 查看内存中的类

    vmtool --action getInstances --className org.apache.catalina.core.StandardContext --express 'instances[0]'
    

内存马查杀实战

1. Servlet内存马

注入方式

  • 新建Wrapper包装恶意Servlet
  • 写入StandardContext

查杀步骤

  1. 获取StandardContext实例:

    vmtool --action getInstances --className org.apache.catalina.core.StandardContext --express 'instances[0]'
    
  2. 查看servletMappings:

    ognl '@org.apache.catalina.core.StandardContext@instances[0].servletMappings'
    
  3. 移除恶意路由:

    ognl '@org.apache.catalina.core.StandardContext@instances[0].removeServletMapping("/exec")'
    
  4. 彻底移除Servlet:

    ognl '@org.apache.catalina.core.StandardContext@instances[0].removeChild(@org.apache.catalina.core.StandardContext@instances[0].findChild("evilServlet"))'
    

2. Listener内存马

注入方式

  • 继承ServletRequestListener的恶意Listener
  • 添加到StandardContext的applicationEventListenersList

查杀步骤

  1. 查看applicationEventListenersList:

    ognl '@org.apache.catalina.core.StandardContext@instances[0].applicationEventListenersList'
    
  2. 移除恶意Listener:

    ognl '@org.apache.catalina.core.StandardContext@instances[0].applicationEventListenersList.remove(0)'
    

3. Filter内存马

注入方式

  • 写入FilterMap和FilterDef
  • 绑定恶意路由

查杀步骤

  1. 查看filterMaps:

    ognl '@org.apache.catalina.core.StandardContext@instances[0].filterMaps'
    
  2. 获取恶意FilterMap:

    ognl '#fm=@org.apache.catalina.core.StandardContext@instances[0].findFilterMap("/exec")'
    
  3. 移除恶意FilterMap:

    ognl '@org.apache.catalina.core.StandardContext@instances[0].removeFilterMap(#fm)'
    
  4. 移除FilterDef:

    ognl '@org.apache.catalina.core.StandardContext@instances[0].filterDefs.remove("evilFilter")'
    

4. Valve内存马

注入方式

  • 恶意Valve对象添加到StandardPipeline

查杀步骤

  1. 查看Valves:

    ognl '@org.apache.catalina.core.StandardContext@instances[0].pipeline.getValves()'
    
  2. 移除恶意Valve:

    ognl '@org.apache.catalina.core.StandardContext@instances[0].pipeline.removeValve(@org.apache.catalina.core.StandardContext@instances[0].pipeline.getValves()[0])'
    

5. Upgrade内存马

注入方式

  • 恶意Upgrade对象添加到httpUpgradeProtocols

查杀步骤

  1. 查看httpUpgradeProtocols:

    ognl '@org.apache.coyote.http11.AbstractHttp11Protocol@instances[0].httpUpgradeProtocols'
    
  2. 移除恶意协议:

    ognl '@org.apache.coyote.http11.AbstractHttp11Protocol@instances[0].httpUpgradeProtocols.remove("http")'
    

注意:需同时处理触发点(如恶意Servlet、JSP或Filter)

6. Executor内存马

注入方式

  • 替换原生executor为恶意executor

查杀步骤

  1. 获取executor对象:

    ognl '@org.apache.catalina.core.StandardThreadExecutor@instances'
    
  2. 创建新executor并替换:

    ognl '#ct=@java.lang.Thread@currentThread().getContextClassLoader().loadClass("org.apache.catalina.core.StandardThreadExecutor").getConstructor(), #newExecutor=#ct.newInstance(), @org.apache.catalina.core.StandardThreadExecutor@instances[0].getService().addExecutor(#newExecutor), @org.apache.catalina.core.StandardThreadExecutor@instances[0].getService().removeExecutor(@org.apache.catalina.core.StandardThreadExecutor@instances[0])'
    

常见问题

  1. 能否直接删除恶意class?

    • 由于class与其他类的关联性,直接删除通常不成功
    • 尝试清空class并重新编译也容易失败
  2. 为什么移除servletMapping后内存马仍能运行?

    • 需要同时移除Wrapper和ServletMapping
  3. 如何避免服务崩溃?

    • 使用封装好的remove方法而非直接操作内部数据结构
    • 对于Executor内存马,必须先创建替代品再移除

结语

Arthas提供了强大的Java运行时诊断能力,是内存马查杀的有效工具。本文介绍了六种常见内存马的查杀方法,实际应用中需根据具体情况调整命令。建议结合多种检测手段,确保彻底清除内存马。

最佳实践建议

  1. 定期检查关键组件(Servlet、Filter、Listener等)
  2. 建立基线配置,对比异常变更
  3. 结合日志分析和行为监控
  4. 重要系统考虑使用RASP防护
Arthas在内存马查杀中的应用 引言 内存马(Memory Shell)是一种驻留在内存中的恶意后门程序,由于其不落地磁盘的特性,传统安全防护手段难以检测。本文详细介绍如何使用Arthas工具来检测和清除各种类型的内存马。 Arthas简介 Arthas是阿里巴巴开源的一款Java诊断工具,具有以下特点: 实时诊断运行中的Java应用 无需修改代码或重启服务 支持查看和操作JVM内部状态 提供丰富的命令集进行问题诊断 基础使用 注意事项 避免在命令中使用中文字符,可能导致输入框污染 确保命令格式正确,避免隐藏字符 常用命令 查找类 : 查找所有名称包含"Filter"的类 查看类详细信息 : 查找继承某接口的类 : 反编译类 : 查看内存中的类 : 内存马查杀实战 1. Servlet内存马 注入方式 : 新建Wrapper包装恶意Servlet 写入StandardContext 查杀步骤 : 获取StandardContext实例: 查看servletMappings: 移除恶意路由: 彻底移除Servlet: 2. Listener内存马 注入方式 : 继承ServletRequestListener的恶意Listener 添加到StandardContext的applicationEventListenersList 查杀步骤 : 查看applicationEventListenersList: 移除恶意Listener: 3. Filter内存马 注入方式 : 写入FilterMap和FilterDef 绑定恶意路由 查杀步骤 : 查看filterMaps: 获取恶意FilterMap: 移除恶意FilterMap: 移除FilterDef: 4. Valve内存马 注入方式 : 恶意Valve对象添加到StandardPipeline 查杀步骤 : 查看Valves: 移除恶意Valve: 5. Upgrade内存马 注入方式 : 恶意Upgrade对象添加到httpUpgradeProtocols 查杀步骤 : 查看httpUpgradeProtocols: 移除恶意协议: 注意:需同时处理触发点(如恶意Servlet、JSP或Filter) 6. Executor内存马 注入方式 : 替换原生executor为恶意executor 查杀步骤 : 获取executor对象: 创建新executor并替换: 常见问题 能否直接删除恶意class? 由于class与其他类的关联性,直接删除通常不成功 尝试清空class并重新编译也容易失败 为什么移除servletMapping后内存马仍能运行? 需要同时移除Wrapper和ServletMapping 如何避免服务崩溃? 使用封装好的remove方法而非直接操作内部数据结构 对于Executor内存马,必须先创建替代品再移除 结语 Arthas提供了强大的Java运行时诊断能力,是内存马查杀的有效工具。本文介绍了六种常见内存马的查杀方法,实际应用中需根据具体情况调整命令。建议结合多种检测手段,确保彻底清除内存马。 最佳实践建议 : 定期检查关键组件(Servlet、Filter、Listener等) 建立基线配置,对比异常变更 结合日志分析和行为监控 重要系统考虑使用RASP防护