Java内存马的检测与发现
【网络安全】Java内存马的检测与发现
- 一、Java内存马的现象
- 二、检测思路
- 三、重点关注类
- 四、检测方法
- 1. 检查方法(FindShell)
- 2. 检查方法(sa-jdi)
- 3. 检查方法(arthas-boot)
- 4. 检查方法(cop.jar)
- 5. 检查方法(memshell_scanner)
一、Java内存马的现象
webshell可以正常访问,并且从log日志中可以看到webshell的访问状态码为200,但是在对应的目录中却找不到文件,如果存在此类情况,可以判断服务器中了内存马

二、检测思路
根据Java内存马的特点,检测思路如下:
- 注入jar包
- dump已加载的class字节码
- 反编译为java代码
- 源码webshell检测
这样检测比较消耗性能,可以考虑缩小源码检测
三、重点关注类
在检测过程中需要重点关注的几个类和方法:
javax/servlet/http/HttpServlet#service
org/apache/catalina/core/ApplicationFilterChain#doFilter
org/springframework/web/servlet/DispatcherServlet#doService
org/apache/tomcat/websocket/server/WsFilter#doFilter
四、检测方法
1. 检查方法(FindShell)
排查工具:FindShell:https://github.com/geekmc/FindShell
安装&打包方法:
- 进入到
FindShell目录,打包项目,执行mvn package- 如果没有
mvn命令需要先install apache-maven - 如果报错提示
sd-jdi.jar的问题,就需要修改pom⽂件中的sd-jdi.jar⽂件的路径,然后重新打包
- 如果没有
- 打包成功后会在
target⽬录下⽣成FindShell-1.0.jar⽂件
通过官方文档可以得知检测命令为java -jar FindShell.jar --pid [目标JVM的PID]
- 找到
jvm进程,并记住pid:jps -l - 查找内存⻢并
dump出class⽂件(保存在当前路径下):java -jar FindShell-1.0.jar --pid xxx —debug
发现内存马提示如下图所示

未发现内存马提示如下图所示:

针对dump出来的⽂件使⽤jd-gui进⾏class反编译,可以发现是冰蝎3.0


2. 检查方法(sa-jdi)
排查工具:sa-jdi.jar: 在jdk中的/lib/目录下、dumpclass.jar:https://github.com/hengyunabc/dumpclass
使用方法:
使用GUI的方法可以执行命令如下:
- 找到
sa-jdi.jar⽂件位置:echo $JAVA_HOME/lib - 出现图形化界面:
sudo java -cp sa-jdi.jar sun.jvm.hotspot.HSDB- or 不找位置直接执行:
sudo java -classpath "$JAVA_HOME/lib/sa-jdi.jar" sun.jvm.hotspot.HSDB - or
jhsdb hsdb
- or 不找位置直接执行:
注:如果在attach进程的时候提示error,多半是权限问题,程序权限和木马权限保持⼀致即可


注入以后可以在菜单栏的tools中查看是否有关键类

如果发现存在关键class的话,可以使用dumpclass.jar或者sa-jdi文件进行dump(sa-jdi.jar可以点击下图的create进行创建)

如下图所示
左半部分图片上面为存在类,成功导出;
左半部分下面为不存在无法导出的结果

使用jd-gui进行反编译


3. 检查方法(arthas-boot)
检查工具:arthas-boot.jar:https://github.com/alibaba/arthas/releases
使用方法:
java -jar arthas-boot.jar- 查看相关类名:sc xxxxx类名
- 反编译类名:jad xxxxx类名
- 下载指定类到本地:dump xxxxx类名

直接反编译选中的类

4. 检查方法(cop.jar)
检查工具:cop.jar:https://github.com/LandGrey/copagent/
使用方法:java -jar cop.jar -p xxx

执行后在本地存放扫描结果,并标注高、中、低危

同时也把可能有问题的代码转成java⼀并存放在本地


5. 检查方法(memshell_scanner)
检查工具:memshell_scanner.jsp:https://github.com/c0ny1/java-memshell-scanner
使用方法:把jsp文件放在存在内存马的web目录中,然后访问该文件即可

参考链接:
- 内存马查杀思路:https://my.oschina.net/9199771/blog/5529686
- Arthas 简介:https://arthas.aliyun.com/doc/
其他内存马查杀工具:
- https://github.com/huoji120/DuckMemoryScan
- https://github.com/xyy-ws/NoAgent-memshell-scanner
- https://github.com/threedr3am/ZhouY
