Featured image of post Java内存马查杀

Java内存马查杀

Java内存马查杀

应急响应—内存马排查与查杀

https://mp.weixin.qq.com/s/mBI3B8sBeT8DzVi6FFQq6w

奇安信攻防社区-应急响应——全类型JAVA内存马排查

1.Servlet-API类内存马—java-memshell-scanner

Filter/Servlet型内存马的扫描抓捕与查杀

使用这个工具进行查和杀:https://github.com/c0ny1/java-memshell-scanner

支持Servlet/Filter/Listener类型内存马,使用只要将项目的JSP文件运行到网站根目录即可直接访问

效果:如下图中名称里面带$表示匿名内部类,这种也是比较可疑的,一般来说三大组件里面的类都是有正常名的,出现这种情况,大概率时攻击者构造内存马的时候创建相关恶意组件类实例,没有命名,创建的是匿名类实现对应接口,可以看到十分简单快捷的找出了上面三种内存马;(一般实战中攻击者比较喜欢使用filter类型的马,我们可以观察Patern字段,这个字段是该filter过滤的url特征);然后一般情况下,我们需要关注一些重点业务实例类,也就是可能存在被利用的servlet组件实例,比如下图中,我们都是通过jsp去注入的内存马,jsp本身就是一个特殊的servlet,所以我们看到所以的匿名内部类的外部类都是jsp下的一个实例类

可以对页面疑似存在内存马的类进行导出,将导出的代码使用JADX反编译查看源码中是否存在恶意代码,存在即可kill掉

  1. 问题1:对于Listener的内存马,点击Kill,内存马无法有效删除
  2. 问题2:使用这个tomcat-memshell-scanner导出恶意类进行分析时,当前项目的JDK版本不能超过11,超过11无法成功导出
  3. 对于Filter类型的内存马,如果你成功查杀一次,那么只要服务器不重启,无法在注入相同的内存马
  4. 但是对于Servlet类型的内存马,你查杀一次,但是没删除对应注入内存马的.jsp文件,还是可以继续注入内存马
  5. 还有个问题就是当项目真正运行时上传jsp文件到文件目录下无法访问,需要重启项目才能正常访问

1.1.使用哥斯拉注入内存马

浅谈冰蝎、哥斯拉内存马排查思路

我这里使用哥斯拉无法注入内存马(原因是我的Tomcat版本为10版本,并且使用的依赖是jakarta.servlet-api),解决方法将tomcat10降级为tomcat9,即可注入成功。换了个哥斯拉特战版注入成功后,使用工具将内存马删除后,发现还是能正常连接,并且无法dump出恶意文件,太奇怪了

1
2
3
4
5
6
        <dependency>
            <groupId>jakarta.servlet</groupId>
            <artifactId>jakarta.servlet-api</artifactId>
            <version>6.0.0</version>
            <scope>provided</scope>
        </dependency>

2.cop.jar

项目地址:https://github.com/LandGrey/copagent

这个就没有像上面那个这么智能了,cop.jar 会把正在运行的 java应用文件全部还原为jsp文件,然后我们可以下载到本地,用D盾或者其它杀软进行查杀。使用cop.jar这个工具时要注意jdk版本,jdk版本过高经常卡死

1
java -jar cop.jar

3.shell-anaylzer

缺点:不能查杀Spring框架型内存马,只能查杀Servlet-API型内存马

项目地址:https://github.com/4ra1n/shell-analyzer

内存马检测工具shell-analyzer(1)最初版展示与设计思路

内存马检测工具shell-analyzer(2)远程查杀实现

1
2
3
agent.jar是核心文件请保持与gui.jar或remote.jar同目录
gui.jar是GUI客户端本地和远程分析都需要
remote.jar用于远程分析本地分析无需下载

本地查杀

1
本地上运行java -jar gui.jar

即可对当前Java进程中所有Servlet组件进行分析,反编译对应的代码,将可疑代码可以使用AI进行分析也可以保存使用WebShell查杀工具进行查杀

将可以类名字复制出来进行删除即可,这只能删除内存马,没法删除WebShell,删除后刷新依然会继续显示,但是实际上哥斯拉已经无法连接了

远程查杀

1
2
3
4
5
6
7
8
//启动服务端,服务端,中内存马的机器
java -cp remote-0.1.jar:/usr/lib/jvm/java-11-openjdk-amd64/lib/tools.jar com.n1ar4.RemoteLoader 12149 adminasd

java -cp jdk1.8.0_202/lib/tools.jar:remote-0.1.jar com.n1ar4.RemoteLoader 12149 1qaz2wsx

//客户端:查杀内存马的机器
jar tf gui-0.1.jar   //查看这个gui-0.1的所有包名
java -jar gui-0.1.jar

4.Arthas

优点:可以查找所有类型的内存马,包括Spring Controller类型和Interceptor类型内存马

简明的Arthas使用教程

项目地址:https://github.com/alibaba/arthas/releases

最后一个工具就是Arthas,这个其实就是一个JAVA的排查工具,它会帮你列出当前程序加载的类,当前就只有Tomcat这个Java程序在运行。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
curl-O https://arthas.aliyun.com/arthas-boot.jar  //下载arthas
java -jar arthas                                  //运行arthas

Arthas常用命令
dashboard显示当前应用程序的实时运行状况包括 CPU 使用率内存使用情况线程情况等
jvm查看和管理 JVM 的相关信息包括堆内存GC 状态类加载情况等
sc查看和搜索类信息包括加载的类类的字段和方法等
sm查看和搜索方法信息可以查看方法的字节码参数返回值等
jad反编译指定类的字节码查看类的实现代码
classloader显示当前应用程序中所有的类加载器及其层次结构可以查看每个类加载器的名称父加载器和已加载的类数量
heapdump 生成 Java 应用程序的堆转储Heap Dump文件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
sc *.Servlet       //列出所有Servlet的类
sc *.Filter        //列出所有Filter
sc *Interceptor*   //列出所有Interceptor拦截器
sc *Controller*    //列出所有Controller

jad org.springframework.web.servlet.DispatcherServlet  //反编译恶意类

classloader        //查看所有classlaoder


jad --source-only org.apache.coyote.MapperFeature > 1.java //反编译类重定向到本地

4.1.使用Arthas查找Spring框架内存马

https://mp.weixin.qq.com/s/53M9HowgJC6wZHNO6iEYPQ

https://forum.butian.net/share/4053

img

将可疑的Controller层代码和Interceptor代码反编译到本地进行分析

img

杀掉这个内存马感觉只能靠重启Spring中间件了

5.FindShell

https://github.com/geekmc/FindShell

1
java -jar FindShell.jar --pid [PID] --repair

万不得已,重启Java中间件


案例:使用Shiro反序列化靶场来搭建

使用工具一键注入4种类型内存马

使用Arthas进行排查,可以看到存在可以的Filter

1
2
//导出到当前目录的1.java文件夹下
jad --source-only com.sma11new.exp.javaFrame.shiro.payload.build.BehinderFilter > 1.java

Arthas好像不具备杀内存马功能,只具备查找和反编译功能,杀我这使用的是shell-analyzer

By Lsec
最后更新于 Jun 22, 2025 22:00 +0800
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计
¹鵵ҳ