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在编译后的二进制中以以下结构存在:

  1. 4字节小端整数:表示加密配置区(cryptParams)的长度(profileSize)。
  2. 加密配置区:长度为profileSize的RC4加密数据。
  3. 16字节RC4密钥:紧跟在加密配置区之后,用于解密前面的数据。

4. 静态提取EncryptKey实战步骤

4.1 定位特征

由于Profile结构是确定的,我们可以通过以下特征在二进制中定位密钥:

  1. 搜索特征字符串"agent.x64""agent.x86",初步定位相关代码区域。
  2. 更直接的方法是搜索静态特征:Undefined symbol(x86和x64样本均存在此字符串)。
  3. 在该字符串前方附近即可找到16字节的RC4密钥。

4.2 操作验证

  1. 使用十六进制编辑器打开agent.x64.exe样本。
  2. 搜索字符串 Undefined symbol,定位其位置。
  3. 在此位置向前偏移少量字节(例如在提供的案例中,密钥位于文件偏移0x124DE处),可找到连续的16字节数据:90 98 98 F9 E3 68 6A AF E3 F1 5B D2 1D 43 A5 D1
  4. 此即为RC4加密密钥:909898f9e3686aafe3f15bd21d43a5d1

4.3 解密Profile配置

获取密钥后,即可解密Profile:

  1. 根据Profile结构,先读取4字节的profileSize(小端序)。
  2. 读取紧接着的profileSize长度的数据,此为加密的配置数据。
  3. 使用提取出的16字节RC4密钥解密该数据。
  4. 解密后的数据是序列化的配置参数,可进一步反序列化得到明文的C2服务器地址、端口、URI、User-Agent等关键信息。

5. 自动化脚本思路

可编写Python脚本自动完成此过程:

  1. 读取整个二进制文件数据。
  2. 搜索特征串Undefined symbol,并计算密钥的可能位置。
  3. 提取密钥,并逆向解析前方的profileSize和加密数据。
  4. 用RC4算法解密数据并输出解析结果。

第二部分:Listener流量特征魔改与规避

1. 前言与目标

本部分旨在魔改AdaptixC2 HTTP Listener的默认流量特征,使其伪装成正常业务流量,以规避网络流量审查和安全设备检测。

2. 默认特征分析

  • 服务端特征
    • 默认监听端口:4321
    • 默认URI:/endpoint
    • 显眼的错误页面
    • HTTP响应头包含明显特征:Server: AdaptixC2Adaptix 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编码。

需要修改的文件:

  1. 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
  2. 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. 部署与验证

  1. 完成源码修改后,重新编译生成Agent(make)和重启Listener。
  2. 使用新Agent上线,抓取流量进行分析。
  3. 验证流量是否已变为JSON格式,并且整个通信过程(包括错误页面、HTTP头)与所伪装的业务(如路由器后台)无异。
  4. (可选)使用各类流量审计工具、沙箱或大模型进行检测,验证绕过效果。

5. 进阶魔改思路

  • 动态URI/Header:使每次请求的URI或部分Header值动态变化(基于时间、会话ID等)。
  • 多重加密/编码:在RC4和Base64之外,增加自定义的编码或加密步骤。
  • 模仿知名API:完全仿照某个公开的云服务API(如AWS、Azure)的签名和数据结构。
  • 域前置(Domain Fronting):结合CDN服务,将流量伪装成对合法大型网站的访问。

总结:通过静态分析可提取Agent密钥解密配置,通过魔改服务端配置和源码可有效隐藏C2流量特征。关键在于深度模仿目标环境的正常流量和行为,并尽量减少任何工具化、模式化的特征。

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流量特征。关键在于深度模仿目标环境的正常流量和行为,并尽量减少任何工具化、模式化的特征。