深层分析威胁企业安全的Cobalt Strike
Cobalt Strike是一种商用渗透测试工具,可用于检查企业和机构的网络和系统的安全漏洞,其最显著的特点是支持渗透测试各个阶段的各种功能。然而,Cobalt Strike的破解版已被公开,并被许多攻击者用作恶意代码。尤其是在近期针对韩国国内企业的勒索软件攻击中,发现了很多攻击者恶意利用Cobalt Strike作为掌握内部系统的中间阶段的案例。
在2021年第二季度的ASEC报告中,根据AhnLab安全应急响应中心(AhnLab Security
Emergency response Center,以下简称为ASEC)追踪分析的内容,介绍了Cobalt Strike的攻击方式和各阶段特征。下面,让我们详细了解一下截至2021年第二季度,利用Cobalt
Strike的实际勒索软件攻击案例。

Cobalt Strike为最初感染提供了生成各种类型的有效载荷、窃取帐户信息、横向移动(Lateral Movement),以及系统接管的各阶段的必要功能。此外,还可以进行各种详细设置,甚至可以作为第三方模块(Third-Party Module)提供可扩展性。因此,为了分析和防御使用Cobalt Strike的攻击,不仅要考虑Cobalt Strike提供的各种功能,还要考虑各种可能绕过检测的技术。
Cobalt Strike攻击流程
Cobalt Strike大致可分为三种:beacon、团队服务器(Team Server)和Cobalt Strike客户端(Cobalt Strike Client)。首先,在受感染的计算机中以后门程序运行的实际恶意代码称为beacon。beacon是一种后门程序,可以执行Cobalt Strike提供的命令,它具有多种形式,可以接受来自C&C(Command & Control)服务器的命令,并在内网和外网执行恶意行为。
其次是beacon通信的服务器,也就是被称为团队服务器(Team Server)的实际C&C服务器。最后是Cobalt Strike客户端(Cobalt Strike Client)。攻击者可以使用Cobalt Strike客户端连接到团队服务器,并通过团队服务器向beacon发送命令。除了控制beacon外,Cobalt Strike客户端还提供各种功能和UI,例如生成称为beacon和stager的恶意有效载荷,并提供扩展功能。

【图 1】利用Cobalt Strike的攻击流程
【图1】显示了使用Cobalt Strike的攻击流程,可以看到Cobalt Strike的组成要素以及分阶段的攻击趋势。
如果连接到外部的特定公司系统感染了beacon,攻击者可以通过提升权限和使用Mimikatz等窃取帐户信息,横向移动(Lateral Movement)到公司系统内部的另一个系统。可以说Cobalt Strike是支持此过程的专用工具。
横向移动最终会在远程系统上安装另一个beacon,并为内部网络安装一个SMB beacon。即与外部连接的系统会安装HTTP或HTTPS等beacon来并接收来自外部C&C服务器的命令,对于未与外部连接的系统,利用SMB beacon使用SMB协议进行通信。SMB
beacon可以通过HTTP beacon直接从C&C服务器接收命令。换句话说,与一般的后门恶意代码不同,Cobalt Strike提供对内部系统的直接控制。
Cobalt Strike还提供各种技术来绕过安全产品的检测。当beacon运行时,意味着beacon作为一个进程运行。Cobalt Strike提供了Spawn等各种设置,以防被特定为可疑进程,并且可以指定参数,使得无法仅通过当前系统中的进程特定为可疑进程。此外,在网络通信方面,由于可以直接操纵数据包,因此很难基于数据包检测HTTP和HTTPS
beacon通信。因此,beacon存在于特定进程的内存中,并为内存中存在的形式提供各种设置,从而可以绕过基于内存的检测。
使用Cobalt Strike的网络攻击杀伤链(Kill Chain)
Cobalt Strike通过初始渗透、巩固据点、提升权限、内部侦察、横向移动和保持控制的过程来实现其目的。【图2】显示了使用Cobalt
Strike的网络攻击杀伤链。

【图 2】使用Cobalt Strike的网络攻击杀伤链
1.初始入侵(Initial Compromise)及巩固据点(Establish Foothold)
Beacon在Cobalt Strike中起着后门的作用。换句话说,如果某个特定系统感染了Cobalt Strike,则意味着安装并运行了一个beacon。Cobalt Strike提供了多种形式的beacon,根据这种方法,可将其区分为Stager和Stageless方式。
Stager是一个从外部下载beacon并在内存中执行的Meterpreter。由于不直接包含beacon,体积较小,需要额外下载beacon的过程。当从外部下载beacon时,Stager可以使用http、https和dns协议。另外,在横向移动过程中向内部网络传播beacon时,使用命名管道(Named Pipe),即SMB协议进行传递。Stageless方式不需要从外部额外下载beacon的过程,并且由于它包括beacon,所以它具有一定的大小或更大。
Cobalt Strike提供各种类型的有效载荷,因为下载并执行beacon的Stager方式和加载并执行以特定形式存在的beacon的Stageless方式不一定具有可执行文件格式。基本提供的构建器不仅可以创建可执行文件类型,例如exe、dll和Service.exe,还可以创建hta、vba宏、PowerShell命令和原始类型。
与Stager一样,beacon可以使用http、https、dns等协议与C&C服务器进行通信。在横向移动(Lateral Movement)的过程中,安装在内部网络的beacon没有与外部连接,因此安装了使用SMB协议进行通信的SMB
beacon。
最初安装的beacon可能会根据其类型在各种进程中运行。在横向移动(Lateral Movement)过程中的内部传播也是如此,在默认设置Cobalt Strike的情况下,根据命令的不同,第一个执行的进程可能是WinRM方式的rundll32.exe、powershell.exe或wsmprovhost.exe。但是,Cobalt Strike提供了一个名为Spawn的功能,以防止beacon与此类可疑进程一起工作。也可以在profile文件中设置Spawn功能,指定要注入的正常进程的路径和参数。即使在受感染环境中的可疑进程之一powershell.exe中加载并执行了beacon,如果beacon通过Spawn功能注入到正常进程并运行时,就会出现安全产品无法将特定进程指定为检测目标并对其进行检测的问题。
Cobalt Strike可以使用Malleable C&C配置文件的功能,绕过基于网络数据包的检测系统,在入侵系统后与攻击者服务器保持连接。该功能允许根据攻击者的意图修改Cobalt Strike的命令和控制(Command & Control)流量,例如伪装成谷歌(Google)或必应(Bing)等正常服务器的流量,从而避开网络安全系统,可以与攻击者服务器进行通信。为使用该技术,Cobalt Strike使用了一个名为为“Profile”的配置文件,该文件是Cobalt Strike的核心元素之一。
2.、提升权限(Privilege Escalation)
在初始渗透和巩固据点阶段完成后,攻击者将尝试获取本地管理员帐户或域管理员帐户信息以进行内部网络的横向移动。Cobalt Strike支持通过Mimikatz功能来获取此类帐户信息。但是,为了执行Mimikatz的帐户信息窃取命令,需要管理员或更高的权限,因此在Mimikatz之前必须优先提升权限。为此,攻击者利用了UAC Bypass或LPE漏洞,虽然Cobalt
Strike有默认提供的功能,但他们也会使用第三方工具。
3.内部侦察(Internal Reconnaissance)
当在受害系统上通过提升权限以及Mimikatz完成凭据信息窃取时,可以认为攻击者已经完全控制了该系统。内部侦察阶段是使用ADFind和端口(Port)扫描功能收集有关当前连接到系统的网络上所有计算机的信息的阶段。
ADFind是一种主要被攻击者用来收集信息的工具,是收集当前网络上的活动目录(Active Directory)信息的命令行形式的工具。例如,在FIN6等APT攻击组中,以批处理文件形式运行ADFind工具,并收集域控制器列表、子网列表、域内计算机信息、当前系统所属的活动目录信息等。
4.横向移动(Lateral Movement)
当使用端口扫描或ADFind等工具完成内部侦察和凭据信息窃取过程后,将继续进行内部传播过程。在Cobalt
Strike中,除了可以直接使用Shell命令,还可以使用默认提供的各种命令,例如psexec(psexec64)、psexec_psh、winrm(winrm64)和ssh(ssh-key)。
5. 维持持久性(Maintain Persistence)和完成目的(Complete Mission)
如果以上过程全部执行完毕,则系统已经被攻击者掌握,攻击者可以不受任何限制地执行任何命令,例如添加Cobalt Strike的扩展模块或安装其他恶意代码。其中,第一个要执行的命令是维持持久性(Maintain persistence)。攻击者通常可以导致beacon意外终止,例如通过重新启动受感染的计算机或终止进程等,从而发出维持持久性命令以允许beacon再次运行。