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 注入流程
-
连接目标 JVM:
- 使用
VirtualMachine.attach(pid)连接到运行中的 Java 进程 - 动态注入 Agent(避免静态注入易被检测的问题)
- 使用
-
Agent 加载:
- 实现
agentmain方法作为入口点 - 获取
Instrumentation实例
- 实现
-
类转换:
- 使用
Instrumentation.addTransformer()注册类转换器 - 在转换器中修改目标类的字节码
- 使用
2. WebSocket 后门实现
关键组件:
-
WebSocket 管理器:
- 伪装成正常业务功能(如用户聊天、推送系统)
- 负责建立和维护 WebSocket 连接
-
数据加密:
- 使用 AES 对称加密算法
- 加密所有通信数据(除初始命令外)
-
命令执行:
- 实现
CommandHandler处理接收到的命令 - 执行系统命令并返回结果
- 实现
-
数据包设计:
- 格式与正常业务数据包一致
- 避免触发 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. 检测与防护
-
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
- 执行注入:
VirtualMachine vm = VirtualMachine.attach(pid); vm.loadAgent("agent.jar", "args"); vm.detach();
2. 效果展示
- 正常业务中隐藏的 WebSocket 通信
- 加密的命令执行结果返回
- 系统监控中无明显异常进程
六、扩展应用
- 业务逻辑劫持:修改现有 WebSocket 业务逻辑
- 数据窃取:拦截敏感业务数据传输
- 横向移动:作为跳板攻击内网其他系统
七、总结
Java Agent 注入 WebSocket 技术提供了一种高隐蔽性的持久化访问方式,通过 JVM 层面的修改和 WebSocket 协议的天然优势,能够有效规避传统安全检测。防御方需要从 JVM 安全配置、运行时监控和异常行为检测等多维度构建防护体系。