ListenerValve内存马的查杀分析
2023-6-30 22:22:40 Author: www.freebuf.com(查看原文) 阅读量:10 收藏

freeBuf

主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

Preface

前面讲解了Servlet / Listener / Filter型的查杀思路,对于在前面三种类型中,Servlet和Filter都存在有特定的kill功能。

但是在上一个版本中并没有实现Listener的kill功能,这里主要是对Listener中kill功能的实现以及对tomcat中其他类型内存马的各种查杀功能的实现。

Addition

Listener

我们根据Listener内存马的注入细节可以知道大概流程。

内存马编写流程

  1. 首先获取到StardardContext对象

  2. 之后创建一个实现了ServletRequestListener 接口的监听器类

  3. 再然后通过调用StardardContext类的addApplicationEventListener方法进行Listener的添加

其中addApplicationEventListener方法主要是向StandardContext类中的applicationEventListenersList属性值中添加值

image-20230618212558068.png

对于kill功能,我们可以考虑,在检测出其可能为内存马的时候,将对应的listenerName对应的Listener从该List中删除,达到我们kill的目的。

看看最终成果

image-20230618212802245.png

从所有的Listeners中筛选出目标Listener,之后通过调用removeApplicationEventListener进行删除

image-20230618212906398.png

也即是反射获取属性值之后更改列表值。

看看效果,下图为注入内存马后

image-20230618213104212.png

删除内存马后也就没有该列表

Valve

detection

对于如何探测Valve类型的内存马,我们可以复习一下之前Valve内存马的注入流程。

对于Valve这种管道对象来说,在tomcat中间件中存在于四种容器中

也即是

  1. Engine

  2. Host

  3. Context

  4. Wrapper

每种容器中都包含有自己的管道对象

所以如果我们需要对该类型的内存马进行检测,应该获取所有这四种容器中的Valve实例,之后筛选不存在源文件的实例,将其划分为可能为内存马

Tomcat这四种容器的架构图如下:

image-20230619091037080.png

在接收一个连接的接入的之后首先按照顺序分别是从Engine/Host/Context/Wrapper来对请求进行响应

而在这四种容器中都存在有Valve,我们要想完全的检测所有的Valve内存马,我们就需要有下面的流程。

  1. 分别获取Engine / Host / Context / Wrapper等容器的Standard方法


文章来源: https://www.freebuf.com/articles/web/370889.html
如有侵权请联系:admin#unsafe.sh