用于 Cobalt Strike Aggressor Scripts(.cna)的独立仿真与测试框架,可在没有 teamserver 的情况下验证语法、模拟 Beacon API,并通过 COFFLoader 执行 BOF。
CnaEmulator 是一个独立、通用的 Cobalt Strike Aggressor 脚本(.cna)开发、模拟与测试框架。它允许安全研究人员、工具开发者和 BOF 作者验证脚本语法、模拟 Beacon 控制台别名命令,并直接通过 COFFLoader64.exe 执行内存中的 Beacon 对象文件(BOF),而无需启动 teamserver 或 GUI 客户端。
[!WARNING] 免责声明:此代码完全由 Antigravity 生成,尚未经过审查。
check):
.cna 脚本。bof_pack):
datap 二进制格式匹配的原生小端序序列化:
'i':4 字节整数's':2 字节短整数'z':带长度前缀的以 null 结尾的字符串(strlen + 1 前缀)'Z':带长度前缀的宽 UTF-16LE 字符串'b':带长度前缀的二进制缓冲区beacon_inline_execute):
beacon_inline_execute($bid, $bof_data, "go", $packed_args)。COFFLoader64.exe go <bof_path> <hex_args>。test):
<script>.cna.tests 或 <script>.tests 场景套件。console):
beacon> ),支持已注册的别名、参数、帮助文档和实时执行。.
├── .gitignore # 编译二进制文件和字节码的 Git 忽略规则
├── COFFLoader64.exe # 64 位独立内存 COFF 重定位器和加载器
├── cna_emulator.bat # 便捷的 CLI 启动脚本
├── README.md # 全面的文档和使用指南
├── TESTING.md # 组件验证报告和质量门禁
├── TEST_SPEC.md # 48 场景 7 类别测试规范
└── CnaEmulator/ # Java CNA 模拟器组件
├── .gitignore # CnaEmulator 子文件夹的 Git 忽略规则
├── CnaEmulator.java # 模拟器源代码和 Sleep 引擎桥接
├── CnaEmulator.class # 编译后的字节码
├── CnaEmulator.jar # 打包的字节码 JAR
├── build.bat # 编译和打包 CnaEmulator 的构建脚本
├── test.bat # 独立测试运行脚本(48 个场景)
└── tests/ # 测试套件和测试夹具
├── TestCnaEmulator.java # 48 场景测试框架
└── fixtures/ # 通用测试夹具
├── sample_bof.cna # 独立示例 Aggressor 脚本
├── sample_bof.cna.tests # 配套测试套件
├── multi_alias.cna # 多别名示例脚本
└── multi_alias.cna.tests # 多别名配套测试套件
快速环境设置(cmd.exe):
set "JAVA_HOME=C:\path\to\jdk-17"
set "PATH=%JAVA_HOME%\bin;%PATH%"
set "SLEEP_JAR=C:\path\to\sleep.jar"
在运行编译后的类或 JAR 之前,编译 CnaEmulator.java:
使用构建脚本:
CnaEmulator\build.bat
或手动编译和打包:
:: Compile source to bytecode
javac -cp "%SLEEP_JAR%" -d CnaEmulator CnaEmulator\CnaEmulator.java
:: Package into executable bytecode JAR
cd CnaEmulator
jar cfe CnaEmulator.jar CnaEmulator *.class
cd ..
你可以从项目根目录使用以下任一方法调用 CnaEmulator:
启动器脚本自动处理 JDK 发现、类路径设置和路径解析:
cna_emulator.bat <action> [arguments...]
java -cp "CnaEmulator\CnaEmulator.jar;%SLEEP_JAR%" CnaEmulator <action> [arguments...]
java -cp "CnaEmulator;%SLEEP_JAR%" CnaEmulator <action> [arguments...]
check)通过 Sleep 2.1 验证 Aggressor 脚本语法并编译 AST 树,而不执行代码:
cna_emulator.bat check <path\to\script.cna>
使用捆绑夹具的示例:
cna_emulator.bat check CnaEmulator\tests\fixtures\sample_bof.cna
示例输出:
[*] Checking syntax of: CnaEmulator\tests\fixtures\sample_bof.cna
[+] sample_bof.cna syntax OK
run)执行已声明的 Aggressor 别名,将参数打包为二进制格式(bof_pack),解析对象文件(script_resource),并调用 COFFLoader64.exe 在调用者内存中执行 BOF:
cna_emulator.bat run <path\to\script.cna> <alias_name> [arguments...]
使用捆绑夹具的示例:
cna_emulator.bat run CnaEmulator\tests\fixtures\sample_bof.cna sample_bof run test_target
示例输出:
[*] Invoking: sample_bof 1 run test_target
[*] Tasked beacon: Executing sample_bof with action: run
[+] [COFFLoader Bridge] Executing: COFFLoader64.exe go sample_bof.o
| Got contents of COFF file
| Running/Parsing the COFF file
| Ran/parsed the coff
| Outdata Below:
| ...
[+] [COFFLoader Bridge] Completed with exit code: 0
test)CnaEmulator test 提供自动化测试执行:
cna_emulator.bat test <path\to\script.cna> [alias] [arguments...]
执行模式:
<alias> 和 [arguments...],则仅执行该特定场景。CnaEmulator 会检查脚本旁边的配套测试文件:
<script_dir>\<script_name>.cna.tests<script_dir>\<script_name>.tests
如果找到,配套文件中的所有场景行将按顺序执行。CnaEmulator 会检查所有已注册的命令别名,并执行守卫子句测试,以确保无效的参数数量输出用法错误而不会抛出未处理的异常。示例:
:: Run automated tests on the bundled sample script (executes sample_bof.cna.tests)
cna_emulator.bat test CnaEmulator\tests\fixtures\sample_bof.cna
:: Run automated tests on the bundled multi-alias script (executes multi_alias.cna.tests)
cna_emulator.bat test CnaEmulator\tests\fixtures\multi_alias.cna
:: Run a targeted scenario directly via CLI
cna_emulator.bat test CnaEmulator\tests\fixtures\sample_bof.cna sample_bof query
编写配套测试文件(<script>.cna.tests):
在你的 .cna 脚本旁边创建一个纯文本文件。每个非空、非注释行指定一个别名及其参数:
# Sample BOF Companion Test Suite
# Format: <alias> [arguments...]
sample_bof run test_target
sample_bof query
console)启动一个交互式 beacon> 提示符,支持已注册的别名、命令历史和模拟执行:
cna_emulator.bat console <path\to\script.cna>
交互式会话示例:
====================================================================
CnaEmulator Interactive Beacon Console
Loaded Script: sample_bof.cna
====================================================================
Type 'help' to see registered commands, or 'exit' to quit.
beacon> help
Registered Beacon Commands:
- sample_bof : Sample BOF execution command
beacon> sample_bof run local_target
[*] Tasked beacon: Executing sample_bof with action: run
[+] [COFFLoader Bridge] Executing: COFFLoader64.exe go sample_bof.o
...
beacon> exit
CnaEmulator 完全通用,可以测试位于文件系统中任何目录或外部仓库的 Aggressor 脚本和 BOF 二进制文件:
:: Validate any external script syntax
cna_emulator.bat check C:\Projects\CustomBof\my_bof.cna
:: Execute external BOF alias commands with live arguments
cna_emulator.bat run C:\Projects\CustomBof\my_bof.cna my_command target_argument
:: Run companion test suites for external scripts
cna_emulator.bat test C:\Projects\CustomBof\my_bof.cna
:: Open interactive console with external script
cna_emulator.bat console C:\Projects\CustomBof\my_bof.cna
要运行 CnaEmulator 的完整 48 场景规范合规性测试套件:
CnaEmulator\test.bat
预期结果:
====================================================================
Execution Summary
====================================================================
Total Scenarios : 48
Passed : 48
Failed : 0
Assertions : 172
Elapsed Time : ~2800 ms
====================================================================
[+] ALL 48 TEST SCENARIOS PASSED CLEANLY (100% SPECIFICATION CONFORMANCE)
[!NOTE] 虚拟 / 桩实现:所有其他 Cobalt Strike API——包括进程执行/注入(
bshell、bpowershell、bexecute、bspawn、binject)、令牌操作(bsteal_token、brev2self、bgetuid)、文件系统导航(bpwd、bls、bupload、bdownload)、枢轴(socks、rportfwd)、UI 提示(prompt_text、)和 GUI 钩子(、、、)——均实现为返回正向非错误值(、、、)或无操作块的虚拟桩,以便脚本离线执行而不会失败。
| 要求 | 描述与设置 |
|---|
| Java JDK (17+) | java 和 javac 二进制文件。将 JAVA_HOME 设置为你的 JDK 路径,并确保 %JAVA_HOME%\bin 在 PATH 中。 |
Sleep 2.1 (sleep.jar) | Aggressor 脚本的脚本引擎。从 Sleep 2.1 下载或从 Cobalt Strike 复制。设置 SLEEP_JAR(例如 set "SLEEP_JAR=C:\path\to\sleep.jar"),或将 sleep.jar 放在根文件夹或 CnaEmulator\ 中。 |
内存加载器(COFFLoader64.exe) | 独立加载器二进制文件(例如,从 trustedsec/COFFLoader 编译)。放在根目录中或通过 COFFLOADER_PATH 覆盖。 |
| 函数 / 关键字 | 描述 |
|---|
bof_pack | 打包小端序二进制参数(i、s、z、Z、b),带 4 字节缓冲区长度前缀。 |
beacon_inline_execute | 启动 COFFLoader64.exe go <bof.o> <hex_args> 子进程并流式传输实时 stdout。 |
script_resource | 跨脚本目录、bin/、../bin/ 和相对路径解析相对资源路径。 |
openf、readb、closef | 原生文件系统 I/O,用于将本地 .o BOF 文件读入字节缓冲区。 |
btask、berror、blog、blog2 | 格式化并输出任务、状态和错误消息到 stdout/stderr。 |
beacon_command_register | 将别名、摘要和帮助详情注册到实时命令目录中。 |
beacon_commands、beacon_command_detail | 查询已注册的命令列表和帮助文本,供交互式/控制台使用。 |
barch | 返回 "x64"。 |
bdata、beacon_info | 返回模拟的 Beacon 元数据哈希(id: 1、pid: 13020、user: SYSTEM、arch: x64)。 |
beacons、beacon_ids | 返回活动的模拟 beacon 数组(["1"])。 |
alias、command | 将命令块绑定为可执行闭包,用于交互式或 CLI 调度。 |
prompt_confirmpopupmenuitemon1"NT AUTHORITY\SYSTEM""C:\Windows\System32"true