上篇指南主要讲解了Cobalt Strike主要功能和这些功能运行时的行为特征。在这篇指南中我们将关注网络流量侧的特征,涉及到域前置、SOCKS代理、C2通信、Sigma规则、JARM、JA3/S、RITA等等。与前文一样,我们重点关注的是通用的Cobalt Strike的检测方法。
非常感谢@Kostastale 帮助将第 2 部分放在一起!还要感谢@svch0st、@pigerlin 和@0xtornado 审阅此报告。
尽管部署网络侧的流量检测对于企业来说不是一件容易的事,但合适地部署流量检测对于安全防护来说是高投入高产出的。恶意软件接收控制指令必须要回连到C2服务器,本文将展示在攻击者达成攻击目标前检测到C2通信的方法。通过一些特征我们可以识别出可疑流量和网络基础设施。在这之前我们先来看一下为什么Cobalt Strike功能强大。
Cobalt Strike 的多功能性来自于使用每个有效负载更改指示器的能力。这要归功于 Malleable C2 配置文件。我们的另一篇文章谈到了 Malleable C2 配置文件以及威胁行为者如何使用它们;然而,这只是他们众多应用中的一部分。您可以在下面找到与一些最重要的领域相关的信息,这些领域可能会让分析师在调查 Cobalt Strike 网络通信时感到困惑:
以下参考配置来自于Raphael Mudge的GitHub代码库:
###Global Options###
set sample_name "whatever.profile";
set sleeptime "0"; <================ # Decimal number to indicate the time the beacon will sleep for between communications in milliseconds
set jitter "25"; <================ # A number that indicates the percentage of a random sleep time that beacon will introduce to its C2 comm
set useragent "<string>"; <================ # Custom user agent of your choice
set data_jitter "35"; <================ # Represents the value bytes variable that would instruct Cobalt Strike to send a random string on http-get/post to match the bytes value.
set headers_remove "<header to remove>"; <================ # Specifying headers to be removed in a comma separated manner.
####### Not much explanation is needed here, you can change the certificate information to your heart's content.#######
https-certificate {
set C "US";
set CN "whatever.com";
set L "California";
set O "whatever LLC.";
set OU "local.org";
set ST "CA";
set validity "365";
}
###HTTP-Config Block###
http-config {
set headers "<headers to include>"; <================ # Specifying the headers that you want to include.
header "<name of the header(s)>"; <================ # Specifying the name of the header that will store the data that are transmitted to the C2 server
set trust_x_forwarded_for "<true OR false>"; <================ # If the C2 server is behind a redirector, this option would allow to forward the traffic to the correct destination
set block_useragents "<user agents>"; <================ # User agents that C2 server will block and show a 404 response
set allow_useragents "<user agents>" <================ # Opposite of the above
}
###HTTP-GET Block. This function and all of its fields could also exist and be customized for the HTTP-POST Block (Server communication)###
http-get {
set uri "/<URI string>"; <================ # Specifying the URI to reference in bidirectional communication from client and server
set verb "POST"; <================ # Setting the verb when requesting available tasks from the C2 server.
client {
header "Host" "whatever.com"; <================ # Setting the header specific to client communication with the C2.
header "Connection" "close";
### Metadata corresponds to the information that the beacon is sending to the C2 server about itself. The operators may choose to enable additional fields that will include data on the C2 communication. You can mix and match fields below:
metadata {
#base64; <================ # Base64 encoded string
base64url; <================ # URL safe Base64 encoded string
#mask; <================ # Encrypting and encoding the data with XOR mask and random key
#netbios; <================ # Encoding data as netbios in lower case
#netbiosu; <================ # Another variation of netbios encoding
#prepend "TEST123"; <================ # Choosing a string to prepend to the transmitted data
append ".php"; <================ # Choosing a string to append
### Termination statements: This statement tells Beacon and its server wherein the transaction to store the transformed data. You may choose one of these termination statement methods.
parameter "file"; <================ # Adding a parameter to the URI.
#header "Cookie"; <================ # Adding a specific string within a specific header.
#uri-append; <================ # Adding a specific string in the URI.
#print;
}
parameter "test1" "t
我们在上面的配置文件中添加了注释,来解释攻击者可以定制哪些字段,所有这些字段都导致C2通信的特征是可以灵活多变的。有许多开源项目用于生成独一无二的C2配置文件。例如:@joevest的Random C2 Profile Generator,@bluscreenofjeff的Malleable-C2-Randomizer,@FortyNorthSec的C2concealer
以下是我们在入侵案例中提取到的一些Cobalt Strike C2服务器,在右边一栏中展示了Cobalt Strike载荷会主动请求的URI。有经验的分析师一眼就能发现这些URI都来自于一些公开资源,例如Raphael Mudge的GitHub 代码库。另一个例子是“jquery-3.3.1.min.js”,它与我们在四次入侵案例中观察到的C2 配置文件相关联。
+----------------------+-----------------------+
| C2 Server | URI queried |
+----------------------+-----------------------+
| gawocag.com | /nd |
| 190.114.254.116 | /push |
| 190.114.254.116 | /__utm.gif |
| kaslose.com | /jquery-3.3.1.min.js |
| yawero.com | /skin.js |
| sazoya.com | /skin.js |
| 192.198.86.130 | /skin.js |
| 162.244.83.216 | /jquery-3.3.1.min.js |
| sammitng.com | /jquery-3.3.1.min.js |
| 23.19.227.147 | /styles.html |
| securityupdateav.com | /tab_shop_active.html |
| 108.62.118.247 | /as |
| windowsupdatesc.com | /as |
| 212.114.52.180 | /copyright.css |
| defenderupdateav.com | /default.css |
| onlineworkercz[.]com | /kj |
| checkauj.com | /jquery-3.3.1.min.js |
+----------------------+-----------------------+
想要深入了解C2配置文件中的所有可配置字段,可以参考@ZephrFish的文章。另外一篇非常不错的文章来自于SpecterOps
域前置是一种隐藏真实C2服务器的技术。这种技术让失陷主机看上去是与正常的域名进行通信,实际上失陷主机最终连接的是攻击者的C2服务器。
域前置技术能够实现,得益于内容分发网络(CDN)供应商。在一些会审查流量内容的国家(例如中国)域前置用于绕过Web服务的审核制度。最近几年,攻击者开始使用这项技术来隐藏C2服务器。由于文字描述难以展示出这项技术的逻辑关系,我们使用了Cobalt Strike官网提供的图片如上:
Cobalt Strike 配置文件配合以下前提条件,才能实现域前置技术:
1、找到一个合法域名的CDN供应商
2、拥有一个域名. (例如:infosecppl.store)
3、在CDN供应商购买CDN服务. (例如:cloudfront.net).
4、配置CDN将特定流量转发到你的域名 (例如:l33th4x0r.cloudfront.net).
5、配合CDN配置,修改C2配置文件
第一步是最关键的,攻击者可以使用同一个CDN供应商下的合法域名进行C2请求,如上图所示,失陷主机只需要请求时,修改Host字段的子域名,这样CDN供应商就会根据Host字段,将流量转发给C2服务器。
在下图中,您可以看到如何配置C2 配置文件以允许使用 Fastly 和 AzureEdge CDN 进行域前置:
加州大学伯克利分校的学者发表的这篇研究论文很好地介绍了域前置技术。这篇论文启发了许多研究人员使隐藏C2通信成为可能。其中一位研究人员Vincent,他写了一篇关于域前置的精彩文章。用简单的语言描述了域前置是如何工作的。他还发布了一个 Python 脚本来识别可用于域前置的域名。
纵观我们的入侵案例,我们没有看到很多域前置案例。这很可能是由于部署域前置基础设施需要花费很多成本。虽然,根据我们收集的有关恶意基础设施的数据,域前置技术已经被很多攻击组织使用。根据我们从 2021 年初至今的数据,Amazon Cloudfront 时攻击组织首选的域前置CDN供应商。
上述数据可通过我们的服务获得。有关此服务和其他服务的更多信息,请参见此处。
图片来自: cobaltstrike.com
下面一些入侵案例中,攻击者使用了Cobalt Strike 代理功能
Diavol Ransomware
BazarLoader and the Conti Leaks
Snatch Ransomware
大多数情况下,攻击者建立代理的目的是为了进行RDP连接,获取到RDP会话后攻击者就可以使用图形化界面访问失陷主机,并且在获取一些登录凭证后进行横向移动
下图展示了我们使用Kali Linux中的proxychains工具进行攻击的过程,在图一中攻击者在teamserver上开启了socks监听端口8888.
在图二中,我们通过Kali Linux自带的xfreerdp工具,并在proxychains中配置SOCKS代理IP(teamserver的IP),通过SOCKS代理建立了RDP会话。
在上述攻击活动发生时,会触发Windows系统事件ID:4624 类型为3的登录日志。在登录日志中我们可以发现攻击者使用的主机名和登录源IP为127.0.0.1。
本节将解释不同的C2配置如何影响C2网络通信特征。
在下面的一些示例中,我们模拟了恶意 C2 通信,以展示不同的C2配置文件如何改变观察到的流量。之后,我们将根据我们的观察,检测与横向移动相关的网络数据以及 Cobalt Strike 使用者采用的各种方法。
我们将使用稍微修改过的 jquery 配置文件来说明配置如何定义构成 C2 连接的各个字段。我们之前的文章将此 配置文件介绍为攻击者在我们的入侵报告中最常使用的配置文件之一。
如上图,Cobalt Strike可以根据C2配置产生独特的网络通信流量,图中上半部份为Cobalt Strike产生的HTTP流量,图中下半部分为对应的C2配置文件内容。
C2配置文件决定了 GET 和 POST 请求中使用的所有参数的内容。由于更改这些参数非常简单,因此创建用于主动防御的网络特征很困难。防守方可以从公开可用的配置文件(参见下面的 Sigma 部分)或通过开源报告提取并提供的配置文件创建规则。可以搜索与已知请求意图(例如 jquery 或 amazon)匹配但目标 IP/域名与预期的基础设施不匹配的流量,
Cobalt Strike 支持使用 DNS 作为 C2 通信协议。攻击者可以配置他们的服务器以响应 A、AAAA 或 TXT 记录中的Beacon请求。此策略对于更隐蔽的操作很有用,因为目标主机可能是公用DNS服务器。防守方只能检测流量数据并寻找可疑的 DNS请求。
Cobalt Strike 官方文档 中的截图展示了DNS协议下C2通信的过程。
下面的示例中,我们配置Cobalt Strike使用DNS的A记录进行通信,同样我们可以配置Beacon使用TXT记录、AAAA记录进通信。默认情况下Cobalt Strike使用TXT记录进行请求。
失陷主机: 192.168.88.179
内网DNS服务器: 192.168.88.2
Cobalt Strike C2 域名: infosecppl.store
我们通过Beacon会话在失陷主机中执行systeminfo命令,从下图可以看出,完成命令执行并将数据返回 Cobalt Strike C2服务器需要 148 个包含 DNS 请求和响应的数据包。活动需要 5 秒才能完成。
与 HTTP/HTTPS 流量一样,DNS 流量可以使用C2 配置文件进行随机化。攻击者可用的一些选项如下:
表格来自Cobalt Strike官方文档
另一个Cobalt Strike常见通信协议是SMB,当攻击者获取了网络访问权限后,可以通过SMB Beacon在本地开启端口监听来自其他SMB Beacon的通信。命名管道通信让SMB Beacon通信成为可能。
攻击者可以通过配置文件指定SMB Beacon使用的命名管道名称,默认配置下,命名管道以“msagent_#”开头,其他服务的默认命名管道可以参考@svch0st的文章。
SMB Beacon流量增加了网络检测的难度,并且让攻击者实现通过跳板机访问到一些逻辑隔离的主机。由于大部分网络都不限制SMB的通信行为,这让攻击者在横向移动时十分便利。
在我们以往的案例中,SMB Beacon并不经常使用。然而,它们仍然是高级攻击者手中的强大武器。由于我们没有入侵案例中使用 SMB 的例子,我们从我们的实验室中举了一个例子来证明这种方法的有效性。
我们在目标主机中通过PowerShell加载一个stageless SMB beacon到内存中。执行后目标主机会使用名为“my_pipes”的命名管道进行通信。
安全日志4688记录了这个攻击活动创建进程的日志。
正如我们之前的Cobalt Strike 文章 中所解释的,Sysmon 事件 17 和 18 可以记录命名管道。但是,Sysmon 应该明确配置为记录命名管道。Olaf 的 Sysmon Moduler是一个很好的公共 Sysmon 配置,包括命名管道等等。下面,您可以看到我们在创建 SMB 侦听器时在 Cobalt Strike 接口上指定的命名管道。
此外,如上所述,SMB Beacon 将通过端口 445 与主 Beacon 通信,然后将结果发送到 C2 服务器。这被称为Beacon链。下图说明了跳板机上的Beacon与Beacon链之间的 SMB 通信。描述通信的另一种方式是父/子关系。
网络流量中可以看到目标主机通过SMB 协议与跳板机通信,跳板机通过HTTP协议与C2服务器进行通信的过程。
192.168.38.102 = SMB Beacon
192.168.38.104 = HTTP Parent Beacon
多亏了免费的开源工具,调查网络流量变得更加容易。我们使用特定工具来分析入侵案例中的可疑网络流量。虽然我们相信没有任何一种工具可以提供完美的检测方案,但我们可以通过组合它们来检测恶意流量。在下一节中,我们将了解这些可以优化防守方分析的工具。
我们将通过一些 Sigma 规则来帮助我们检测 Cobalt Strike 的网络活动。Cobalt Strike DNS Beaconing 是由 Florian Roth 创建的规则,它查看 DNS 日志以检测基于 dns_stager_subhost、put_output 和 dns_stager_subhost 的默认 DNS C2 行为,如上所示。
下面是@bareiss_patrick创建的更通用的规则,它是基于对单个域的大量查询来检测可疑 DNS 流量的一个很好的例子。
Daniil Yugoslavskiy创建的另一个更通用的规则使用 dns 日志在一分钟内从单一来源查找 50 条或更多 TXT 记录:
Default Cobalt Strike Certificate是由Bhabesh Raj编写的规则,它使用 Zeek 日志来检测默认的 Cobalt Strike 证书。
Samir Bousseaden的 RDP over Reverse SSH Tunnel WFP 规则,可以使用反向隧道查找可疑的 RDP 活动。
Markus Neis 的 CobaltStrike Malleable Amazon Browsing Traffic Profile规则,检测伪装成Amazon的C2通信。
其他可延展配置文件规则包括 Malleable Profiles 中的 CobaltStrike Malformed UAs in Malleable Profiles、CobaltStrike Malleable (OCSP) Profile和 CobaltStrike Malleable OneDrive Browsing Traffic Profile。
Rita全称(Real Intelligence Threat Analytics) 由Active Countermeasures开发。Rita 是一个检测C2通信的框架。它基于Zeek 日志数据,根据我们的经验,它可以准确地检测信标活动。
Rita 的一大特色是它的易用性和各种形式的详细输出信息,包括 CSV 和 HTML。只需将 Rita 指向 Zeek 日志并等待结果即可。可用数据越多,结果就越精确。可以从 PCAP 生成 Zeek 日志。
下面的屏幕截图示例显示了 Rita 根据我们在前面部分中使用的流量创建的结果,例如 jquery C2 配置文件通信。
我们让 Beacon 运行一个小时以模拟实际环境,同时其他几个与网络无关的进程在后台运行。在这个小时内,我们通过 Beacon 执行多个命令。rita准确地从一小时的数据中定位出Beacon通信并标注最高分数,提供给rita的数据越多,结果就越准确。
我们可以看到我们最近的一个案例BazarLoader and the Conti Leaks的结果。前三个 IP 地址与 Beacon 通信的 C2服务器有关。
Rita 准确地识别了与 Cobalt Strike C2 通信相关的信标活动。使用 Rita,我们可以根据多个变量识别恶意 C2 流量,包括通信频率、发送/接收的平均字节数、连接数等。因此,无论使用的C2 配置文件或任何额外的抖动如何,我们都可以检测到 Cobalt Strike 通信。
JA3 是由 John Althouse、Jeff Atkinson 和Josh Atkins创建的开源项目。JA3/JA3S 可以生成SSL通信中客户端和服务器的指纹。指纹的计算来源时以下几个值:
- SSL Version
- Accepted Ciphers
- List of Extensions
- Elliptic Curves
- Elliptic Curve Formats
有关 JA3 工作原理的更多信息,您可以在此处访问官方 GitHub 代码仓库:https://github.com/salesforce/ja3。
JA3用于生成客户端侧连接服务端Beacon的连接指纹,JA3S用于生成服务端的指纹。结合JA3和JA3S可以获得最准确的检测结果。这种方法的缺点是,如果 Cobalt Strike 在转发器后面,它可能会产生不准确的结果。
我们可以找到许多包含 Cobalt Strike 指纹对应的 JA3 值的报告。当谈到 Cobalt Strike 基础设施时,我们正在寻找的已知 JA3 和 JA3s 指纹是:
JA3
72a589da586844d7f0818ce684948eea
a0e9f5d64349fb13191bc781f81f42e1
JA3s
b742b407517bac9536a77a7b0fee28e9
ae4edc6faf64d08308082ad26be60767
通过使用 JA3/S 签名,我们可以发现各种恶意软件 C2 服务器,而不仅仅是 Cobalt Strike。Salesforce 在这里提供了许多常见应用程序的指纹集合。例如:
Trickbot: 6734f37431670b3ab4292b8f60f29984
AsyncRat: fc54e0d16d9764783542f0146a98b300
Dridex: 51c64c77e60f3980eea90869b68c58a8
JA3 of Python usually hosting Empire or PoshC2: db42e3017c8b6d160751ef3a04f695e7
TOR client: e7d705a3286e19ea42f587b344ee6865
另一个针对JA3 签名进行测试的网站是ja3er。
与 JA3/JA3S 类似,JARM 能够对远程服务器的 TLS 通信进行指纹识别。它通过与目标服务器交互发送 10 个 TLS 客户端hello数据包并记录回复中的特定属性来实现这一点。然后它将对结果值进行哈希处理并创建最终的 JARM 指纹。
与 JA3/S 不同,JARM 是一种对远程服务器应用程序进行主动指纹识别的方式。John Althouse创建了一篇文章,准确传达了 JA3/S 和 JARM 之间的区别:
“JARM 主动扫描服务器并构建服务器应用程序的指纹。JA3/S 是被动的,只是倾听,而不是伸出手,而 JARM 是主动的,主动探测目标。 并且能够构建 JA3S 无法构建的服务器应用程序指纹。”
DFIR Report
根据JAVA开发语言使用的TLS版本,生成的Cobalt Strike 默认配置的 JARM 指纹是:
07d14d16d21d21d00042d41d00041de5fb3038104f457d92ba02e9311512c2
Cobalt Strike 依赖于 Java 来运行客户端图形用户界面 (GUI) 和团队服务器。当我们使用 JARM 扫描 Cobalt Strike 服务器时,我们得到的结果取决于所使用的 Java 版本。根据 Cobalt Strike 的文档,OpenJDK 11 是攻击者需要安装的首选版本。这使得识别潜在的 Cobalt Strike 服务器变得更加容易,但是,防守方应该意识到,仅此结果就容易出现误报。这是因为 Internet 上的许多其他合法服务器都使用此版本的 Java 来运行其 Web 应用程序。
2021 年 4 月 20 日,Java 禁用了 TLS 1.0 和 TLS 1.1,转而支持 TLS 1.2 或更高版本。在此更改之后,Cobalt Strike 服务器的 JARM 指纹发生了变化:
From: 07d14d16d21d21d07c42d41d00041d24a458a375eef0c576d23a7bab9a9fb1
To: 07d14d16d21d21d00042d41d00041de5fb3038104f457d92ba02e9311512c2
@bodziurity 和@WLesicki 共同强调了这一变化:
Cobalt Strike 官方有一篇专门介绍 JARM 的文章,详细介绍了 JARM 的工作原理以及如何根据 Java 版本创建特定的哈希值。
纵观我们以往的报告,这个默认指纹在4个案例中出现过,可以使用JARM python tool:生成JARM指纹
python3 jarm.py [target] -p [port]
虽然 JARM 提供了另一种工具来帮助揭示对手的基础设施,但它们并不是可以单独使用的指标。JARM 签名可以被屏蔽,Dagmawi Mulugeta 在 HiTB Amsterdam in 2021展示了一种工具,使攻击者能够屏蔽其基础设施的 JARM 签名。该工具称为 JARM Randomizer,可以配置为 Cobalt Strike 服务器前面的代理,以向潜在的互联网扫描仪提供虚假数据。
更多的JARM指纹可以访问:https://github.com/cedowens/C2-JARM.
我们这里也提到了Arkime,因为它将 JA3/JA3S 和其他插件集成以增强网络分析。Arkime 是我们经常用来调查网络活动和收集指标的工具。它可以索引网络流量并使事件易于搜索。
Arkime 设置简单,非常适合查看流量。Arkime 通过将它们作为插件包含在内来使用其他分析工具。在下一份报告中将详细介绍此工具和其他工具。