在Cobalt Strike BOF中进行直接系统调用

  • A+
所属分类:安全文章


在这篇文章中,我们将探讨如何在Cobalt Strike Beacon BOF中使用直接系统调用。以下是我们会讲到的内容:


  • 如何在Cobalt Strike BOF中使用直接系统调用来规避常见的AV和EDR检测。

  • 发行InlineWhispers:这是一个脚本,在BOF代码中,该脚本能让直接系统调用更加容易。

  • 提供PoC的BOF代码。通过修补LSASS进程内存,该代码可以启用WDigest凭据缓存,绕过Credential Guard。


PoC的源代码


https://github.com/outflanknl/WdToggle


InlineWhispers的源代码


https://github.com/outflanknl/InlineWhispers





BOF



Cobalt Strike最近引入了一个新的代码执行概念,叫做BOF。它能让Cobalt Strike运算符在Beacon进程中执行一小段已编译的C语言代码。


这有什么好处?最大的好处就是我们不需要再用fork和run函数。在BOF出现之前,fork和run函数是Cobalt Strike的运行代码的默认机制。也就是说,为了执行大多数后渗透漏洞利用函数,需要一个牺牲进程(使用spawnto参数指定),随后将有效载荷作为反射DLL注入该过程。从AV / EDR的角度来看,它具有可以检测到的各种特征,例如进程生成,进程注入和进程中的反射DLL内存伪像。在许多现代环境中,fork和run方式很容易成为OPSEC检测依据。用BOF在Beacon当前进程的上下文中运行与位置无关的已编译代码,这更加隐蔽。


虽然BOF在规避Cobalt Strike后渗透利用的AV / EDR方面有所进步,但我们仍然可能面临AV / EDR软件钩住API调用的问题。2019年6月,我们发布了一篇关于直接系统调用的文章,演示了如何用它绕过AV / EDR软件。到目前为止,我们没见过在BOF中直接进行系统调用,因此,我们决定演示一遍,并在本文中分享我们的经验。





直接系统调用和

BOF实用性



现在,许多红队都懂得如何利用系统调用绕过API挂钩,规避AV / EDR检测。 


在我们之前发布的有关系统调用的文章中, 我们演示了如何在Visual Studio中利用Microsoft汇编程序(MASM)在 C / C ++项目中进行系统调用。构建一个包含汇编代码的Visual Studio项目时,它用汇编器和C编译器生成两个对象文件,并将所有片段链接在一起,形成一个可执行文件。


创建BOF文件需要利用C语言编译器来生成单个对象文件。如果要BOF项目中含有汇编代码,需要进行内联汇编来生成单个对象文件。但是,Visual Studio不支持x64处理器的内联汇编 ,因此我们需要一个支持x64处理器的内联汇编C语言编译器。





Mingw-w64和内联ASM



Mingw-w64 是GCC编译器的Windows版本,可用于创建32位和64位Windows应用程序。它可以在Windows,Linux或任何其他基于Unix的操作系统上运行。最重要的是,它支持x64处理器的内联汇编。因此,现在我们需要了解如何在BOF源代码中运行汇编代码。


从Mingw-w64或GCC编译器的帮助页面中可以得知,它支持使用-masm = dialect 语法进行汇编 :


在Cobalt Strike BOF中进行直接系统调用


用 intel 语法可以编写汇编代码。如果要把内联汇编包含在我们的代码中,我们可以使用以下汇编语法:


   asm(“ nop  n”            “ NOP  n”            “ nop ”)


  • 起始asm关键字是 asm 或 __asm__

  • 指令必须用换行符( n)分隔。


更多有关GCC汇编程序语法的信息,请参见以下链接: 


https://www.felixcloutier.com/documents/gcc-asm.html#assembler-template





从__asm__到BOF



以下示例演示了用内联汇编的NtCurrentTeb()例程的自定义版本 。该例程可用于返回指向当前线程的线程环境块(TEB)的指针,然后可将其用于解析指向ProcessEnvironmentBlock(PEB)的指针:


在Cobalt Strike BOF中进行直接系统调用


如果想在我们的C语言代码中运行汇编函数,声明其名称、返回类型和参数,我们需要使用 EXTERN_C 关键字。该预处理程序宏指定该函数在其他位置定义,有C链接且用C语言调用约定。该方法还可以用于在我们的代码中包含汇编系统调用函数。只需把以汇编形式编写的系统调用转换为汇编语法,使用EXTERN_C 关键字添加函数定义,然后把它保存到头文件中即可,该文件可以包含在我们的项目中。


虽然可以在头文件中运行函数,但这不是最佳做法。用-o 选项编译目标文件的话,我们只能用一个源文件。为了让主源文件不带有汇编功能,我们将它们单独放在一个头文件中。


编译包含内联汇编的BOF源代码需要用到以下编译语法:


x86_64-w64-mingw32-gcc -o bof.o -c bof.c -masm = intel





WdToggle



为了演示整个概念,我们编写了PoC,它可以用内联汇编进行直接系统调用,也可以编译为BOF。


该代码显示了如何在Lsass进程(wdigest.dll模块)中把g_fParameter_UseLogonCredential全局参数切换为1来启用WDigest凭据缓存 。此外,可以在Lsass进程中把g_IsCredGuardEnabled变量切换为0来绕过Credential Guard(在启用的情况下)  。 


这两个技巧能让纯文本密码在LSASS中再次可见,所有可以用Mimikatz把它们显示出来。使用 UseLogonCredential 补丁后,只要用户锁定和解锁其会话,纯文本凭据就能用了。


在Cobalt Strike BOF中进行直接系统调用


这个PoC是基于 Hydra团队的_xpn_ 和 N4kedTurtle的以下文章。这些文章属于必读内容,且包含所有必要的详细信息:


  • 《探索Mimikatz –Part 1– WDigest》

  • 《绕过Credential Guard》


这两篇文章都有修补LSASS的PoC代码。我们的PoC以他们所编写的为基础,并且仅演示了如何利用BOF的直接系统调用来提供一种与LSASS进程交互和绕过Cobalt Strike的API挂钩的OPSEC安全方式。





补丁限制



使用该PoC的内存补丁不是永久重启的,因此重启后必须重新运行代码。此外, 在wdigest.dll模块里,g_fParameter_UseLogonCredential g_IsCredGuardEnabled全局变量的内存偏移量会在Windows版本和修订版之间发生变化。我们给代码的不同内部版本提供了一些偏移量,但将来可能会更改这些偏移量。你也可以用Windows调试工具找到该偏移量,然后添加自己想要的偏移量。





检测



通过LSASS内存访问来检测凭证盗窃,可以用Sysmon之类的工具来检测,打开LSASS句柄的处理。我们可以检测访问LSASS进程的可疑进程,从而创建遥测来检测可能发生的凭证转储活动。


虽然有很多平台可以检测凭据盗用,例如使用Windows Defender ATP之类的高级检测平台,但如果预算不足,那么Sysmon这个免费工具就能帮到你了。





InlineWhispers



@ Jackson_T发布了一个叫SysWhispers的工具 。源自SysWhispers Git存储库: 


“SysWhispers生成头文件/ ASM文件的植入,可以进行直接系统调用来实现规避”。


这个工具可以自动为任何系统调用生成头文件/ ASM文件,在自定义的红队工具这里就能派上用场。


这个工具生成的.asm输出文件可以在Visual Studio的Microsoft宏汇编器使用。在BOF项目中,如果要用SysWhispers输出生成的系统调用函数,需要进转换才能让它们和汇编语法匹配 。 


我们的同事 @_DaWouw 编写了一个Python脚本,能把SysWhispers生成的.asm输出文件转换为适合BOF项目的输出文件。


它会转换输出文件来匹配汇编模板语法,这样就可以在BOF代码中使用这些函数。我们可以手动输入BOF用到的系统调用函数,防止把未使用的系统函数也包含进来。这个脚本能在Github的InlineWhispers存储库中找到:


https://github.com/outflanknl/InlineWhispers





总结



本文讲述了如何在Cobalt Strike BOF中使用直接系统调用。使用直接系统调用需要用汇编语法编写汇编程序,所以我们可以将汇编函数包括在内联汇编中。Visual Studio不支持x64处理器的内联汇编,但Mingw-w64支持。


为了演示 BOF的直接系统调用,我们编写了PoC,用来启用WDigest凭据缓存。另外,我们还编写了一个名为InlineWhispers的脚本,它可以把SysWhispers生成的.asm输出文件转换为适合BOF项目的内联汇编头文件。





在Cobalt Strike BOF中进行直接系统调用

在Cobalt Strike BOF中进行直接系统调用

木星安全实验室(MxLab),由中国网安·广州三零卫士成立,汇聚国内多名安全专家和反间谍专家组建而成,深耕工控安全、IoT安全、红队评估、反间谍、数据保护、APT分析等高级安全领域,木星安全实验室坚持在反间谍和业务安全的领域进行探索和研究。



本文始发于微信公众号(木星安全实验室):在Cobalt Strike BOF中进行直接系统调用

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: