CobaltStirke BOF技术剖析(一)|BOF实现源码级分析

简介

对BOF(Beacon Object File)的支持是在CobaltStrike4.1版本中新引入的功能。BOF文件是由c代码编译而来的可在Beacon进程中动态加载执行的二进制程序。无文件执行与无新进程创建的特性更加符合OPSEC的原则,适用于严苛的终端对抗场景。低开发门槛与便利的内部Beacon API调用与使得BOF特别适合后渗透阶段攻击工具的快速开发与移植。

BOF本质-OBJ文件

当我们通过file命令查看编译后的BOF文件,我们会发现它是一种名为COFF的文件格式。在Windows操作系统中编译产生的.obj中间文件使用的便是这种格式的文件,也可以作为BOF在cobaltstrike中被正确执行。

Intel amd64 COFF object file, no line number info, not stripped, 7 sections, symboloffset=0x1330, 212 symbols

利用PEView等工具可以观察其结构:

在.text段存在编译完成的代码

通过如下命令可以调用cobaltstrike自带的BOF解析函数查看BOF文件的属性,及其中的重定向信息。

BOF执行过程分析

cobaltstrike将一部分对BOF文件的处理在客户端程序中完成,传输至beacon的已经是解析过的数据。将bof文件的解析前置到客户端完成一方面减少了Beacon侧的代码,另外一方面也避免了诸如文件Magic头之类BOF文件本身存在的特征被应用于内存检测中。

对于重定向表的处理是此步骤的核心,对.rdata、.data、.text段的重定向在此处未作过多处理,而对符号表中的函数则进行了分类处理。一类函数是Beacon中内置的函数,另一类函数则需要由Beacon动态解析函数地址。

BOF内部API

在Beacon内部存在着BOF可调用的一系列内部API,在解析内部函数的地址时直接以函数数组的形式去计算内部地址。

BOF C API共有以下几类:

Win32 API-主要用于函数动态解析

LoadLibraryA、FreeLibrary、GetProcAddress、GetModuleHandleA

数据解析API-用于从bof_pack打包的数据中提取函数参数

BeaconDataParse、BeaconDataPtr等

内容格式化API-辅助构造大型或重复性的输出

BeaconFormatAlloc、BeaconFormatReset等

打印输出API-将结果返回cobaltstrike控制端

BeaconOutput、BeaconPrintf等

Beacon 内部API-一些功能性的API,包括token操作、派生进程、进程注入等

BeaconUseToken、BeaconRevertToken、BeaconSpawnTemporaryProcess等

辅助性API

toWideChar-将多字节字符串转换为宽字符字符串

核心特性-动态函数解析DFR

Dynamic Function Resolution(动态函数解析 DFR)是cobaltstrike在BOF文件解析中提供的特性,它支持动态解析并调用DLL的导出函数。动态解析的过程在beacon执行BOF的过程中完成。

通过对beacon的逆向可知,DFR依然是利用GetModuleHandleA、LoadLibraryA、GetProcAddress这几个函数去动态解析函数地址,与直接调用这几个函数没有本质区别,但为函数的动态解析提供了一种简便的方法。

技巧-活用DFR导入libc函数

在cobaltstrike官方文档中称:“由于不会将BOF链接到libc,strlen,strcmp等通用函数将无法使用”。但利用DFR的特性,我们可以通过直接调用msvcrt.dll中导出的标准c函数。

BOF的优点

1. 内存中不落地执行,避免针对文件内容的检测

2. 在本进程加载执行BOF中的功能代码,规避了针对进程创建的检测(更符合opsec安全)

3. 低成本地迁移由c编写的小型后渗透工具

4. 基于BOF.NET等项目可以在避免创建新进程的情况下实现.NET程序加载执行

BOF的局限性

1. 不支持解析bss段,因此不能正确解析未手动初始化的全局变量(必须以非0值进行初始化)

2. 若执行的BOF程序的执行错误将导致整个进程崩溃

3. BOF执行期间将阻塞beacon进程,不能执行其他任务,也不会返回信息(若BOF执行进入死循环则session无响应)

4. 不适于长时间运行的大型程序,对多线程没有官方支持

优秀BOF项目集合

1. FindObjects-BOF:利用直接系统调用枚举具有特定模块或句柄的进程

https://github.com/outflanknl/FindObjects-BOF

2. Situational Awareness BOF:提供了一些常用的信息收集命令的BOF实现(例如sc_query)

https://github.com/trustedsec/CS-Situational-Awareness-BOF

3. BOF.NET:为Beacon BOF文件提供的.NET运行时

https://github.com/CCob/BOF.NET

参考链接

https://www.cobaltstrike.com/help-beacon-object-files

https://wbglil.gitbook.io/cobalt-strike/cobalt-strike-yuan-li-jie-shao/untitled-3

https://blog.cobaltstrike.com/2017/06/23/opsec-considerations-for-beacon-commands/

版权声明

本站“技术博客”所有内容的版权持有者为绿盟科技集团股份有限公司(“绿盟科技”)。作为分享技术资讯的平台,绿盟科技期待与广大用户互动交流,并欢迎在标明出处(绿盟科技-技术博客)及网址的情形下,全文转发。
上述情形之外的任何使用形式,均需提前向绿盟科技(010-68438880-5462)申请版权授权。如擅自使用,绿盟科技保留追责权利。同时,如因擅自使用博客内容引发法律纠纷,由使用者自行承担全部法律责任,与绿盟科技无关。

Spread the word. Share this post!

Meet The Author

Leave Comment