官方公众号企业安全新浪微博
FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。
FreeBuf+小程序
Preface
前面我们针对Tomcat下的Vavle内存马进行了类似的查和杀功能的编写,这里我们继续针对Executor型和Upgrade类型的内存马进行查和杀的编写
Executor
review
在之前的Executor型内存马的注入中,已经对Executor是什么,有什么用,怎么用等等问题分别进行了回答,下面简单回顾一下Executor的注入流程
其是一种可以在Tomcat组件之间进行共享的连接池
在处理socket请求的时候将会通过getExecutor
方法获取对应的Executor对象,调用其execute方法进行后续逻辑
而同时存在有setExecutor
方法能够覆盖掉getExecutor
方法获取到的Executor对象
所以我们首先创建一个Executor对象,在重写其execute方法的时候编写我们的恶意逻辑,之后在处理socket连接的时候,获取的是我们写入的恶意的Executor类对象,也即是执行的存在恶意逻辑的execute重写方法
总结一下注入流程:
首先获取对应的NioEndpoint(对比上面分析的request和response位置,我们可以知道有一个共同点)
获取对应的executor属性
创建一个恶意的executor
将恶意的executor传入
detect
在前面恶意executor对象的写入操作是调用的org.apache.tomcat.util.net.AbstractEndpoint#setExecutor
方法进行写入
AbstractEndpoint
是抽象类,我们实际调用的是其子类NioEndpoint
进行调用
类似的,我们的检测思路就是获取NioEndpoint
类对象,之后获取这个对象中的executor属性,也即是其父类AbstractEndpoint
的属性
获取NioEndpoint
最后检测,同样是判断该executor对象是否存在具体的资源路径
也即是调用classFileIsExists
方法判断
kill
其中对于kill功能的实现是在deleteExecutor
方法中