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

ops/2024/11/12 13:57:09/

关于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


http://www.ppmy.cn/ops/17406.html

相关文章

力扣--N皇后

题目: 按照国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你一个整数 n &#xff0c;返回所有不同的 n 皇后问题 的解决方案。…

09.JAVAEE之网络初识

1.网络 单机时代 >局域网时代 >广域网时代 >移动互联网时代 1.1 局域网LAN 局域网&#xff0c;即 Local Area Network&#xff0c;简称LAN。 Local 即标识了局域网是本地&#xff0c;局部组建的一种私有网络。 局域网内的主机之间能方便的进行网络通信&#xff0…

迭代器模式:顺序访问集合对象元素的桥梁

在软件开发中&#xff0c;我们经常需要访问集合对象中的元素&#xff0c;而无需暴露其底层表示。迭代器模式&#xff08;Iterator Pattern&#xff09;是一种行为型设计模式&#xff0c;它提供了一种按顺序访问聚合对象元素的方法&#xff0c;而不依赖于对象的底层实现。这种模…

postCss基本介绍

&#x1f31f;什么是postCss&#xff1f; 我个人的理解postCss就是css界的babel&#xff0c;它提供一个过程&#xff0c;而在这个过程中&#xff0c;去干什么就是你自己的事情&#xff0c;所以很多人写插件&#xff0c;去做代码转换&#xff0c;或者兼容等等。 babel 提供过程 …

R可视化:绘制带有显著性标记的误差棒图

介绍 ggplot2绘制分组误差棒图加载R包 knitr::opts_chunk$set(message = FALSE, warning = FALSE) library(tidyverse) library(ggpubr) library(rstatix)# rm(list = ls()) options(stringsAsFactors = F) options(future.globals.maxSize = 10000 * 1024^2)Importing data …

C语言趣味代码(二)

1.珠玑妙算 1.1 介绍 《珠玑妙算》(Mastermind)是英国Invicta公司于1973年开始销售的一款益智游戏&#xff0c;据说迄今为止已经在全世界销售了5000万套。《珠玑妙算》于1974年获奖后&#xff0c;在1975年传入美国&#xff0c;1976年leslieH.Autl博士甚至还出版了一本名为The…

YOLOv8 实现车牌检测,生成可视化检测视频(20240424)

原项目源码地址&#xff1a;GitHub 我的源码地址&#xff1a;Gitee 环境搭建请参考&#xff1a;Win10 搭建 YOLOv8 运行环境&#xff08;20240423&#xff09;-CSDN博客 环境测试请参考&#xff1a;本地运行测试 YOLOv8&#xff08;20240423&#xff09;-CSDN博客 训练数据…

如何在PostgreSQL中使用索引覆盖扫描提高查询性能?

文章目录 解决方案1. 创建合适的索引2. 确保查询能够使用索引覆盖扫描3. 调整查询以利用索引覆盖扫描4. 监控和调优 示例代码1. 创建索引2. 编写查询3. 检查是否使用索引覆盖扫描4. 调整索引 总结 在PostgreSQL中&#xff0c;索引是提高查询性能的关键工具之一。索引允许数据库…