AdaptixC2样本分析及流量特征魔改
字数 3455 2025-09-23 19:27:46
AdaptixC2样本分析与流量特征魔改技术文档
第一部分:Agent样本分析与EncryptKey提取
1. 前言与目标
本部分旨在通过静态分析agent.x64.exe样本,定位并提取出RC4加密密钥(EncryptKey),并解密其内嵌的配置Profile,从而获取C2连接信息(如地址、端口、URI等)。这是在仅有一个样本且无源码情况下的实战分析方法。
2. 环境与工具
- 分析对象:AdaptixC2生成的Agent样本(如
agent.x64.exe) - 关键工具:
- IDE(如VS Code, JetBrains GoLand)
- 十六进制编辑器(如010 Editor, HxD)
- 脚本环境(Python)
3. 关键源码分析(基于AdaptixC2 v0.8源码)
3.1 Agent生成逻辑定位
- 核心文件:
AdaptixC2_main_v0.8\Extenders\agent_beacon\pl_agent.go - 关键代码段:Agent生成时根据架构(x86/x64)使用MinGW-w64交叉编译工具链编译C++源码。
- Profile和EncryptKey的处理:
encrypt_key从Listener配置中获取,并经过Base64解码为二进制密钥。- Profile参数(如C2地址、HTTP方法、URI等)被序列化(
PackArray)后,使用该RC4密钥加密。 - 最终Profile结构为:
[len(cryptParams), cryptParams, encryptKey],再序列化后写入config.cpp并编译进二进制。
3.2 Profile结构详解
Profile在编译后的二进制中以以下结构存在:
- 4字节小端整数:表示加密配置区(
cryptParams)的长度(profileSize)。 - 加密配置区:长度为
profileSize的RC4加密数据。 - 16字节RC4密钥:紧跟在加密配置区之后,用于解密前面的数据。
4. 静态提取EncryptKey实战步骤
4.1 定位特征
由于Profile结构是确定的,我们可以通过以下特征在二进制中定位密钥:
- 搜索特征字符串
"agent.x64"或"agent.x86",初步定位相关代码区域。 - 更直接的方法是搜索静态特征:
Undefined symbol(x86和x64样本均存在此字符串)。 - 在该字符串前方附近即可找到16字节的RC4密钥。
4.2 操作验证
- 使用十六进制编辑器打开
agent.x64.exe样本。 - 搜索字符串
Undefined symbol,定位其位置。 - 在此位置向前偏移少量字节(例如在提供的案例中,密钥位于文件偏移
0x124DE处),可找到连续的16字节数据:90 98 98 F9 E3 68 6A AF E3 F1 5B D2 1D 43 A5 D1。 - 此即为RC4加密密钥:
909898f9e3686aafe3f15bd21d43a5d1。
4.3 解密Profile配置
获取密钥后,即可解密Profile:
- 根据Profile结构,先读取4字节的
profileSize(小端序)。 - 读取紧接着的
profileSize长度的数据,此为加密的配置数据。 - 使用提取出的16字节RC4密钥解密该数据。
- 解密后的数据是序列化的配置参数,可进一步反序列化得到明文的C2服务器地址、端口、URI、User-Agent等关键信息。
5. 自动化脚本思路
可编写Python脚本自动完成此过程:
- 读取整个二进制文件数据。
- 搜索特征串
Undefined symbol,并计算密钥的可能位置。 - 提取密钥,并逆向解析前方的
profileSize和加密数据。 - 用RC4算法解密数据并输出解析结果。
第二部分:Listener流量特征魔改与规避
1. 前言与目标
本部分旨在魔改AdaptixC2 HTTP Listener的默认流量特征,使其伪装成正常业务流量,以规避网络流量审查和安全设备检测。
2. 默认特征分析
- 服务端特征:
- 默认监听端口:
4321 - 默认URI:
/endpoint - 显眼的错误页面
- HTTP响应头包含明显特征:
Server: AdaptixC2和Adaptix Version: v0.8
- 默认监听端口:
3. 流量魔改方案
3.1 服务端配置魔改
修改文件:profile.json (或通过Web界面配置)
- 更改监听端口:将
"port": 4321改为一个非常见大端口,例如18080。 - 伪装端点URI:将
"endpoint": "/endpoint"改为常见的业务接口或管理页面路径,例如/manager/html(模仿Tomcat)。 - 强化密码:将默认密码
"pass"改为符合强度要求的复杂密码。 - 伪装HTTP头:
"Server": "AdaptixC2"->"Server": "Apache-Coyote/1.1"(Tomcat)- 删除
"Adaptix Version": "v0.8"头。
- 自定义错误页面:修改
404page.html等内容,将其替换为目标环境常见的错误页面(如路由器登录页、公司自定义404页),并将关键样式、图片内嵌为Base64,实现单文件化。
3.2 流量内容伪装策略
- 模仿特定业务:选择一种高频、有规律数据刷新且不易引人怀疑的业务作为伪装模板,例如:
- 路由器设备管理后台
- 大数据平台监控仪表盘
- 物联网设备状态上报
- 设计Page Payload:在用于隐藏Payload的HTML页面(
page-payload)中,寻找一个合适的字段(如JSON键值对、HTML注释等)插入特殊标记<<<PAYLOAD_DATA>>>,C2通信数据会替换此标记。
3.3 请求体加密增强(源码层魔改)
默认情况下,Agent的请求体是RC4加密后的原始二进制数据,特征明显。可修改源码,为请求体增加一层JSON包装和Base64编码。
需要修改的文件:
- Agent端 (C++):
AdaptixC2-main_v0.8\Extenders\agent_beacon\src_beacon\beacon\ConnectorHTTP.cpp- 在发送数据前,将加密后的二进制数据进行Base64编码。
- 将Base64字符串嵌入到一个JSON结构中,例如:
{"data": "<Base64_String>"}。 - 设置HTTP Header:
Content-Type: application/json。
- Server端 (Go):
AdaptixC2-main_v0.8\Extenders\listener_beacon_http\pl_http.go- 在解析请求时,先解析JSON body。
- 提取
data字段的值,进行Base64解码。 - 将解码后的数据再进行RC4解密,得到原始Payload。
魔改后效果:
- 原始请求:
(RC4密文) - 魔改后请求:
{"data": "Base64(RC4密文)"} - 流量特征从原始的二进制流变为看似正常的JSON API通信,大大增强了隐蔽性。
4. 部署与验证
- 完成源码修改后,重新编译生成Agent(
make)和重启Listener。 - 使用新Agent上线,抓取流量进行分析。
- 验证流量是否已变为JSON格式,并且整个通信过程(包括错误页面、HTTP头)与所伪装的业务(如路由器后台)无异。
- (可选)使用各类流量审计工具、沙箱或大模型进行检测,验证绕过效果。
5. 进阶魔改思路
- 动态URI/Header:使每次请求的URI或部分Header值动态变化(基于时间、会话ID等)。
- 多重加密/编码:在RC4和Base64之外,增加自定义的编码或加密步骤。
- 模仿知名API:完全仿照某个公开的云服务API(如AWS、Azure)的签名和数据结构。
- 域前置(Domain Fronting):结合CDN服务,将流量伪装成对合法大型网站的访问。
总结:通过静态分析可提取Agent密钥解密配置,通过魔改服务端配置和源码可有效隐藏C2流量特征。关键在于深度模仿目标环境的正常流量和行为,并尽量减少任何工具化、模式化的特征。