关于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-launcher zig 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.sh chmod +x zigupdate.sh; ./zigupdate.sh <update PATH> git clone https://github.com/The-Z-Labs/bof-launcher cd bof-launcher zig build zig 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.o cli4bofs.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.o qemu-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