Java内存马排查与处置教学文档
本文档基于《java内存马排查》一文,系统阐述Java内存马的发现、排查和应急处置流程。目标是通过详尽的步骤描述,帮助安全运维人员掌握在实战环境下处理Java内存马的完整方法论。
1. 流量分析与初步判断
排查的第一步通常始于流量侧发现异常。
- 目标:确认是否存在Java内存马。
- 方法:通过分析网络流量,识别异常请求与响应模式。例如,某些内存马(如Godzilla冰蝎、Behinder哥斯拉等)在通信时具有特定的HTTP请求头、响应体分隔符(如
->|和|<-)或特定的URL路径特征。 - 结论:当流量分析发现符合内存马特征的通信数据包时,即可初步断定服务器上存在Java内存马,为后续上机排查提供明确方向。
2. 上机排查与定位
确认存在内存马后,需要在受影响的服务器上进行深度排查,以精确定位恶意代码。
2.1 确定运行环境
首先,确认目标Web应用所使用的Java容器或框架,例如Tomcat、Jetty、Spring等。不同的框架,其内存马注入的组件(如Filter、Servlet、Controller、Interceptor、Valve等)和排查路径有所差异。本文示例针对的是最常见的Tomcat框架。
2.2 定位可疑Java进程
通过系统命令(如ps aux, netstat等)查找与异常流量相关的Java进程,并记录其进程ID(PID)。观察网络连接,有助于将外部可疑连接与内部Java进程关联。
2.3 使用Arthas工具进行深度分析
Arthas是一款强大的Java诊断工具,是排查内存马的核心利器。
- 启动与附加:在服务器上运行
java -jar arthas-boot.jar,启动Arthas。工具会列出当前所有Java进程,输入之前定位到的可疑PID,即可附加到目标JVM进程。 - 全局概览:输入
dashboard命令,可以查看目标JVM的实时运行状态,包括线程、内存、GC等信息。这有助于获得进程的整体健康状况,但排查内存马更需关注具体类。 - 搜索可疑类:
- 根据Tomcat框架特点,Filter和Servlet是内存马最常用的注入点。可以使用
sc(Search Class)命令进行模糊搜索。 - 例如,搜索所有Filter:
sc *.Filter。在结果列表中,重点关注名称可疑、类加载器异常或来源未知的类。在示例中,发现了名为com.summersec.x.GodzillaFilter的明显恶意类。
- 根据Tomcat框架特点,Filter和Servlet是内存马最常用的注入点。可以使用
- 查看类加载器:输入
classloader命令可以查看当前JVM中所有的类加载器及其加载的类。内存马通常由特殊的类加载器(如利用漏洞动态生成的类加载器)加载,这可以帮助发现其他潜在恶意类。 - 检查类详情:对疑似恶意类(如
com.summersec.x.GodzillaFilter)使用sc -d <ClassName>命令查看详细信息。关键点在于code-source参数:正常的类会显示其来源JAR包或文件路径,而内存马通常是动态注入到内存中的,其code-source显示为null或为空,这是判断内存马的重要依据之一。 - 反编译类字节码:使用
jad <ClassName>命令对恶意类进行反编译,获取其Java源代码。这是分析内存马行为、提取关键配置信息的关键步骤。
3. 内存马关键信息提取与分析
从反编译后的代码中,可以提取出决定内存马行为的核心配置和攻击者信息:
- 内存马类型与特征:通过类名、继承关系和关键方法(如
doFilter),可以确认内存马的具体类型(如Godzilla Filter型内存马)。 - 通信密钥与密码:
- 通常在代码的静态变量或成员变量中定义。
- 示例中提取到:
xc = "3c6e0b8a9c15224a"(AES密钥),Pwd = "pass1024"(连接密码)。
- 内存马路径:
path = “/favicondemo.ico“,这是内存马在Web容器中注册的访问路径。 - 攻击入口与攻击链分析:通过检查恶意类使用的类加载器,可以推断攻击者的利用方式。
- 示例中发现的类加载器是
com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl$TransletClassLoader。 - 分析:这表明攻击者很可能并非通过文件上传植入后门,而是利用了Java反序列化漏洞。攻击链是:触发反序列化漏洞 -> 利用
TemplatesImpl动态加载包含恶意逻辑(如addFilter())的字节码 -> 在内存中成功注入Filter型内存马。这一判断对后续漏洞修复和溯源至关重要。
- 示例中发现的类加载器是
4. 应急处置方案
在确认内存马后,需立即进行处置。对于生产环境,优先选择“热修复”方案以避免服务重启。
方案一:内存马热修复(推荐)
在JVM运行期间,动态修复内存中的恶意类,使其失效。
- 导出与修改源码:将Arthas中
jad命令得到的源码保存到本地。修改其核心逻辑:- 将
doFilter方法体清空,改为标准的放行逻辑(直接调用chain.doFilter)或仅返回。 - 检查
init,destroy,equals等其他方法,清除其中可能存在的恶意逻辑。
- 将
- 重新编译:在Arthas中使用
mc(Memory Compiler)命令,将修改后的Java源码在内存中重新编译为字节码。 - 热加载:使用
redefine命令,用新编译的字节码替换JVM中原有的恶意类。此操作完成后,访问内存马路径(如/favicondemo.ico)将不再执行恶意代码,但恶意类在容器中的注册信息(如Filter映射)可能依然存在。 - 清理路由映射(可选但建议):
- 使用Arthas的
vmtool命令,获取Tomcat的ApplicationContext或StandardContext等核心对象。 - 通过反射调用相关API(如
removeFilterMapping,removeFilterDef),从容器中彻底移除恶意Filter的定义和映射关系。完成此步骤后,恶意路径将彻底无法访问。
- 使用Arthas的
方案二:内存拔除(进阶)
此方案更彻底,但操作风险略高。通过Java Agent或工具(如vmtool)直接操作JVM内存,定位并删除恶意Filter实例、销毁对应的类加载器,并将其从容器的内部数据结构中完全抹除。此操作对操作者JVM底层知识要求较高。
5. 后续加固与溯源
- 漏洞修复:根据攻击链分析(如反序列化漏洞),立即定位并修复系统中的安全漏洞,防止再次被注入。
- 全面排查:检查同一服务器、同一集群内的其他应用是否存在类似问题。检查系统日志、访问日志,确定攻击时间、攻击源IP。
- 系统恢复:在确保漏洞修复、所有威胁清除后,安排合适的停机窗口,重启应用。热修复仅在内存中生效,重启后,只有持久化在磁盘上的干净代码会被加载,这是最彻底的恢复方式。
- 总结复盘:记录完整的攻击事件时间线、利用的漏洞、植入的内存马类型、使用的工具和命令、处置过程,并更新安全防护策略和监控规则。
重要提示:本文档内容完全基于链接提供的技术文章进行整理和结构化。文档中涉及的具体命令、代码片段、工具(Arthas)使用方法及攻击技术细节(如Godzilla内存马特征、TemplatesImpl利用链)均来源于原文描述。在实际操作中,请结合具体环境审慎执行,并在测试环境充分验证。