攻防渗透 | WebsocketAndTimer内存马的查杀分析和代码实现
字数 878 2025-08-10 17:51:46
WebsocketAndTimer内存马查杀分析与实现
前言
本文深入分析Websocket和Timer内存马的工作原理、检测方法和清除技术,基于对Tomcat内部机制的深入理解,提供完整的技术实现方案。
Websocket内存马原理分析
Websocket端点注册机制
Websocket内存马的核心在于动态注册恶意端点,关键注册点在WsServerContainer#addEndpoint方法:
- 构建恶意的
ServerEndpointConfig对象 - 获取path路径并将endpointClass封装成
ExactPathMatch对象 - 将映射关系存入
configExactMatchMap属性
Websocket请求处理流程
WsFilter过滤器拦截所有请求doFilter方法中调用WsServerContainer#findMapping- 根据path从
configExactMatchMap获取映射 - 若无映射则调用
chain.doFilter继续过滤器链
检测方法
Websocket内存马检测
public static void getWebsocketMaps() {
// 获取configExactMatchMap属性
Map<String, ExactPathMatch> configExactMatchMap = ...;
// 遍历映射表
for(Map.Entry<String, ExactPathMatch> entry : configExactMatchMap.entrySet()) {
ExactPathMatch match = entry.getValue();
ServerEndpointConfig config = match.getConfig();
// 关键检测点
String path = config.getPath();
Class<?> endpointClass = config.getEndpointClass();
// 检测恶意端点逻辑...
}
}
检测要点:
- 检查所有注册的Websocket端点
- 分析endpointClass是否为可疑类
- 验证path是否与正常业务匹配
Timer内存马检测
public static void checkTimerTasks() {
// 获取Timer线程组
ThreadGroup tg = Thread.currentThread().getThreadGroup();
// 遍历所有线程
Thread[] threads = new Thread[tg.activeCount()];
tg.enumerate(threads);
for(Thread thread : threads) {
if(thread.getName().contains("Timer")) {
// 获取Timer任务队列
Field queueField = Timer.class.getDeclaredField("queue");
queueField.setAccessible(true);
// 分析任务内容...
}
}
}
清除技术
Websocket内存马清除
- 从
configExactMatchMap移除恶意映射 - 卸载相关类加载器
- 清理WsFilter中的引用
public static void removeWebsocketMalware(String maliciousPath) {
// 获取configExactMatchMap
Map<String, ExactPathMatch> configExactMatchMap = ...;
// 移除恶意路径
configExactMatchMap.remove(maliciousPath);
// 清理类加载
ClassLoader maliciousLoader = ...;
unloadClassLoader(maliciousLoader);
}
Timer内存马清除
- 取消Timer任务
- 停止Timer线程
- 清理任务队列
public static void cleanTimerMalware(Timer maliciousTimer) {
// 取消所有任务
maliciousTimer.cancel();
// 中断Timer线程
for(TimerTask task : getTasksFromTimer(maliciousTimer)) {
task.cancel();
}
}
防御措施
- 运行时监控:监控Websocket端点动态注册
- 类加载控制:限制动态类加载能力
- 反射防护:保护关键字段不被篡改
- Timer审计:监控定时任务创建
- 内存扫描:定期扫描可疑内存对象
实现案例
Websocket内存马注入
public void injectWebsocketMemShell() throws Exception {
// 获取WsServerContainer实例
WsServerContainer container = getWsServerContainer();
// 构建恶意端点配置
ServerEndpointConfig config = ServerEndpointConfig.Builder.create(
MaliciousEndpoint.class, "/malicious-path").build();
// 注册恶意端点
Method addEndpoint = WsServerContainer.class.getDeclaredMethod(
"addEndpoint", ServerEndpointConfig.class);
addEndpoint.setAccessible(true);
addEndpoint.invoke(container, config);
}
Timer内存马注入
public void injectTimerMemShell() {
new Timer().schedule(new TimerTask() {
@Override
public void run() {
// 恶意逻辑...
}
}, 0, 60000); // 每分钟执行一次
}
总结
Websocket和Timer内存马利用容器内部机制实现持久化,检测和清除需要深入理解底层实现。防御应从多层面构建防护体系,结合静态规则和动态分析,才能有效应对这类高级威胁。