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