7-1
约 987 字大约 3 分钟
2025-11-02
内存马查杀思路
在查杀之前,首先要了解内存马的常见类型。它们通常可以分为以下几类:
- Filter/Servlet 类型: 攻击者通过向 Web 容器(如 Tomcat)动态注册恶意 Filter 或 Servlet,来实现持久化控制
- Listener 类型: 攻击者通过注册恶意 Listener,在特定事件发生时触发恶意代码
- Java Agent/Instrumentation 类型: 这种技术可以在不修改字节码的情况下,在 JVM 运行时对已加载的类进行修改,实现更隐蔽的注入
第一步:何时打进来的?
**流量分析:**监控 Web 服务器的流量。如果发现异常的 HTTP 请求,比如带有很多不寻常参数的请求,或者与正常业务逻辑不符的 URL 访问,都可能是内存马的征兆
1.1
http://your-app.com/shell.do?pwd=a1b2c3d4&cmd=whoami日志分析: 检查 Web 服务器(如 Tomcat)的访问日志。如果发现一些不寻常的请求,并且这些请求没有在正常的 Servlet 或 Controller 中找到对应的处理逻辑,那么很可能是内存马在处理这些请求
2.1 检查 Tomcat 的
access_log,发现有对/static/12345.css的请求,但该文件并不存在于硬盘上。如果这个请求的返回状态码是 200,而不是预期的 404,那么很可能是一个 Filter 内存马在默默处理这个请求**CPU/内存异常:**内存马通常会消耗额外的系统资源。如果 Web 服务器的 CPU 或内存使用率突然升高,并且没有对应的业务高峰,需要警惕
3.1 在没有业务高峰的情况下,CPU 占用率持续飙升到 90% 以上,同时内存使用量也快速增长
**工具扫描:**使用专业的 Java 安全工具或 Agent 进行扫描
第二步:内存马具体位置?
使用内存分析工具:jmap、Artha、BTrace/jfr
1.1 **jmap:**使用
jmap可以生成 Java 堆内存的 dump 文件。通过分析这个文件,可以找到异常的对象实例1.2 **Arthas:**Arthas是一款非常强大的 Java 诊断工具。它可以在不重启应用的情况下,定位和排查问题
- 使用
sc(search class)命令查找可疑的类。例如,sc -d org.apache.catalina.core.ApplicationContext可以查看 Web 容器的上下文 - 使用
jad(decompile)命令反编译可疑的类,查看其代码逻辑 - 使用
trace和watch命令跟踪特定方法的调用,观察参数和返回值,判断是否有异常行为
1.3 BTrace/jfr: 这些工具可以用于动态地跟踪 JVM 运行时行为,帮助你定位恶意代码的注入点
- 使用
**检查 Web 容器注册表:**对于 Tomcat,可以检查其内部注册的 Filter、Servlet、Listener 等
2.1 在 Tomcat 8 及更高版本中,可以通过
org.apache.catalina.core.ApplicationContext类的filterConfigs、servletConfigs等字段,或者直接通过反射获取这些注册信息**排查自定义 ClassLoader:**恶意代码可能会使用自定义的
ClassLoader来加载恶意类,以绕过常规的类加载器3.1 可以通过
jmap -clstats或者 Arthas 的classloader命令,查看 JVM 中存在的ClassLoader实例。如果发现一些不寻常的ClassLoader,需要重点关注
第三步:西内!!!
**内存中直接删除:**使用 Arthas 等工具,可以通过命令直接移除恶意对象。例如,可以调用
ApplicationContext的removeFilterDef、removeServletDef等方法,或者通过反射将恶意实例从注册表中移除1.1
ognl '#context=@org.apache.catalina.core.ApplicationContext@ApplicationContext, #context.removeFilterDef("filter_12345"), #context.removeFilterMap("filter_12345")'**重启 Web 应用:**这是最直接也最彻底的清除方法。因为内存马是驻留在内存中的,重启应用会清空内存,所有恶意代码都会被清除
2.2 找到 Java 进程 ID,使用
kill -9 <pid>或者通过 Tomcat 的shutdown.sh脚本关闭,然后再通过startup.sh启动