官方公众号企业安全新浪微博
FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。
FreeBuf+小程序
Preface
前面讲解了Servlet / Listener / Filter型的查杀思路,对于在前面三种类型中,Servlet和Filter都存在有特定的kill功能。
但是在上一个版本中并没有实现Listener的kill功能,这里主要是对Listener中kill功能的实现以及对tomcat中其他类型内存马的各种查杀功能的实现。
Addition
Listener
我们根据Listener内存马的注入细节可以知道大概流程。
内存马编写流程
首先获取到
StardardContext
对象之后创建一个实现了
ServletRequestListener
接口的监听器类再然后通过调用
StardardContext
类的addApplicationEventListener
方法进行Listener的添加
其中addApplicationEventListener
方法主要是向StandardContext
类中的applicationEventListenersList
属性值中添加值
对于kill功能,我们可以考虑,在检测出其可能为内存马的时候,将对应的listenerName
对应的Listener从该List中删除,达到我们kill的目的。
看看最终成果
从所有的Listeners中筛选出目标Listener,之后通过调用removeApplicationEventListener
进行删除
也即是反射获取属性值之后更改列表值。
看看效果,下图为注入内存马后
删除内存马后也就没有该列表
Valve
detection
对于如何探测Valve类型的内存马,我们可以复习一下之前Valve内存马的注入流程。
对于Valve这种管道对象来说,在tomcat中间件中存在于四种容器中
也即是
Engine
Host
Context
Wrapper
每种容器中都包含有自己的管道对象
所以如果我们需要对该类型的内存马进行检测,应该获取所有这四种容器中的Valve实例,之后筛选不存在源文件的实例,将其划分为可能为内存马
Tomcat这四种容器的架构图如下:
在接收一个连接的接入的之后首先按照顺序分别是从Engine
/Host
/Context
/Wrapper
来对请求进行响应
而在这四种容器中都存在有Valve
,我们要想完全的检测所有的Valve内存马,我们就需要有下面的流程。
分别获取
Engine / Host / Context / Wrapper
等容器的Standard方法