遥遥领先!java内存马分析-[Godzilla-FilterShell] 哥斯拉
2023-11-4 00:6:44 Author: 渗透安全团队(查看原文) 阅读量:39 收藏

考虑到很多小伙伴还不懂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() 方法时候进行了指定

四、整体的排查思路

  1. filter 名字很特别

    内存马的Filter名一般比较特别,有shell或者随机数等关键字。这个特征稍弱,因为这取决于内存马的构造者的习惯,构造完全可以设置一个看起来很正常的名字。

  2. filter 优先级是第一位

    为了确保内存马在各种环境下都可以访问,往往需要把filter匹配优先级调至最高,这在shiro反序列化中是刚需。但其他场景下就非必须,只能做一个可疑点。

  3. 对比 web.xml 中没有filter配置

    内存马的Filter是动态注册的,所以在web.xml中肯定没有配置,这也是个可以的特征。但servlet 3.0引入了@WebFilter标签方便开发这动态注册Filter。这种情况也存在没有在web.xml中显式声明,这个特征可以作为较强的特征。

  4. 特殊 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

  5. Filter 的 doFilter 方法中有恶意代码

    我们可以把内存中所有的Filter的class dump出来,使用gui等反编译工具分析看看,是否存在恶意代码,比如调用了如下可疑的方法:

    • java.lang.Runtime.getRuntime

    • defineClass

    • invoke


付费圈子

欢 迎 加 入 星 球 !

代码审计+免杀+渗透学习资源+各种资料文档+各种工具+付费会员

进成员内部群

星球的最近主题和星球内部工具一些展示

加入安全交流群

                               

关 注 有 礼

关注下方公众号回复“666”可以领取一套领取黑客成长秘籍

 还在等什么?赶紧点击下方名片关注学习吧!


干货|史上最全一句话木马

干货 | CS绕过vultr特征检测修改算法

实战 | 用中国人写的红队服务器搞一次内网穿透练习

实战 | 渗透某培训平台经历

实战 | 一次曲折的钓鱼溯源反制

免责声明
由于传播、利用本公众号渗透安全团队所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,公众号渗透安全团队及作者不为承担任何责任,一旦造成后果请自行承担!如有侵权烦请告知,我们会立即删除并致歉。谢谢!
好文分享收藏赞一下最美点在看哦

文章来源: http://mp.weixin.qq.com/s?__biz=MzkxNDAyNTY2NA==&mid=2247511624&idx=2&sn=b7242482015c0c6c2438c3cee1024581&chksm=c17653e7f601daf1c6cc8b150af28f34d4edb73796fdad6660c4322d35054bbac0752e57accf&scene=0&xtrack=1#rd
如有侵权请联系:admin#unsafe.sh