内存马查杀学习记录#
实验环境#
针对tomcat部署war包的项目
首先自己创建一个maven项目,包含文件上传(不做安全过滤,之后好上传jsp马),打包成war包部署到linux tomcat服务器并启动。
我在最近的学习当中发现工具注入的内存马可以分为两类,一类是servlet、filter、listener等等的普通内存马,还有一类是agent,通过hook jar包源码,例如冰蝎通过污染javax.servlet.http.HttpServlet类来实现内存马注入。
哥斯拉内存马#
这里用哥斯拉工具注入的内存马进行研究
首先项目先搭建起来,先上传一个哥斯拉的jsp马,然后注入内存马

第一个内存马注入功能是在filtershell这里,点击add即可添加filter内存马

这类内存马的查杀可以用到https://github.com/ruyueattention/java-memshell-scanner工具,使用jsp脚本排查内存马
将tomcat_memshell_scanner.jsp上传到服务器uploads目录下,访问该文件即可查看到检测结果
可以看到filter这一栏存在可疑的classloader org.apache.coyote.ser.BeanPropertyWriter,并且磁盘无class文件,这便是我们刚刚哥斯拉注入的内存马。直接杀掉即可。

另一种是memoryshell添加

通过memshell_scanner仍然可以发现,直接杀掉

杀掉后无法连接

然后我们再用其他师傅写的自动注入内存马的jsp脚本试试
jsp脚本注入内存马#
这里通过三个jsp脚本分别注入Servlet、Filter、Listener类型的内存马,访问jsp文件后即注入成功
然后通过memshell_scanner查看
可以看到某些类的class文件含有$符号,为匿名字节码,并且生成在uploads文件夹下,很容易便判断出是内存马,如果不放心也可以dump下来分析代码

但是这里的listener似乎杀不掉,可以看到仍可以执行命令

dump下来后可以看到确实是恶意代码

后来发现是工具缺陷,issues有人提过,listener型的内存马杀不掉
冰蝎内存马#
冰蝎内存马利用 instrument 机制,在不增加新类和新方法的情况下,对现有类的执行逻辑进行修改实现的内存马。
这类内存马实现方式比较多,检测比较困难,copagent 和 memershell 都无法监测冰蝎 4 注入的内存马。
因此这里我们用 arthas 去分析,主要关注的其实是 agent 内存马常改的一些类。
javax.servlet.http.HttpServlet
org.apache.tomcat.websocket.server.WsFilter
org.apache.catalina.core.ApplicationFilterChain
其中冰蝎内存马通过修改 javax.servlet.http.HttpServlet#service 方法,添加自己的处理逻辑,也就是内存马。
使用arthas反编译javax.servlet.http.HttpServlet类,查看代码是否被更改
可以看到这个类已经被修改过了

这里使用https://github.com/Garck3h/killBehinderMemShell工具来进行冰蝎内存马的查杀
java -Xbootclasspath/a:/root/jdk1.8.0_60/lib/tools.jar[这里为jdk自带的tools.jar包位置] -jar /root/killBehinderMemShell.jar[工具jar包] 638852[tomcat进程] javax.servlet.http.HttpServlet[类名]tomcat进程使用jps查看,选择进程号较大的Bootstrap

清除成功

冰蝎也已经连接失败
