提取 Cobalt Strike Beacon 配置

第二部分 - 从 Cobalt Strike 植入信标中提取配置。

7 分钟阅读
Extracting Cobalt Strike Beacon Configurations

请查看我们关于如何使用 Elastic Stack 收集 Cobalt Strike 信标植入的上一篇文章。我们将基于这些信息来提取信标的配置。

在本文中,我们将演示如何使用出色的 Cobalt Strike 配置提取器 (CSCE) 从二进制信标有效负载手动分析 Cobalt Strike C2 配置。我们还将介绍如何启用 Elastic Stack 的一些新功能,这些功能允许您通过从内存中提取信标,在所有受监控的端点上大规模执行此操作。

Blackberry 团队有一本名为“在黑暗中寻找信标”(需要注册)的优秀手册,其中深入探讨了 Cobalt Strike 信标配置。我们将在此处讨论配置中的几个字段,但如果您有兴趣了解信标的功能,我们强烈建议您查看该资源。

Cobalt Strike 配置提取器

Stroz Friedberg 的Cobalt Strike 配置提取器 (CSCE)是一个“用于从 Cobalt Strike 信标中提取和解析配置的 Python 库和脚本集”。

要使用 CSCE,我们将创建一个 Python 虚拟环境,激活它,并安装 CSCE Python 包。

设置 Cobalt Strike 配置提取器

$ python3 -m venv csce

$ source csce/bin/activate

(csce) $ pip3 install libcsce

...truncated...
Collecting libcsce
  Using cached libcsce-0.1.0-py3-none-any.whl (24 kB)
Collecting pefile>=2019.4.18
...truncated...

接下来,我们可以在从内存中提取的信标有效负载上运行 CSCE,以查看是否存储了任何我们可以收集的有趣信息(我们将添加 --pretty 标志,以使输出更容易读取为 JSON 文档)。

查看 CS 信标配置的原子指标

(csce) $ csce --pretty beacon.exe

{
  "beacontype": [
    "HTTPS"
  ],
  "sleeptime": 45000,
  "jitter": 37,
  "maxgetsize": 1403644,
  "spawnto": "GNEtW6h/g4dQzm0dOkL5NA==",
  "license_id": 334850267,
  "cfg_caution": false,
  "kill_date": "2021-12-24",
  "server": {
    "hostname": "clevelandclinic[.]cloud",
    "port": 443,
    "publickey": "MIGfMA0GCSqGSIb3DQEBAQUAA4G...
...truncated...

我们立即可以看到信标使用 HTTPS 进行通信,并且域名为 clevelandclinic[.]cloud。这为我们提供了一个可以进行一些分析的原子指标。查看可塑的命令和控制文档,我们可以获得配置变量的描述。

例如,我们可以看到 sleeptime450000 毫秒,这会将默认信标签入时间从每 60 秒更改为 450 秒,即 7 分半钟。此外,我们看到抖动为 37,这意味着 450000 毫秒的随机抖动为 37%(166,500 毫秒),因此信标签入时间可能在 283,000450,000 毫秒之间(4.7 - 7.5 分钟)。

此外,Cobalt Strike Team Server 使用 publickey 字段来加密服务器和信标之间的通信。这与使用浏览器或数据传输库(如 cURL)访问 C2 域时使用的普通 TLS 证书不同。此字段值得注意,因为 Team Server 对每个信标使用相同的 publickey,因此此字段对于将信标与它们的透视图 Team Server 聚类很有价值,因为威胁参与者经常对多个活动使用相同的 Team Server,因此配置中的此数据可用于将威胁参与者链接到多个活动和基础设施。

继续查看配置输出,我们可以看到另一个有趣的关于 process-inject 嵌套字段 stub 的部分

查看 process-inject.stub 字段

(csce) $ csce --pretty beacon.exe

...truncated...
  "process-inject": {
    "allocator": "NtMapViewOfSection",
    "execute": [
      "CreateThread 'ntdll!RtlUserThreadStart'",
      "CreateThread",
      "NtQueueApcThread-s",
      "CreateRemoteThread",
      "RtlCreateUserThread"
    ],
    "min_alloc": 17500,
    "startrwx": false,
    "stub": "IiuPJ9vfuo3dVZ7son6mSA==",
    "transform-x86": [
      "prepend '\\x90\\x90'"
    ],
...

stub 字段包含 Cobalt Strike Java 存档的 Base64 编码的 MD5 文件哈希。要转换此哈希,我们可以再次使用 CyberChef,这次添加“From Base64”和“To Hex” 配方,确保将“To Hex”配方中的“Delimiter”更改为“None”。

现在我们有了 Java 存档的 MD5 值(222b8f27dbdfba8ddd559eeca27ea648),我们可以针对 VirusTotal 等在线数据库检查该值以获取更多信息,特别是 SHA256 哈希(7af9c759ac78da920395debb443b9007fdf51fa66a48f0fbdaafb30b00a8a858)。

最后,我们可以通过访问 https://verify.cobaltstrike.com 并搜索哈希来使用 CobaltStrike 验证 SHA256 哈希,以识别 Java 存档的版本。

现在我们知道此信标是使用 Cobalt Strike 4.4 的许可版本创建的。

配置中另一个有助于活动聚类的字段是 license_id 字段。

查看 Cobalt Strike 水印

...truncated
  "spawnto": "GNEtW6h/g4dQzm0dOkL5NA==",
  "license_id": 334850267,
  "cfg_caution": false,
...truncated...

这通常被称为水印,是一个 9 位数值,每个许可证都是唯一的。虽然可以修改此值,但它仍然可以与 process-inject.stubpublickey 字段(如上所述)结合使用,以聚类基础设施和活动组。

这些只是可以使用从 Cobalt Strike 信标提取的配置来识别和聚类活动的一些字段。如果您对配置的深入分析感兴趣,我们建议您查看 Blackberry 团队的“在黑暗中寻找信标” Cobalt Strike 手册

将分析付诸行动

为了测试我们的分析师手册,以收集 Cobalt Strike 信标载荷、它们的配置以及其中包含的元数据,我们可以将这些应用于更多数据,以识别活动集群。

在上面的插图中,我们可以根据威胁行动者共享使用的信标载荷公钥对他们进行聚类,正如我们上面描述的,每个 Team Server 的公钥都是唯一的。 这将允许我们将多个信标载荷哈希、基础设施和活动分组到一个威胁行动者。

与往常一样,使用从信标载荷配置中提取的原子指标(在我们的示例中为 clevelandclinic[.]cloud)允许您识别其他共享基础设施、目标行业和威胁行动者的能力。

这次全速前进

我们在本次发布中强调的所有步骤,以及之前的发布,都可以使用 Cobalt Strike 信标提取项目自动执行并写入 Elasticsearch 中。

总结

在这篇文章中,我们重点介绍了 Elastic Stack 中可用于收集 Cobalt Strike Malleable C2 信标载荷的新功能。此外,我们还介绍了构建 Fleet 策略以从内存中提取信标载荷及其配置的过程。

这些 Fleet 策略和过程使安全分析师能够收集 Cobalt Strike 信标载荷及其配置,以识别威胁行动者控制的基础设施和集群活动。

工件

可观察项 | 类型 | 注释 -------------------------------------------------------------------|-------------|------------------------------------------ 697fddfc5195828777622236f2b133c0a24a6d0dc539ae7da41798c4456a3f89 | SHA256 | Cobalt Strike Malleable C2 信标载荷 7475a6c08fa90e7af36fd7aa76be6e06b9e887bc0a6501914688a87a43ac7ac4 | SHA256 | Cobalt Strike Malleable C2 信标载荷 f9b38c422a89d73ebdab7c142c8920690ee3a746fc4eea9175d745183c946fc5 | SHA256 | Cobalt Strike Malleable C2 信标载荷 clevelandclinic[.]cloud | 域名 | Cobalt Strike Malleable C2 域名 104[.]197[.]142[.]19 | ipv4-addr | Cobalt Strike Malleable C2 IP 地址 192[.]64[.]119[.]19 | ipv4-addr | Cobalt Strike Malleable C2 IP 地址

工件

工件还可以在下载中以 ECS 和 STIX 格式提供,并打包在同一个 zip 文件中。