AdaptixC2通信机制与流量解密分析(listener_gophertcp)
字数 3146 2025-10-01 14:05:45
AdaptixC2 Gopher TCP 通信机制与 mTLS 流量解密分析
1. 概述
AdaptixC2 是一个命令与控制(C2)框架,支持多种通信协议。本文重点分析其 Gopher TCP 监听器(listener_gopher_tcp)的通信机制,并详细介绍如何解密其 mTLS(双向 TLS)加密流量。
2. Agent 类型与特性
AdaptixC2 提供多种 Agent 类型,各有不同特性和用途:
| Agent 类型 | 通信协议 | 主要功能 | 适用操作系统 |
|---|---|---|---|
| Beacon HTTP | HTTP/S | 文件浏览、进程浏览、SOCKS代理、端口转发 | Windows |
| Beacon SMB | SMB | 内网横向移动、点对点通信 | Windows |
| Beacon TCP | TCP | 特定网络环境下的隐蔽通信(异步/心跳模式) | Windows |
| Gopher TCP | TCP | 文件浏览、进程浏览、截图、SOCKS代理、远程终端、BOF | Windows, Linux, macOS |
典型攻击链:通过 Gopher 钓鱼批量上线不同操作系统机器,然后使用 Beacon 进行横向移动和长期潜伏。
3. mTLS 双向认证机制
3.1 标准 TLS vs mTLS
| 特性 | 标准 TLS (单向认证) | mTLS (双向认证) |
|---|---|---|
| 核心目标 | 确保通信加密,验证服务器真实性 | 确保通信加密,相互验证客户端和服务器 |
| 认证方向 | 单向:仅客户端验证服务器 | 双向:客户端和服务器相互验证 |
| 证书需求 | 服务器需要证书 | 服务器和客户端都需要证书 |
| 工作流程 | 1. 客户端连接服务器 2. 服务器出示证书 3. 客户端验证证书 4. 建立加密通道 |
1. 客户端连接服务器 2. 服务器出示证书 3. 客户端验证服务器证书 4. 服务器请求并验证客户端证书 5. 双方验证完成,建立加密通道 |
3.2 AdaptixC2 的 mTLS 实现
在 AdaptixC2 中:
- 客户端私钥 (client.key)、客户端证书 (client.cert)、CA 证书 (ca.cert) 会被 Base64 编码后打包到 Agent 配置文件中
- Agent 使用这些凭证与 C2 服务器建立 mTLS 连接
- 使用 TLS_AES_128_GCM_SHA256 密码套件 (0x1301),支持前向保密
4. 流量解密分析方法
4.1 所需工具
- AdaptixC2 Server 端与 Agent 端(需自备源码)
- IDE:用于代码分析和调试
- Wireshark:网络流量捕获和分析
- mitmproxy:中间人代理工具
- Ghidra:二进制逆向分析工具
- Proxifier:流量重定向工具(必须使用安装版,非便携版)
4.2 解密流程
步骤 1: 劫持 Agent 流量通过 mitmproxy
-
配置 Proxifier:
- 新建 Proxy Server:地址填本机,端口填 mitmproxy 端口,类型选 HTTPS
- 创建规则让 agent.exe 走该代理
- 关键:必须勾选"Resolve hostnames through proxy"和"Bypass proxy for local addresses"
-
启动 mitmproxy:
- 默认会显示 "TLSv1.3 alert certificate required" 错误
- 这是正常的,因为 mTLS 要求客户端提供证书
步骤 2: 从 Agent 提取证书和密钥配置
-
Ghidra 分析 Agent 二进制文件:
- 使用 GolangAnalyzerExtension 辅助分析
- 定位到
main.main函数 - 回溯找到配置数据存储的全局变量(通常为
DAT_xxx或PTR_DAT_xxx)
-
提取加密配置块:
- 找到存储配置数据的地址(如
DAT_00955620) - 确认数据长度(如 0x0F81 = 3969 字节)
- 以 "Byte String (No Spaces)" 格式复制完整数据块
- 找到存储配置数据的地址(如
-
Python 脚本解析配置:
# 读取并解析配置数据的示例代码框架 with open('data.txt', 'r') as f: encrypted_data = bytes.fromhex(f.read().strip()) # 前16字节为Listener Key listener_key = encrypted_data[:16] # 剩余部分为加密的配置信息 encrypted_config = encrypted_data[16:] # 使用AES-GCM解密配置 # 需要实现解密逻辑,参考AgentDecryptData函数 -
提取证书文件:
- 从解密后的配置中提取 client.key、client.cert 和 ca.cert
- 合并为 client_x.pem 文件供 mitmproxy 使用
步骤 3: 配置 mitmproxy 使用提取的证书
- 将提取的证书配置给 mitmproxy
- 重新运行 Agent,此时 mitmproxy 应能成功拦截和解密流量
4.3 通信协议分析
Agent 上线流程:
- Agent 启动后从内存中读取加密配置块(3969 字节)
- 读取前16字节作为 Listener Key
- 使用 Listener Key 解密剩余部分,获取 C2 地址、端口等配置信息
- Agent 准备上线信息(主机名、用户名、IP 地址等)
- 生成新的会话密钥 (Session Key)
- 将上线信息打包为 INIT_PACK
- 使用 Listener Key 和 AES-GCM 加密 INIT_PACK 并发送给服务器
- 后续通信使用 Session Key 进行加解密
数据包结构:
上线包采用三层嵌套的 Msgpack 结构:
- 外层:加密的配置信息
- 中层:Agent 元数据信息
- 内层:具体的任务指令和结果
4.4 加密函数分析
- AgentEncryptData: 加密函数,使用 AES-GCM 算法
- AgentDecryptData: 解密函数,执行逆操作
- 加密流程:
- 获取明文数据
- 使用派生的会话密钥作为 AES-128 密钥
- 生成唯一随机数 (Nonce)
- 将密钥、Nonce 和明文输入 AES-GCM 加密器
- 输出密文和认证标签
- 打包成 TLS 记录通过 TCP 发送
5. 技术难点与解决方案
难点 1: 证书验证绕过
问题:Agent 内置 CA 证书,会验证服务器证书合法性
解决方案:由于 Agent 配置中 InsecureSkipVerify: true,实际上禁用所有证书验证
难点 2: 函数定位困难
问题:Go 编译时使用 -s(移除符号表)和 -w(移除调试信息)
解决方案:使用 Ghidra 进行静态分析,通过特征码定位关键函数
难点 3: 配置提取复杂
问题:配置数据经过加密和编码处理
解决方案:通过分析二进制文件找到原始配置块,实现解密算法提取原始配置
6. 防护建议
- 网络监控:检测异常的 mTLS 连接和证书使用模式
- 证书审计:监控异常证书的生成和使用
- 行为分析:检测类似 Gopher TCP 的长连接行为
- 二进制加固:对关键组件进行混淆和加固,增加分析难度
7. 总结
AdaptixC2 的 Gopher TCP 监听器采用 mTLS 双向认证和自定义加密方案,提供了较强的隐蔽性。通过深入分析其通信机制和加解密流程,可以成功拦截和解密其流量,为检测和防御提供技术支持。关键点包括正确配置流量重定向、从二进制文件中提取加密配置、理解其多层加密协议结构。
本文基于对 AdaptixC2 框架的技术分析,仅用于安全研究和防御目的。