前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何使用bof-launcher在CC++Zig应用程序中执行Beacon对象文件(BOF)

如何使用bof-launcher在CC++Zig应用程序中执行Beacon对象文件(BOF)

作者头像
FB客服
发布2024-04-30 17:45:42
780
发布2024-04-30 17:45:42
举报
文章被收录于专栏:FreeBufFreeBuf
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链调用;

工具下载

首先,广大研究人员需要使用下列命令将该项目源码克隆至本地:

代码语言:javascript
复制
git clone https://github.com/The-Z-Labs/bof-launcher.git

然后,我们可以直接使用Zig来构建该项目代码。为此,我们需要在当前目录中下载Zig的tarball文件,将该目录路径添加到PATH环境之后,构建项目代码就非常简单了:

代码语言:javascript
复制
cd bof-launcher

zig build

构建生成的文件将存储在ig-out/bin和zig-out/lib目录中。

下列命令即可构建并运行测试BOF:

代码语言:javascript
复制
zig build test

针对Linux操作系统,项目提供了一个专门的zigupdate.sh脚本来执行工具代码构建:

代码语言:javascript
复制
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基础使用

代码语言:javascript
复制
// 加载对象文件(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的运行示例:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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 = ?developer/article/2414222/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;

}
#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;

}

代码语言:javascript
复制
许可证协议

本项目的开发与发布遵循BSD-3-Clause开源许可证协议。

项目地址

bof-launcher:

https://github.com/The-Z-Labs/bof-launcher

https://blog.z-labs.eu/2024/02/08/bof-launcher.html https://www.cobaltstrike.com/blog/cobalt-strike-4-1-the-mark-of-injection/ https://hstechdocs.helpsystems.com/manuals/cobaltstrike/current/userguide/content/topics/beacon-object-files_main.htm https://www.cobaltstrike.com/ https://z-labs.eu/ https://ziglang.org/ https://www.qemu.org/

本文参与?腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2024-04-26,如有侵权请联系?cloudcommunity@tencent.com 删除

本文分享自 FreeBuf 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • C API基础使用
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com