Java Agent 注入 WebSocket 篇
字数 1687 2025-08-29 22:41:10

Java Agent 注入 WebSocket 技术详解

一、核心概念

1. Java Agent 基础

Java Agent 是一种特殊的 Java 程序,它能够在 JVM 启动时或运行时加载,用于监测、修改或增强其他 Java 程序的行为。主要涉及三个核心概念:

  • premain:在 JVM 启动阶段调用的方法,通常用于静态加载 Agent
  • agentmain:在 JVM 运行时动态加载 Agent 时调用的方法
  • Instrumentation:提供修改类字节码、监控类加载等功能的 API

2. 为什么选择 Java Agent + WebSocket

  • 隐蔽性:相比传统内存马,Agent 注入不改动源码,更难被检测
  • 持久性:长期维持通信信道
  • 业务融合:可植入现有业务流程(如聊天系统、推送系统)
  • 绕过 WAF:WebSocket 协议本身能有效规避传统 WAF 检测

二、技术实现

1. Agent 注入流程

  1. 连接目标 JVM

    • 使用 VirtualMachine.attach(pid) 连接到运行中的 Java 进程
    • 动态注入 Agent(避免静态注入易被检测的问题)
  2. Agent 加载

    • 实现 agentmain 方法作为入口点
    • 获取 Instrumentation 实例
  3. 类转换

    • 使用 Instrumentation.addTransformer() 注册类转换器
    • 在转换器中修改目标类的字节码

2. WebSocket 后门实现

关键组件:

  1. WebSocket 管理器

    • 伪装成正常业务功能(如用户聊天、推送系统)
    • 负责建立和维护 WebSocket 连接
  2. 数据加密

    • 使用 AES 对称加密算法
    • 加密所有通信数据(除初始命令外)
  3. 命令执行

    • 实现 CommandHandler 处理接收到的命令
    • 执行系统命令并返回结果
  4. 数据包设计

    • 格式与正常业务数据包一致
    • 避免触发 WAF 规则

代码结构示例:

// WebSocket 处理器核心代码
public class WebSocketHandler extends WebSocketServlet {
    
    // 加密通信
    private AESUtil aesUtil = new AESUtil("your-secret-key");
    
    @Override
    protected void doMessage(WebSocket conn, String message) {
        // 解密消息
        String decrypted = aesUtil.decrypt(message);
        
        // 处理命令
        String result = CommandHandler.execute(decrypted);
        
        // 加密返回
        conn.send(aesUtil.encrypt(result));
    }
}

3. 构建配置

Maven 关键依赖(pom.xml):

<dependencies>
    <!-- Java Agent 核心 -->
    <dependency>
        <groupId>org.javassist</groupId>
        <artifactId>javassist</artifactId>
        <version>3.28.0-GA</version>
    </dependency>
    
    <!-- WebSocket 支持 -->
    <dependency>
        <groupId>javax.websocket</groupId>
        <artifactId>javax.websocket-api</artifactId>
        <version>1.1</version>
    </dependency>
    
    <!-- 加密库 -->
    <dependency>
        <groupId>org.bouncycastle</groupId>
        <artifactId>bcprov-jdk15on</artifactId>
        <version>1.68</version>
    </dependency>
</dependencies>

注意:关键依赖需要直接打包进最终 JAR 文件。

三、防御措施

1. 检测与防护

  1. JVM 参数配置

    • 添加 -XX:+DisableAttachMechanism 禁用 Attach 功能
    • 使用 -javaagent 参数白名单
  2. 运行时监控

    • 监控 VirtualMachine.attach 调用
    • 检查非授权 Agent 加载
  3. 类加载审计

    • 监控关键类的字节码修改
    • 检查 WebSocket 处理器的异常行为

2. 应急响应

  1. 识别异常 WebSocket 连接

    • 检查非业务路径的 WebSocket 通信
    • 分析加密通信模式
  2. 清除恶意 Agent

    • 使用 jcmd <pid> VM.command_line 查看加载的 Agent
    • 重启受感染的 Java 服务

四、技术优势与局限

优势:

  • 高隐蔽性:与业务深度融合,难以通过流量分析发现
  • 持久性:Agent 注入存活时间长,不受应用重启影响
  • 绕过能力:WebSocket + 加密有效规避传统安全设备

局限:

  • 需要目标系统启用 Attach 机制
  • 对高版本 Java 兼容性可能存在问题
  • 复杂的加密会增加 CPU 负载

五、实战演示

1. 注入流程

  1. 启动 WebSocket C2 服务器
  2. 定位目标 Java 进程 PID
  3. 执行注入:
    VirtualMachine vm = VirtualMachine.attach(pid);
    vm.loadAgent("agent.jar", "args");
    vm.detach();
    

2. 效果展示

  • 正常业务中隐藏的 WebSocket 通信
  • 加密的命令执行结果返回
  • 系统监控中无明显异常进程

六、扩展应用

  1. 业务逻辑劫持:修改现有 WebSocket 业务逻辑
  2. 数据窃取:拦截敏感业务数据传输
  3. 横向移动:作为跳板攻击内网其他系统

七、总结

Java Agent 注入 WebSocket 技术提供了一种高隐蔽性的持久化访问方式,通过 JVM 层面的修改和 WebSocket 协议的天然优势,能够有效规避传统安全检测。防御方需要从 JVM 安全配置、运行时监控和异常行为检测等多维度构建防护体系。

Java Agent 注入 WebSocket 技术详解 一、核心概念 1. Java Agent 基础 Java Agent 是一种特殊的 Java 程序,它能够在 JVM 启动时或运行时加载,用于监测、修改或增强其他 Java 程序的行为。主要涉及三个核心概念: premain :在 JVM 启动阶段调用的方法,通常用于静态加载 Agent agentmain :在 JVM 运行时动态加载 Agent 时调用的方法 Instrumentation :提供修改类字节码、监控类加载等功能的 API 2. 为什么选择 Java Agent + WebSocket 隐蔽性 :相比传统内存马,Agent 注入不改动源码,更难被检测 持久性 :长期维持通信信道 业务融合 :可植入现有业务流程(如聊天系统、推送系统) 绕过 WAF :WebSocket 协议本身能有效规避传统 WAF 检测 二、技术实现 1. Agent 注入流程 连接目标 JVM : 使用 VirtualMachine.attach(pid) 连接到运行中的 Java 进程 动态注入 Agent(避免静态注入易被检测的问题) Agent 加载 : 实现 agentmain 方法作为入口点 获取 Instrumentation 实例 类转换 : 使用 Instrumentation.addTransformer() 注册类转换器 在转换器中修改目标类的字节码 2. WebSocket 后门实现 关键组件: WebSocket 管理器 : 伪装成正常业务功能(如用户聊天、推送系统) 负责建立和维护 WebSocket 连接 数据加密 : 使用 AES 对称加密算法 加密所有通信数据(除初始命令外) 命令执行 : 实现 CommandHandler 处理接收到的命令 执行系统命令并返回结果 数据包设计 : 格式与正常业务数据包一致 避免触发 WAF 规则 代码结构示例: 3. 构建配置 Maven 关键依赖(pom.xml): 注意 :关键依赖需要直接打包进最终 JAR 文件。 三、防御措施 1. 检测与防护 JVM 参数配置 : 添加 -XX:+DisableAttachMechanism 禁用 Attach 功能 使用 -javaagent 参数白名单 运行时监控 : 监控 VirtualMachine.attach 调用 检查非授权 Agent 加载 类加载审计 : 监控关键类的字节码修改 检查 WebSocket 处理器的异常行为 2. 应急响应 识别异常 WebSocket 连接 : 检查非业务路径的 WebSocket 通信 分析加密通信模式 清除恶意 Agent : 使用 jcmd <pid> VM.command_line 查看加载的 Agent 重启受感染的 Java 服务 四、技术优势与局限 优势: 高隐蔽性 :与业务深度融合,难以通过流量分析发现 持久性 :Agent 注入存活时间长,不受应用重启影响 绕过能力 :WebSocket + 加密有效规避传统安全设备 局限: 需要目标系统启用 Attach 机制 对高版本 Java 兼容性可能存在问题 复杂的加密会增加 CPU 负载 五、实战演示 1. 注入流程 启动 WebSocket C2 服务器 定位目标 Java 进程 PID 执行注入: 2. 效果展示 正常业务中隐藏的 WebSocket 通信 加密的命令执行结果返回 系统监控中无明显异常进程 六、扩展应用 业务逻辑劫持 :修改现有 WebSocket 业务逻辑 数据窃取 :拦截敏感业务数据传输 横向移动 :作为跳板攻击内网其他系统 七、总结 Java Agent 注入 WebSocket 技术提供了一种高隐蔽性的持久化访问方式,通过 JVM 层面的修改和 WebSocket 协议的天然优势,能够有效规避传统安全检测。防御方需要从 JVM 安全配置、运行时监控和异常行为检测等多维度构建防护体系。