WebSocket 内存马,一种新型内存马技术
字数 1480 2025-08-12 11:34:00
WebSocket 内存马技术详解
1. 概述
WebSocket 内存马是一种新型的无文件内存驻留技术,利用 Java WebSocket (JSR356) 标准实现,具有隐蔽性强、无需第三方依赖等特点。本文详细解析其技术原理和实现方法。
2. 兼容性
-
已测试支持:
- Tomcat
- Spring
- Jetty
-
特殊支持:
- WebLogic (需特殊条件,详见 GitHub 项目)
-
未测试:
- Jboss/WildFly
3. WebSocket 技术背景
WebSocket 是全双工通信协议,特点包括:
- 客户端和服务端可双向通信
- 实时性高(适用于实时通知、协同编辑等场景)
- 主流浏览器和服务端框架都支持
4. 版本差异
- Tomcat 7.0.47之前:使用自定义 API 实现 WebSocket
- Tomcat 7.0.47之后:遵循 JSR356 标准
- JSR356:Java EE 7 的一部分,是 Java 官方的 WebSocket 编程规范
5. 服务端实现方式
5.1 注解方式 (@ServerEndpoint)
@ServerEndpoint(
value = "/ws/{userId}",
encoders = {MessageEncoder.class},
decoders = {MessageDecoder.class},
configurator = MyServerConfigurator.class
)
实现原理:
- Tomcat 启动时通过
WsSci内的ServletContainerInitializer初始化 Listener 和 servlet - 扫描 classpath 下带有
@ServerEndpoint注解的类并加入 WebSocket 服务 - 即使没有扫描到注解类,也会注册 Listener 和 servlet(因此在内存马扫描工具中能看到 WsFilter)
5.2 继承抽象类 Endpoint 方式
相比注解方式:
- 需要自行实现
MessageHandler和ServerApplicationConfig - 提供更灵活的控制能力
示例代码:
ServerEndpointConfig serverEndpointConfig = ServerEndpointConfig.Builder
.create(WebSocketServerEndpoint3.class, "/ws/{userId}")
.decoders(decoderList)
.encoders(encoderList)
.configurator(new MyServerConfigurator())
.build();
6. WebSocket 内存马实现方法
核心思路:在服务启动后动态添加 WebSocket 端点
实现步骤:
- 创建 ServerEndpointConfig
- 获取 WebSocket ServerContainer
- 将配置加入容器
关键代码:
// 1. 创建配置
ServerEndpointConfig config = ServerEndpointConfig.Builder
.create(EndpointInject.class, "/ws")
.build();
// 2. 获取容器
ServerContainer container = (ServerContainer) req.getServletContext()
.getAttribute(ServerContainer.class.getName());
// 3. 添加端点
container.addEndpoint(config);
7. 技术优势
-
隐蔽性强:
- 不注册新的 Listener、servlet 或 Filter
- 内存马扫描工具难以检测异常
-
无需第三方依赖:
- 完全基于 JSR356 标准实现
8. 代理功能实现
WebSocket 内存马可用于构建高性能代理:
- 场景:不出网主机存在反序列化漏洞
- 传统方案:reGeorg 或端口复用
- 新方案:注入 WebSocket 代理内存马
使用示例:
./gost -L "socks5://:1080" -F "ws://127.0.0.1:8080?path=/proxy"
特点:
- 全双工通信
- 代理速度与普通 TCP 代理相当
9. 多功能 Shell 实现
9.1 工具适配要求
- 需要支持 WebSocket 协议的管理工具
- 现有工具需修改源码才能支持
9.2 实现方案
方案一(直接连接):
- 注入内存马
- 直接连接 WebSocket 端点
方案二(通过 JSP 中转):
- 使用传统 JSP 马执行代码
- 发送初始化 class 注册 WebSocket 端点
- 连接 WebSocket 端点
- 发送恶意 class 实现功能
10. 防御建议
- 监控 WebSocket 端点动态注册行为
- 限制 WebSocket 端点的创建权限
- 定期检查内存中的 WebSocket 服务
- 更新中间件至最新版本
11. 总结
WebSocket 内存马技术代表了内存驻留技术的新方向,其隐蔽性和功能性使其成为高级威胁的有效载体。安全团队应充分了解其原理,才能有效防御此类攻击。