考虑到很多小伙伴还不懂java 内存马,所以我打算新开一个系列,完善分享体系
为了方便演示,我们通过Godzilla写入webshell,地址为:http://localhost:8080/jiaju_mall/webshell.jsp
加密模式为:AES_BASE64
一、什么是Filter
Filter 作为 servler-api 的三大件之一,顾名思义就是起到过滤作用:对web服务器管理的所有web资源,例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,实现一些特殊的功能。例如权限访问控制、过滤敏感字符(例如sql注入、RCE会出现的危险字符串)
在内存马技术中,Filter类型也被广泛使用,优先级通常比较高,且实现的拦截路径比较特殊,例如: /favicon.ico
当然,实现的拦截路径和优先级,可以根据不同环境自定义设置
排查的思路,通过Java Agent 遍历加载到内存中的class,进行分析
这篇文章使用 Arthas ,实战环境也经常用到
安装&使用:https://arthas.aliyun.com/doc/install-detail.html
命令文档:https://arthas.aliyun.com/doc/commands.html
需要注意,在使用 Arthas 的时候,要和 web 程序权限相同
三、哥斯拉 FilterShell 型分析
废话不多说,环境搭建:Tomcat,一个支持 jsp 的web站点
FilterShell 上传前,获取所有的Filter,这个站点中,只存在初始化用的 WebSocket
点击:addFilterShell 再次获取,得到:ValueInstantiators1697030134135
Arthas 查看存在的 Filter : mbean | grep "j2eeType=Filter"
可以发现:Godzilla 的 FilterShell 存在非常明显的特征 ⇒ 尾部时间戳 1697030134135 → 2023-10-11 21:15:34
接着,根据得到的 Filter 名称继续分析:
sc *.Filter | grep "ValueInstantiators"
⇒ 得到类全路径
再接着分析 sc -d org.apache.coyote.deser.ValueInstantiators
看到这里就非常清晰了,classloader 暴露了它为恶意对象
该类被 webshell.jsp 进行加载,webshell.jsp 再由 JasperLoader 进行加载
+-org.apache.jsp.webshell_jsp$X@17915e77
+-org.apache.jasper.servlet.JasperLoader@4c9262a3
[ jsp 的本质是一个Servlet, Servlet-api 一般是由 WebappClassLoader 进行加载 ,若其classloader 不是 WebappClassLoader,则可能为恶意
JasperLoader 会被用于热加载更新文件,类似文件上传的webshell,classloader便会是 JasperLoader ]
为了进一步确定我们的猜想,对类 dump到本地反编译:
dump -d D:/webshell-dump org.apache.coyote.deser.ValueInstantiators
也可通过下述命令,在窗口查看
jad org.apache.coyote.deser.ValueInstantiators
拖拽class文件进 jd-gui 进行反编译:
Filter存在doFilter方法,为拦截器的核心方法之一,而执行 doFilter() 的时候,调用了 _jspService()
义眼丁真鉴定为:Vulnerablity
也存在自写的加密方法等
顺便说一句,FilterShell的名字在 addFilter() 方法时候进行了指定
四、整体的排查思路
filter 名字很特别
内存马的Filter名一般比较特别,有shell
或者随机数等关键字。这个特征稍弱,因为这取决于内存马的构造者的习惯,构造完全可以设置一个看起来很正常的名字。
filter 优先级是第一位
为了确保内存马在各种环境下都可以访问,往往需要把filter匹配优先级调至最高,这在shiro反序列化中是刚需。但其他场景下就非必须,只能做一个可疑点。
对比 web.xml 中没有filter配置
内存马的Filter是动态注册的,所以在web.xml中肯定没有配置,这也是个可以的特征。但servlet 3.0引入了@WebFilter
标签方便开发这动态注册Filter。这种情况也存在没有在web.xml中显式声明,这个特征可以作为较强的特征。
特殊 classloader 加载
我们都知道Filter也是class,也是必定有特定的classloader加载。一般来说,正常的Filter都是由中间件的WebappClassLoader加载的。反序列化漏洞喜欢利用TemplatesImpl和bcel执行任意代码。所以这些class往往就是以下这两个:
这个特征是一个特别可疑的点了。当然了,有的内存马还是比较狡猾的,它会注入class到当前线程中,然后实例化注入内存马。这个时候内存马就有可能不是上面两个classloader。
com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl$TransletClassLoader
com.sun.org.apache.bcel.internal.util.ClassLoader
Filter 的 doFilter 方法中有恶意代码
我们可以把内存中所有的Filter的class dump出来,使用gui
等反编译工具分析看看,是否存在恶意代码,比如调用了如下可疑的方法:
java.lang.Runtime.getRuntime
defineClass
invoke
★
欢 迎 加 入 星 球 !
代码审计+免杀+渗透学习资源+各种资料文档+各种工具+付费会员
进成员内部群
星球的最近主题和星球内部工具一些展示
加入安全交流群
关 注 有 礼
还在等什么?赶紧点击下方名片关注学习吧!
推荐阅读