AdaptixC2武器化二开
字数 4448 2025-10-01 14:05:44
AdaptixC2 武器化二次开发实战教程
概述
本文档详细解析了对开源C2框架 AdaptixC2 进行两项关键技术改造的过程:1. 客户端界面国际化(汉化) 和 2. Beacon Loader 的实战化武器改造以提升抗AV/EDR能力。教程基于对源代码的修改,旨在提供深入、可操作的技术指南。
第一部分:基于 Qt LinguistTools 的客户端汉化
一、 目标与准备工作
- 目标:为 AdaptixC2 客户端 (AdaptixClient) 增加多语言支持(以中文为例),实现界面文本的本地化显示。
- 环境与前提:
- IDE: Qt Creator 17.0.1 (Community)
- 源码: 自备 AdaptixC2 Server 与 Agent (Client) 的源代码
- Qt 组件: 确保已安装
LinguistTools组件。
二、 项目实施步骤
1. 修改项目配置文件 (CMakeLists.txt)
- 在
find_package部分添加LinguistTools组件依赖。find_package(Qt6 REQUIRED COMPONENTS Core Gui Widgets Network WebSockets Sql Qml LinguistTools # 新增:翻译工具支持 ) - 在文件末尾添加翻译文件设置,并将其编译进Qt资源系统中。
# 国际化多语言支持 set(TS_FILES translations/adaptix_zh_CN.ts) # 使用Qt6的标准翻译功能 将qm编译进资源中 qt6_add_translations(AdaptixClient TS_FILES ${TS_FILES} RESOURCE_PREFIX "/translations" )
2. 修改主程序入口 (main.cpp)
- 添加必要的头文件。
#include <QTranslator> #include <QLocale> - 在
QApplication对象创建后、主窗口显示前,安装翻译器。此代码会根据系统语言环境自动加载对应的.qm文件。int main(int argc, char *argv[]) { QApplication a(argc, argv); // --- 添加国际化支持 --- static QTranslator translator; // 保证 translator 不会在 main() 结束后被销毁 // 获取当前系统的语言环境,例如 "zh_CN" QString locale = QLocale::system().name(); // 资源路径 QString translationFile = QString(":/translations/adaptix_%1.qm").arg(locale); if (translator.load(translationFile)) { a.installTranslator(&translator); } // --- 结束 --- MainAdaptix w; w.show(); return a.exec(); }
3. 处理源代码中的字符串
- 核心规则:将所有需要翻译的固定界面文本用
tr()函数包裹。 - 示例 (
DialogConnect.cpp):// 原代码 this->setWindowTitle("Connect"); label_User->setText("User:"); // 修改后 this->setWindowTitle(tr("Connect")); label_User->setText(tr("User:")); - 关键问题修复:某些自定义 Widget 类因缺少
Q_OBJECT宏而无法使用tr()。- 解决方案:在类声明中添加
Q_OBJECT宏。 - 修改文件:
AxConsoleWidget.h,ConsoleWidget.h等。
class MyWidget : public QWidget { Q_OBJECT // 必须添加此行 // ... 其他成员 ... }; - 解决方案:在类声明中添加
4. 生成与处理翻译文件 (.ts)
-
生成 TS 文件:在项目根目录打开终端,使用
lupdate工具扫描源代码并生成或更新.ts文件。lupdate -no-obsolete -locations relative Source/ Headers/ -ts translations/adaptix_zh_CN.ts- 成功后提示找到若干可翻译字符串。
-
翻译字符串:
- 使用 Qt Linguist 工具打开
adaptix_zh_CN.ts文件。 - 在界面中逐条填写源文本(英文)对应的翻译(中文)。
- 校对后保存。
- 使用 Qt Linguist 工具打开
-
发布翻译:在 Qt Linguist 中点击“发布”按钮,或使用
lrelease命令将.ts文件编译为二进制的.qm文件。lrelease translations/adaptix_zh_CN.ts- 生成的
adaptix_zh_CN.qm文件会根据CMakeLists.txt的配置自动嵌入到程序资源中。
- 生成的
5. 编译与测试
- 在 Qt Creator 中重新构建整个项目 (Build -> Build All)。
- 运行编译后的程序,客户端界面应已根据系统语言显示为中文。
6. 注意事项与局限性
- 扩展命令:由服务端
ax_config.axs文件或第三方扩展定义的命令/功能名称,其文本通常未在客户端代码中,因此无法通过此方法汉化。文中采用了对ax_config.axs进行硬编码修改的取巧方法。 - 动态切换:本教程实现的是启动时根据系统语言确定界面语言。如需在运行时动态切换,需实现
changeEvent事件监听和retranslateUi函数,更为复杂。
第二部分:Beacon Loader 的实战化武器改造
一、 目标与思路
- 目标:增强原版 AdaptixC2 Beacon 的免杀能力,使其能绕过主流杀毒软件 (AV) 和终端检测响应 (EDR) 的检测,满足实战需求。
- 核心思路:分离执行流程,采用多阶段加载和隐蔽持久化技术。
- Loader(加载器):一个高度免杀的初始程序,负责解密、加载并执行核心DLL。
- DLL(核心模块):包含实际的Shellcode加载和执行逻辑。
- Shellcode:从AdaptixC2生成的加密的
agent.x64.bin。
二、 技术实现细节
1. Shellcode 预处理
- 原始
agent.x64.bin文件极易被检测。需先进行加密/编码。 - 方法:使用简单的 XOR 异或加密,并可转换为 Base64 编码字符串方便存储。
- 操作:编写一个Python脚本(或其他语言)对
agent.x64.bin进行加密,然后将加密后的 payload 部署到远程服务器(如云存储、GitHub Gist等)或嵌入到Loader中。
2. Loader(加载器)设计 - C# (.NET)
Loader 承担核心的免杀和持久化职责。
-
功能 1: 内存加载 .NET DLL
- 技术:使用
Assembly.Load()直接从内存字节数组加载DLL,避免DLL文件落地。 - 流程:Loader 自身包含加密的DLL数据 -> 在内存中解密 -> 调用
Assembly.Load(decryptedBytes)-> 通过反射调用DLL的入口方法。
- 技术:使用
-
功能 2: 反分析技术
- 反虚拟机 (Anti-VM):检查常见虚拟机特征(如特定进程、硬件信息、注册表项)。
- 反调试 (Anti-Debug):检查调试器是否存在(如
IsDebuggerPresent, 检查运行时间)。 - 反沙箱 (Anti-Sandbox):检查系统运行时间、内存大小、CPU核心数等,排除短时运行的沙箱环境。
-
功能 3: 持久化驻留机制 - WMI 事件订阅
- 优势:高级、隐蔽、系统级权限,难以发现和清除。
- 核心组件:
- __EventFilter: 定义触发条件。例如:
SELECT * FROM __InstanceModificationEvent WITHIN 60 WHERE TargetInstance ISA 'Win32_Process' AND TargetInstance.Name='explorer.exe'或更常见的 系统启动后一段时间触发:SELECT * FROM __InstanceModificationEvent WHERE TargetInstance ISA 'Win32_LocalTime' AND TargetInstance.Second = 0 AND TargetInstance.Minute = 0 AND TargetInstance.Hour = 0(每天午夜) 或使用 系统运行时间:SELECT * FROM __InstanceModificationEvent WITHIN 60 WHERE TargetInstance ISA 'Win32_OperatingSystem' AND TargetInstance.SystemUpTime >= 300 AND TargetInstance.SystemUpTime < 360(系统启动后5-6分钟)。 - ActiveScriptEventConsumer: 执行动作。使用VBScript/JScript执行命令,无需落地exe文件。命令为:
forfiles /p %APPDATA% /m <Loader_Name> /c "<Loader_Full_Path>"。- 利用
forfiles.exe:这是一个合法的、有微软签名的系统程序。用它来启动Loader,可以破坏进程父子关系,使检测引擎难以关联恶意行为与持久化源,提升迷惑性。
- 利用
- __FilterToConsumerBinding: 将上述过滤器和消费者绑定起来。
- __EventFilter: 定义触发条件。例如:
- 流程:Loader 首次运行时,以高权限创建上述三个WMI实例,实现持久化。随后可将自身复制到
%APPDATA%等隐蔽目录,并删除原始文件。
3. DLL(核心模块)设计 - C/C++
DLL 负责最终执行Shellcode。
-
功能 1: 加载远程Shellcode
- 从预设的URL下载加密的(Base64+XOR)Shellcode。
- 在内存中进行解密,得到原始的
agent.x64.bin数据。
-
功能 2: 进程注入
- 技术:共享内存区注入 (Section Injection) 或 进程镂空 (Process Hollowing)。
- 目标进程:寄生到
explorer.exe等合法、常见的系统进程中,以掩盖恶意行为。 - 流程:
- 创建目标进程(或打开现有进程),并将其挂起。
- 在目标进程内存中分配空间,写入解密后的Shellcode。
- 通过设置进程上下文、调用
CreateRemoteThread或QueueUserAPC等方式,在目标进程中执行Shellcode。
三、 武器化流程与检测规避
- 生成Payload:在AdaptixC2中创建HTTPS监听器,生成 Shellcode 类型的Payload (
agent.x64.bin)。 - 加密Payload:使用提供的Python脚本加密
agent.x64.bin,并上传到远程服务器。 - 编译Loader&DLL:分别编译Loader(C#)和DLL(C++)项目。将加密后的DLL数据以字节数组形式嵌入到Loader代码中。
- 分发:将最终的Loader可执行文件进行伪装(如:伪装成PDF文档的图标,实际为exe;或与诱饵文档捆绑)。
- 执行链:
- 受害者运行Loader。
- Loader 进行反分析检查,通过后则在内存加载DLL。
- DLL 从远程服务器下载加密Shellcode,解密后注入到
explorer.exe进程。 - Beacon 在
explorer.exe中上线。 - Loader 设置WMI持久化后自我删除并隐藏副本。
四、 注意事项
- 时效性:所有免杀技术都有时效性,需根据目标环境持续研究和迭代。
- Go环境问题:编译原版AdaptixC2时,若遇到生成Go Agent失败,通常是网络问题(无法下载Go依赖)或Go环境配置错误。需为服务器配置可靠的网络代理或国内镜像源,并检查Go环境完整性。
- 责任性:本文档仅用于安全技术研究和学习,请勿用于非法用途。
总结
本教程详细介绍了对AdaptixC2进行二次开发的两个核心方向:
- 国际化:通过修改源码、使用Qt国际化框架,实现了客户端的本地化,提升了操作体验。
- 武器化:通过多阶段加载、内存操作、反分析技术和隐蔽的WMI持久化等高级技术,显著提升了Beacon的隐蔽性和生存能力,使其更适用于对抗性环境。
这些改造充分体现了APT攻击中“代码开发”和“战术技巧”相结合的特点,为红队人员提供了深入的技术参考。