关于bof-launcher
bof-launcher是一款针对Beacon对象文件(BOF)的安全测试工具,在该工具的帮助下,广大研究人员可以轻松在C/C++/Zig应用程序中执行Beacon对象文件(BOF)。
Cobalt Strike 4.1于2020年6月25日发布,该版本引入了一种能够运行Beacon对象文件的功能,即能够Beacon中执行代码、解析参数、调用一些Win32 API、报告输出和退出。自那时起,BOF变得非常流行,因此也衍生出了在Cobalt Strike的Beacon之外的其他环境中启动或执行BOF的需求。
功能介绍
bof-launcher是一个开源库,可以在Windows和UNIX/Linux系统上加载、重新定位和启动BOF。当前版本的bof-launcher支持下列功能:
1、与Cobalt Strike的Beacon完全兼容,可以编译和运行Cobalt Strike Community Kit中提供的每一个BOF以及其他所有遵循通用BOF模板的开源BOF;
2、作为一个完全独立的库分发,不依赖与任何其他组件(甚至不使用libc);
3、支持与C/C++/Zig应用程序完美集成;
4、增加了用Zig编程语言编写BOF的能力,该语言的所有功能和丰富的标准库都可以用于BOF;
5、异步BOF执行,能够在单独的线程中启动更耗时的BOF;
6、BOF进程注入,通过将其注入新进程来启动风险更大的BOF;
7、完美支持Windows COFF和UNIX/Linux ELF格式;
8、支持Linux ARM和AARCH64;
7、允许直接从文件系统运行BOF文件(需配合cli4bofs工具);
8、高效灵活的API用于BOF链调用;
工具下载
首先,广大研究人员需要使用下列命令将该项目源码克隆至本地:
git clone https://github.com/The-Z-Labs/bof-launcher.git
然后,我们可以直接使用Zig来构建该项目代码。为此,我们需要在当前目录中下载Zig的tarball文件,将该目录路径添加到PATH环境之后,构建项目代码就非常简单了:
cd bof-launcherzig build
构建生成的文件将存储在ig-out/bin和zig-out/lib目录中。
下列命令即可构建并运行测试BOF:
zig build test
针对Linux操作系统,项目提供了一个专门的zigupdate.sh脚本来执行工具代码构建:
wget https://raw.githubusercontent.com/The-Z-Labs/bof-launcher/main/utils/zigupdate.shchmod +x zigupdate.sh; ./zigupdate.sh<update PATH>git clone https://github.com/The-Z-Labs/bof-launchercd bof-launcherzig buildzig build test
bof-launcher库
bof-launcher库是一个完全开源且独立的代码库,可以用来执行任何形式的BOF构建。在Windows平台上,bof-launcher支持x86和x86_64架构,在Linux上支持x86、x86_64、ARM和AArch64架构。该代码库对外提供了CAPI和Zig API,支持解析COFF/ELF对象数据,能够加载所有需要的符号,最后处理BOF输出。
C API基础使用
// 加载对象文件(COFF或ELF)并获得一个对应的句柄BofObjectHandle bof_handle;if (bofObjectInitFromMemory(obj_file_data, obj_file_data_size, &bof_handle) < 0) {// handle the error}// 执行BofContext* context = NULL;if (bofObjectRun(bof_handle, NULL, 0, &context) < 0) {// handle the error}// 获取输出const char* output = bofContextGetOutput(context, NULL);if (output) {// 处理BOF输出}bofContextRelease(context);
工具使用
在开发和调试过程中,我们可以直接从文件系统来运行BOF代码。为此,我们还专门开发了cli4bofs工具。下载并构建项目代码后,我们就可以运行所有的BOF了。下面给出的是我们BOF的运行示例:
cli4bofs.exe exec .\zig-out\bin\wWinver.coff.x64.ocli4bofs.exe exec .\zig-out\bin\udpScanner.coff.x64.o str:162.159.200.1-5:123,88
如需在其他CPU架构上运行该BOF的话,可以使用QEMU:
qemu-aarch64 -L /usr/aarch64-linux-gnu ./zig-out/bin/cli4bofs exec zig-out/bin/test_obj0.elf.aarch64.oqemu-arm -L /usr/arm-linux-gnueabihf ./zig-out/bin/cli4bofs exec zig-out/bin/test_obj0.elf.arm.o
下列代码可以创建体积更大的跨平台BOF:
const w32 = @import("bof_api").win32;const beacon = @import("bof_api").beacon;extern fn @"ntdll$RtlGetVersion"(lpVersionInformation: *w32.RTL_OSVERSIONINFOW,) callconv(w32.WINAPI) w32.NTSTATUS;const RtlGetVersion = @"ntdll$RtlGetVersion";pub export fn go(_: ?[*]u8, _: i32) callconv(.C) u8 {var version_info: w32.OSVERSIONINFOW = undefined;version_info.dwOSVersionInfoSize = @sizeOf(@TypeOf(version_info));if (RtlGetVersion(&version_info) != .SUCCESS)return 1;_ = beacon.printf(0,"Windows version: %d.%d, OS build number: %d\n",version_info.dwMajorVersion,version_info.dwMinorVersion,version_info.dwBuildNumber,);return 0;}
#include <windows.h>#include "beacon.h"NTSYSAPI NTSTATUS NTAPI NTDLL$RtlGetVersion(OSVERSIONINFOW* lpVersionInformation);unsigned char go(unsigned char* arg_data, int arg_len) {OSVERSIONINFOW version_info;version_info.dwOSVersionInfoSize = sizeof(version_info);if (NTDLL$RtlGetVersion(&version_info) != 0)return 1;BeaconPrintf(0,"Windows version: %d.%d, OS build number: %d\n",version_info.dwMajorVersion,version_info.dwMinorVersion,version_info.dwBuildNumber);return 0;}
许可证协议
本项目的开发与发布遵循BSD-3-Clause开源许可证协议。
项目地址
bof-launcher:【GitHub传送门】
参考资料
Running BOFs with our 'bof-launcher' library
https://www.cobaltstrike.com/blog/cobalt-strike-4-1-the-mark-of-injection/
Beacon Object Files
https://www.cobaltstrike.com/
Z-Labs, Software Security Labs
Home ⚡Zig Programming Language
QEMU