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 方式

相比注解方式:

  • 需要自行实现 MessageHandlerServerApplicationConfig
  • 提供更灵活的控制能力

示例代码:

ServerEndpointConfig serverEndpointConfig = ServerEndpointConfig.Builder
    .create(WebSocketServerEndpoint3.class, "/ws/{userId}")
    .decoders(decoderList)
    .encoders(encoderList)
    .configurator(new MyServerConfigurator())
    .build();

6. WebSocket 内存马实现方法

核心思路:在服务启动后动态添加 WebSocket 端点

实现步骤:

  1. 创建 ServerEndpointConfig
  2. 获取 WebSocket ServerContainer
  3. 将配置加入容器

关键代码:

// 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. 技术优势

  1. 隐蔽性强

    • 不注册新的 Listener、servlet 或 Filter
    • 内存马扫描工具难以检测异常
  2. 无需第三方依赖

    • 完全基于 JSR356 标准实现

8. 代理功能实现

WebSocket 内存马可用于构建高性能代理:

  1. 场景:不出网主机存在反序列化漏洞
  2. 传统方案:reGeorg 或端口复用
  3. 新方案:注入 WebSocket 代理内存马

使用示例

./gost -L "socks5://:1080" -F "ws://127.0.0.1:8080?path=/proxy"

特点:

  • 全双工通信
  • 代理速度与普通 TCP 代理相当

9. 多功能 Shell 实现

9.1 工具适配要求

  • 需要支持 WebSocket 协议的管理工具
  • 现有工具需修改源码才能支持

9.2 实现方案

方案一(直接连接):

  1. 注入内存马
  2. 直接连接 WebSocket 端点

方案二(通过 JSP 中转):

  1. 使用传统 JSP 马执行代码
  2. 发送初始化 class 注册 WebSocket 端点
  3. 连接 WebSocket 端点
  4. 发送恶意 class 实现功能

10. 防御建议

  1. 监控 WebSocket 端点动态注册行为
  2. 限制 WebSocket 端点的创建权限
  3. 定期检查内存中的 WebSocket 服务
  4. 更新中间件至最新版本

11. 总结

WebSocket 内存马技术代表了内存驻留技术的新方向,其隐蔽性和功能性使其成为高级威胁的有效载体。安全团队应充分了解其原理,才能有效防御此类攻击。

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) 实现原理 : Tomcat 启动时通过 WsSci 内的 ServletContainerInitializer 初始化 Listener 和 servlet 扫描 classpath 下带有 @ServerEndpoint 注解的类并加入 WebSocket 服务 即使没有扫描到注解类,也会注册 Listener 和 servlet(因此在内存马扫描工具中能看到 WsFilter) 5.2 继承抽象类 Endpoint 方式 相比注解方式: 需要自行实现 MessageHandler 和 ServerApplicationConfig 提供更灵活的控制能力 示例代码: 6. WebSocket 内存马实现方法 核心思路:在服务启动后动态添加 WebSocket 端点 实现步骤: 创建 ServerEndpointConfig 获取 WebSocket ServerContainer 将配置加入容器 关键代码: 7. 技术优势 隐蔽性强 : 不注册新的 Listener、servlet 或 Filter 内存马扫描工具难以检测异常 无需第三方依赖 : 完全基于 JSR356 标准实现 8. 代理功能实现 WebSocket 内存马可用于构建高性能代理: 场景 :不出网主机存在反序列化漏洞 传统方案 :reGeorg 或端口复用 新方案 :注入 WebSocket 代理内存马 使用示例 : 特点: 全双工通信 代理速度与普通 TCP 代理相当 9. 多功能 Shell 实现 9.1 工具适配要求 需要支持 WebSocket 协议的管理工具 现有工具需修改源码才能支持 9.2 实现方案 方案一 (直接连接): 注入内存马 直接连接 WebSocket 端点 方案二 (通过 JSP 中转): 使用传统 JSP 马执行代码 发送初始化 class 注册 WebSocket 端点 连接 WebSocket 端点 发送恶意 class 实现功能 10. 防御建议 监控 WebSocket 端点动态注册行为 限制 WebSocket 端点的创建权限 定期检查内存中的 WebSocket 服务 更新中间件至最新版本 11. 总结 WebSocket 内存马技术代表了内存驻留技术的新方向,其隐蔽性和功能性使其成为高级威胁的有效载体。安全团队应充分了解其原理,才能有效防御此类攻击。