Async PICOs 是一个框架,用于在 Cobalt Strike Beacon 进程内运行长期存活、事件驱动的 Beacon Object Files。它结合 Crystal Palace PICOs 与 Beacon 端执行模型,提供异步执行、任务跟踪、优雅关闭以及安全的异步输出。
与 Cobalt Strike 原生的异步 BOF 不同,Async PICOs 在 Beacon 的进程中执行,并且可以在事件发生时唤醒 Beacon 以呈现输出。
Cobalt Strike 原生的异步 BOF 解决的是另一个问题。Async PICOs 旨在用于在 Beacon 内部执行的长期运行、事件驱动的任务,并能安全地将结果立即回传给操作人员。
有关实现细节和设计原理,请参阅随附的博客文章:
https://www.nccgroup.com/research/async-picos-and-custom-beacon-wakeups-in-cobalt-strike/
在开始构建之前,需要以下组件:
本仓库的本地副本
已构建的 Crystal Palace 版本
支持 MSVC 和 CMake 的 Visual Studio
Tradecraft Garden
克隆仓库
git clone <repo-url>
cd async-pico-hub
Async PICOs 依赖 Crystal Palace 进行 PICO 生成。
下载最新版本的 Crystal Palace 压缩包,并按照其说明进行构建。构建完成后,将 Crystal Palace 的二进制文件放入:
pico-tools/crystal-palace/
预期的目录结构应类似于:
pico-tools/
└── crystal-palace/
├── src/
├── lib/
└── ...
下载最新版本的 Tradecraft Garden,并将其放入
pico-tools/tradecraftgarden
预期的目录结构应类似于:
pico-tools/
└── tradecraftgarden/
├── libtcg/
├── simple_pic/
└── ...
请确保构建 libtcg 和 simple_pic 示例,以便能够构建 Async PICOs。
该项目使用 CMake 来简化使用 MSVC 的构建过程。
在仓库根目录中,右键单击文件夹并选择:
Open with Visual Studio
这将加载 CMake 项目并显示可用的构建配置。
可用的构建配置如下:
x64 Debug
构建 PICO 和 BOF 的本地可执行版本,用于调试。
当需要在本地调试行为或在 Visual Studio 中逐步执行代码时,请使用此配置。
x64 Release
构建优化后的 PICO 和 BOF 本地可执行版本。
使用此配置在 Beacon 外部测试发布行为。
x64 Release Objects
构建部署产物:
这是用于生成 Cobalt Strike 对象的配置。
构建完成后,生成的产物可以在以下位置找到:
build/x64-ReleaseObject/obj/
该目录包含编译好的、可供使用的 PICO 和 BOF。
Async PICOs 要求 Beacon 使用自定义 sleepmask。
在尝试使用 Async PICOs 之前,请在您的 malleable profile 中启用对自定义 sleepmask 的支持。
picos-cna/sleepmask.cna脚本加载async-sleepmask,这是一个极简的参考实现,用于支持异步输出和 Beacon 唤醒协调。这个 sleepmask 有意保持简单,并带有 Limitations 一节中所述的局限性。它用于演示框架并简化测试,而非作为生产就绪的成品组件。
如果您已经有一个带有 OPSEC 技术(如栈操纵或其他技术)的自定义 sleepmask,请参阅 将现有 sleepmask 修改为 Async sleepmask,以将 Async PICO 支持集成到您现有的实现中。
使用 x64 Release Objects 配置构建项目后,将 picos.cna 和 sleepmask.cna Aggressor 脚本加载到 Cobalt Strike 中:
Script Manager → Load → picos-cna/picos.cna
Script Manager → Load → picos-cna/sleepmask.cna
加载完成后,可以通过 picos 命令管理 Async PICOs。
要启动一个 PICO:
picos start [path to pico] [arguments]
例如:
picos start C:\temp\MonitorTGT.pico
或者带参数启动:
picos start C:\temp\MonitorTGT.pico DOMAIN\serviceaccount
要查看正在运行的 Async PICOs:
picos
这将显示当前正在运行的任务及其标识符。
要停止一个 Async PICO:
picos stop [pico id]
例如:
picos stop 3
该 PICO 会收到停止信号,并在执行清理后优雅退出。
更多用法信息可以直接在 Cobalt Strike 中通过 picos 命令的内置帮助菜单获取。
详见 docs/writing_custom_async_pico.md。
详见 docs/modifying_existing_sleepmask.md。
公开实现有意保持简单,不包含高级规避技术。它旨在作为可改编的基础,而非可直接部署的成品。
Async PICOs 使用 CreateThread 启动。这使执行模型简单且易于理解,但也引入了检测面。在公开实现中,线程从未被模块映像支持的内存开始执行,这可能被检查线程起始地址的产品或启发式规则检测到。
用户应评估替代的线程创建或执行策略是否更适合其环境。
该框架依赖修改后的 sleepmask 将异步输出回传给 Beacon,并协调唤醒事件。这里包含的实现有意保持最小化,在投入使用前应进行审查。
Sleepmask 是执行模型的一部分,而不仅仅是一个便利层。对输出排队、排空或信号通知方式所做的任何更改,都应仔细评估,以避免引入并发问题或与 Beacon 内部机制产生不支持的交互。
公开实现带有若干实际局限性,在使用前应加以了解。
Crystal Palace 使 PICO 可以使用全局变量,但公开实现使用简单的共享存储模型来保存全局状态。因此,全局变量并未按线程隔离。
实际上,这意味着并发运行多个 Async PICOs 时,如果它们依赖全局变量,可能需要额外小心。
Async PICOs 依赖修改后的 sleepmask 来实现异步输出和 Beacon 唤醒协调。因此,该框架并非完全自包含,不能被视为可直接替换的 BOF。
该仓库旨在演示一种框架和实现方法,而非提供生产就绪的成品组件。随附示例旨在被扩展、修改并适配到各个用例中。