内存马查杀笔记-入门版
简述
大型派对活动在即,可能会遇到内存马场景,本篇写给对Java不熟悉的朋友,不会涉及很多技术细节。
内存马历史:
内存马历史也很多年了,网上文章也很多,总有能帮助到你的。
其实内存马由来已久,早在17年n1nty师傅的《Tomcat源码调试笔记-看不见的shell》中已初见端倪,但一直不温不火。 后经过rebeyong师傅使用agent技术加持后,拓展了内存马的使用场景,然终停留在奇技淫巧上。 在各类hw洗礼之后,文件shell明显气数已尽。内存马以救命稻草的身份重回大众视野。
特别是今年(2020)在shiro的回显研究之后,引发了无数安全研究员对内存webshell的研究,其中涌现出了LandGrey师傅构造的Spring controller内存马。
内存马简述:
常规的Webshell基于文件类形式存在,而内存马是一种无文件攻击手段,因此也被称为不落地马或者无文件马。
内存马在语言类型上有PHP内存马,Python内存马,而本文主要侧重于“市场占有率”最高的java内存马的检测与查杀,java内存马主要分为三大类型:
- servlet-api类:filter型、servlet型、listener型
- spring类:拦截器、controller型
- Java Instrumentation类:agent型
原理简述:
Java Servlet 的实现原理,如下图:
客户端发起的web请求会依次经过Listener、Filter、Servlet三个组件,而内存马利用在请求过程中在内存中修改或动态注册新的组件,达到注入Webshell的目的。
环境准备
本文侧重在内存马查杀,我们可以准备一个简单环境。
- Tomcat,我用的是 Tomcat 9.0.85
- Webshell管理工具:哥斯拉、冰蝎
- 内存马排查工具:Arthas、java-memshell-scanner
首先启动Tomcat服务器
|
|
查杀思路
我们需要了解的是如何去快速确认内存马是否存在,如何确定其位置,如何进行清除。
消息来源:为什么怀疑有内存马,通常是以下集中情况:
- 流量设备的内存马告警,有具体请求的uri可以辅助后面排查
- 主机防护的可疑命令告警,
- 服务器突然进行横向攻击扫描
- 其他人工上报:比如服务器性能异常,某些接口访问异常等。
排查思路:
- 弄清楚当前环境的服务架构:中间件、组件、框架等
- 日志排查:排查服务器web日志,查看是否有可疑的web访问日志,比如有大量请求URL路径相同但参数不同的,或者页面不存在但是返回200的请求,或者同一个URL请求有大量访问记录为500等等。
- 中间件排查:如果web日志未发现异常,可以排查是否为中间件漏洞导致代码执行注入内存马,排查中间件的error.log日志查看是否有可疑的报错,根据注入时间和方法,根据业务使用的组件排查是否可能存在java代码执行漏洞以及是否存在过webshell,排查框架漏洞,反序列化漏洞。
- 查看是否有类似哥斯拉、冰蝎特征的url请求,哥斯拉和冰蝎的内存马注入流量特征与普通webshell的流量特征基本吻合。
- 通过查找返回200的url路径对应的web目录下是否真实存在文件,如不存在大概率为内存马。
- 上述是大致思路,接下去要进行具体排查分析,就需要选择合适的工具进行分析。
查杀检测工具
本文主要讲解使用 java-memshell-scanner、Arthas进行内存马排查,其他的可自行试验。
首先我们在不注入内存马的情况下,先使用工具查看一下当前状态
java-memshell-scanner
- java-memshell-scanner,c0ny1师傅编写的jsp内存马检测脚本,通过jsp脚本扫描并查杀各类中间件内存马,比 Java agent 要温和一些。
该脚本的使用非常简单,将 java-memshell-scanner 脚本放在能访问的web路径下,然后直接访问就可以获得结果。支持Filter类和Servlet类内存马查杀。
将java-memshell-scanner下的tomcat-memshell-scanner.jsp复制到网站目录下,
|
|
通过Web端进行访问,可以看得只有默认的Tomcat filter和servlet。
Arthas
- Arthas,Arthas是一款开源的Java诊断工具,基本使用场景是定位复现一些生产环境比较难以定位问题。可以在线排查问题,以及动态追踪Java代码,实时监控JVM状态等等。
启动
|
|
查看当前的Servlet、Filter、Listener
常用命令
输入Mbean 查看或监控 Mbean 的属性信息,根据内存马的特性,进行筛选出异常组件,
1.查看URL路由(看Servlet内存马)
内存马访问触发特征:URL地址路径在源码中不存在
|
|
查看 Mbean 的信息,查看异常Filter、Servlet、Listener节点
2. sc查看JVM 已加载的类信息
|
|
根据类名判断,搜索是否有相关资料,若没有则下载其源码,查看是否有后门,也可直接上传微步在线
查看某类加载的类信息
|
|
反编译指定类
|
|
反编译输出的结果能查看到内存马的恶意语句
dump已加载类的字节码
|
|
其他工具
- aLIEz,内存马查杀工具,采用反射动态加载JDK依赖,不会直接transformer去改bytecode, 现在是直接dump出来依赖研究人员自己分析。杀各个JavaEE容器、中间件的内存马
- copagent:自动提取项目 需要自己排查,能排查几乎主流内存马技术
- FindShell:内存马查杀工具,尤其针对Agent型,原理是dump出JVM当前的class并进行字节码分析,并加入自动修复的功能
- NoAgent-memshell-scanner,NoAgent内存马检测程序,支持检测 agent型内存马、tomcat filter/servlet/listener/valve型内存马、spring interceptor,controller型内存马,支持非agent型内存马的删除功能。
- shell-analyzer,一款GUI版本的实时内存马查杀工具,支持本地查杀与远程查杀; 仅测试了Tomcat这一种中间件,不过理论上任何实现了Servlet规范的中间件都可以查杀
案例-哥斯拉内存马
注入内存马
哥斯拉生成普通的Webshell,将shell01.jsp放到Tomcat Web目录下
通过哥斯拉连接Webshell,连接正常,
右键进入,在shell页面选择内存马MemoryShell 或 FilterShell,选择相应的类型进行执行。
哥斯拉内存马是servlet型和filter型,这两种相对比较好排查。
注入Servlet型
注入前可以先选择 ServletManage 点击 getAllServlet,查看下当前的状态
通过MemoryShell,设置好选项后,点击 run 进行注入
注入后再次点击 ServletManage,点击 getAllServlet,查看下当前的状态,可以看到新增了一条。
注入Filter型
注入前可以先点击 getAllFilter,查看下当前的状态
通过点击 addFilterShell 进行注入
注入后再次点击 getAllFilter,查看下当前的状态,可以看到新增了一条。
java-memshell-scanner排查
通过访问 /tomcat-memshell-scanner.jsp 即可进行排查,可以看到新增的两条都被找到了。
|
|
通过dump可以下载相应的class类进行分析,点击Kill即可删除相应内存马。
Arthas排查
Arthas 只能排查是否存在,提取内存马Class并反编译,无法直接删除。
查看 Mbean 的信息,查看异常Filter/Servlet节点
|
|
|
|
在真实常见中,就需要我们对这些相应的servlet、filter名称有一些了解,从而发现其中的异常可疑类。
搜索查看JVM已加载的类信息,模糊匹配Servlet和Filter类
|
|
可以看到新增了很多类,其中有些是我们上传的shell01.jsp导致 的,我们对其中可疑的类进行分析。
反编译指定的类
|
|
这里可以看到,反编译输出的结果能很清晰的查看到冰蝎马的内容和密码。
dump可疑类进行分析
|
|
通过反编译工具反编译相关类,可以查看到内存马的恶意语句
org.apache.coyote.deser.CreatorProperty
对应的Servlet类内存马:
org.apache.coyote.deser.std.ByteBufferDeserializer
对应的Filter类内存马:
内存Dump
|
|
根据关键词进行检索
|
|
来自网络的 冰蝎、哥斯拉内存检测命令
|
|
清除内存马
清楚内存马最常见的方式就是对服务进行重启。
针对于Servlet类和Filter类,可以采用工具进行清除,比如上面的 Java-Memshell-Scanner 点击 Kill 进行清除。
参考文献
- 查杀Java web filter型内存马 c0ny1 2020-08-13
- Filter/Servlet型内存马的扫描抓捕与查杀 c0ny1 2020-09-09
- 冰蝎、哥斯拉 内存马应急排查
文件属性
创建时间:2025-06-25 10:52
修订记录:
- 2025-06-25 ,此次修订内容| 新建
备注:xxx