背景
在Cobalt Strike 3.6中,引入了一项名为External C2(外部C&C)的强大功能,为自定义命令和控制(C&C)通道提供了一个有用的接口。
作为一个擅长于利用自定义C&C通道的红方队员,我立即着手探索External C2。在这篇文章中,我将简要介绍External C2规范、IE COM对象,以及它们如何用于命令和控制,最后将介绍如何实际使用。
External C2概述
如前所述,External C2允许第三方程序作为Cobalt Strike与其信标植入之间的通信信道。
External C2共包含如下组件:
1、External C2服务器:Cobalt Strike团队服务器提供的服务,允许第三方控制器向团队服务器发送和接收数据。
2、第三方控制器:自定义C2的“服务器端”元素。该组件负责与第三方客户端通信,并将数据中继传输到External C2服务器。
3、第三方客户端:自定义C2通道的“客户端”。该组件负责产生信标(Beacon),使用命名管道连接到该信标,并将数据中继到第三方控制器。
下图展示了External C2规范的高级概述。
现在,我们已经对External C2如何工作有了基本的了解。接下来,我们要深入了解一下具体的实现,也就是Browser-C2(浏览器C&C)。
Browser-C2架构
Browser-C2是一个External C2的实现,允许信标与团队服务器通过合法的浏览器进行通信。
下图展示了Browser-C2的体系结构:
第三方客户端本地HTTP服务器具有以下终端,这些终端可以在被攻陷的工作站上使用:
· /inject – 在当前进程中执行ShellCode
· /send – 将数据发送到本地信标
· /receive – 从本地信标接收数据
· /relay – 提供HTML文件,通过Internet Explorer将数据从第三方客户端中继到第三方控制器
· /ping – 用于检查HTTP Server的状态
第三方HTTP服务器具有如下终端:
· /arch/{architecture} – 提供架构编写者特定的信标ShellCode
· /send – 将数据发送到External C2服务器
· /receive – 从External C2服务器接收数据
在下表中,总结了Browser-C2体系结构中每个组件的实现。
Browser-C2组建流程:
第三方客户端是初始化Browser-C2通信通道的组件。首先,它创建一个Internet Explorer实例,然后启动本地HTTP服务器来处理来自浏览器的通信。第三方控制器和第三方客户端之间的所有通信都是通过Internet Explorer执行的,如上表所示。
尽管这种体系结构最初看起来可能会过于复杂,但实际上它具有许多优点,并且优于注入正在运行的iexplorer.exe进程的传统方法。这一点,我们在此前的文章中已经进行过描述。接下来,我们将更加详细的研究这些优点,并说明其对运营者带来的帮助。
父流程创建
我们在之前的文章中,描述了流程派生关系如何帮助蓝队判断可疑行为。假如chrome.exe派生了powershell,那么可能就意味着存在不良行为。我们还描述了在某些情况下,如何使用父流程欺骗来逃避这些检测。
这种技术的好处在于,当iexplorer.exe派生时,它是通过COM完成的,也因此其父进程并非winword.exe、wscript.exe或者其他同类程序。实际上,它是使用svchost.exe派生的,如下所示。我们建议威胁研究人员考虑将这一点添加到他们的检测规则之中。
除了检测的方式,使用Microsoft ASR(Attack Surface Reduction,攻击面减少)规则配置的环境也可能会阻碍子进程的创建过程。如果我们使用了面向Office系列的Payload(例如:宏),那么ASR可能会出现问题。ASR能够阻止子进程执行、注入其他进程以及更多进程的规则,如下图所示:
要测试ASR是否会阻止派生出来的Internet Explorer,我们使用PowerShell启用以下规则:
(阻止所有Office应用程序创建子进程)
Block all Office applications from creating child processes - d4f940ab-401b-4efc-aadc-ad5f3c50688a
Add-MpPreference -AttackSurfaceReductionRules_Ids d4f940ab-401b-4efc-aadc-ad5f3c50688a -AttackSurfaceReductionRules_Actions Enabled
启用此规则后,我们可以通过尝试从Office内部运行进程,来验证它是否正在执行。该过程会失败,如下所示:
使用COM对象时,Internet Explorer将在DCOM服务进程(svchost.exe)下启动,如前所述,因此将绕过此规则。
进程注入
进程注入受到安全社区的密切关注,许多EDR(终端检测与响应)和反病毒解决方案目前都会阻止尝试注入其他进程的行为,或在发生相应行为时弹出警告。
为了解决这个问题,我们使用COM生成浏览器对象,并避免产生注入行为。通过引用InternetControl COM对象,我们可以创建与第三方客户端通信的iexplorer.exe实例。示例代码如下所示:
当我们运行上述代码时,将启动一个Internet Explorer实例,该实例将导航到我们选择的网站,在本例中为https://google.com/。
考虑到这一点,我们在我们的实现中,使用IE COM对象导航到第三方客户端本地HTTP服务器上的/relay终端,IE将开始在第三方客户端和控制器之间中继数据,提供启动和通信的方法Cobalt Strike信标没有任何形式的进程注入。
设置Browser-C2
Browser-C2的源代码可以在MDSec ActiveBreach GitHub上获得。
将Browser-C2项目加载到Virsual Studio后,使用URL编辑ControllerURL变量。在此示例中,我们将使用运行控制器的内部实验室IP:
加载Aggressor脚本后,外部C2服务器将在端口2222上启动:
下一步是运行server.py脚本,这是第三方控制器。在一切就绪之后,就可以准备让信标连接了。
视频:https://vimeo.com/317289354
总结
本文主要介绍了如何使用External C2,以及如何解决可能会增加红方被检测风险的一些问题。需要注意的是,当前的实现仅支持单个信标,但实际上它不应该太过复杂,并且也不应该超过概念证明的范畴。
参考资料
[1] https://www.cobaltstrike.com/downloads/externalc2spec.pdf
[2] https://www.cobaltstrike.com/help-externalc2
[3] https://blog.xpnsec.com/exploring-cobalt-strikes-externalc2-framework/
[4] https://github.com/ryhanson/ExternalC2
[5] https://docs.microsoft.com/en-us/windows/security/threat-protection/windows-defender-exploit-guard/enable-attack-surface-reduction
还没有评论,来说两句吧...