ICEDIDs 网络基础设施运行良好

Elastic Security Labs 详细介绍了如何使用开源数据收集和 Elastic Stack 来分析 ICEDID 僵尸网络 C2 基础设施。

阅读 19 分钟攻击模式
ICEDIDs network infrastructure is alive and well

主要收获

  • ICEDID 是一款功能齐全的木马,它使用 TLS 证书绑定来验证 C2 基础设施。
  • 虽然该木马已被追踪多年,但它仍在相对不受阻碍地运行。
  • 可以使用开源收集工具的组合来跟踪 C2 基础设施。

有关 ICEDID 配置提取器和 C2 基础设施验证器的信息,请查看我们详细介绍这些内容的帖子

前言

ICEDID,也称为 Bokbot,是一种模块化银行木马,于 2017 年首次被发现,并且在过去几年中一直保持活跃。最近,它更广为人知的是其加载辅助有效负载的能力,例如 Cobalt Strike 等后渗透框架,并且已勒索软件活动相关联。

ICEDID 是通过具有不同组件的多阶段过程实现的。初始访问通常是通过利用恶意文档或文件附件的网络钓鱼活动获得的。

我们将在接下来的几个部分中讨论 ICEDID 的各个方面,并探索我们跟踪 ICEDID 基础设施的分析技术。

  • 初始访问
  • 命令和控制
  • 持久性
  • 核心功能
  • 网络基础设施

正如前言中所述,ICEDID 已存在多年,并且具有丰富的功能集。由于该恶意软件多年来已被多次分析,我们将重点关注一些更有趣的功能。

初始访问

ICEDID 感染的形式多种多样,并已使用不同的技术和新型执行链进行调整,以避免检测并逃避反恶意软件产品。在此示例中,ICEDID 是通过网络钓鱼电子邮件传递的。该电子邮件包含一个带有嵌入式 ISO 文件的 ZIP 存档。ISO 文件内部是一个 Windows 快捷方式 (LNK),当双击时,它会执行第一阶段 ICEDID 加载程序(DLL 文件)。

Windows 快捷方式目标值配置为执行 %windir%\system32\rundll32.exe olasius.dll,PluginInit,调用 PluginInit 导出,该导出启动 ICEDID 感染的初始阶段。此阶段负责解密嵌入的配置、从 C2 服务器下载 GZIP 有效负载、将加密的有效负载写入磁盘 ( license.dat ),并将执行转移到下一阶段。

ICEDID 的第一阶段首先解密存储在 DLL 中的加密配置数据 Blob,该数据 Blob 用于保存 C2 域和活动标识符。前 32 个字节表示 XOR 密钥;然后使用此密钥解密加密的数据。

命令和控制

ICEDID 使用 Cookie 参数构造初始 HTTP 请求,其中包含来自受感染计算机的十六进制数据,用于对受害者计算机进行指纹识别。无论之前是否有任何识别信息,此请求都将继续下载 GZIP 有效负载。

eSentire 已发布研究,详细描述了 gads、gat、ga、u 和 io Cookie 参数是如何创建的。

以下是 Cookie 参数及其背后的示例关联值。

参数示例数据注意
__gads3000901376:1:16212:134包含活动 ID、标志、GetTickCount、正在运行的进程数
__gat10.0.19044.64操作系统版本、架构
__ga1.591594.1635208534.76来自 CPUID/SwitchToThread 函数的虚拟机监控程序/处理器信息
__u4445534B544F502D4A4B4738455432:6A6F656C2E68656E646572736F6E:33413945354637303742414339393534存储计算机名称、用户名和机器人 ID
__io21_3990468985_3832573211_2062024380安全标识符 (SID)
__gid006869A80704加密的 MAC 地址

下载的 GZIP 有效负载包含一个自定义结构,其中包含第二个加载程序 ( hollow.dat ) 和加密的 ICEDID 核心有效负载 ( license.dat )。这两个文件被写入磁盘,并结合使用以在内存中执行核心有效负载。

下一阶段突出显示了 ICEDID 的一个独特元素,即它如何通过使用自定义标头结构而不是传统的 PE 标头来加载核心有效负载 ( license.dat )。使用下一个有效负载的各个部分循环分配内存,并将其放入其自身的虚拟内存空间中。这种方法已得到充分记录,并作为一种阻碍分析的技术。

每个部分的内存保护都由 VirtualProtect 函数修改,以使用 PAGE_READWRITE 常量启用对内存提交区域的只读或读/写访问。

设置映像入口点后,通过调用 rax x86 寄存器加载 ICEDID 核心有效负载。

持久性

ICEDID 将首先尝试使用计划任务设置持久性,如果失败,它将改为创建 Windows 注册表运行键。使用机器人 ID 和 RDTSC 指令,随机生成计划任务或运行键名称。使用 taskschd.dll 创建计划任务,配置为在用户登录时运行,并每 1 小时无限期触发一次。

核心功能

ICEDID 恶意软件的核心功能已得到充分记录,并且基本上没有变化。要了解有关核心有效负载和功能的更多信息,请查看 Malpedia 页面,其中包含有关 ICEDID 的已完成研究语料库。

也就是说,在我们的分析期间,我们统计了 23 个模块,其中包括

  • 用于窃取凭据的 MitM 代理
  • 反向连接模块
  • 命令执行 (PowerShell, cmd)
  • Shellcode 注入
  • 收集
    • 注册表项数据
    • 正在运行的进程
    • 凭据
    • 浏览器 Cookie
    • 系统信息(网络、防病毒、主机枚举)
  • 搜索和读取文件
  • 用户桌面上目录/文件列表

ICEDID 配置提取器

Elastic Security Labs 发布了一个在 Apache 2.0 许可下获得许可的开源工具,该工具允许从 ICEDID 样本中提取配置。该工具可在此处下载:此处

TLS 证书绑定

之前对 ICEDID 恶意软件家族的研究突出表明了该活动如何以重复的方式创建其自签名 TLS 证书。尤其值得注意的是,此创建 TLS 证书的技术大约有 18 个月没有更新了。虽然本质上是推测性的,但这可能反映了威胁数据提供商没有广泛跟踪此 C2 基础设施的事实。这允许 ICEDID 专注于更新其活动中更短暂的元素(文件哈希、C2 域和 IP 地址)。

Check Point 团队发布了深入且详尽的研究报告,详细介绍了如何使用 ICEDID 的 TLS 证书绑定功能来追踪 ICEDID 基础设施。此外,Check Point 还发布了一个脚本,该脚本接收 IP 地址和端口,并根据 ICEDID 恶意软件计算的值验证可疑的 TLS 序列号,以确认该 IP 地址当前是否正在使用 ICEDID TLS 证书。

我们在此包含一个封装器,它结合了来自 Censys 的互联网扫描数据和来自 Check Point 脚本的 ICEDID C2 基础设施确认信息。可以从此处下载。

数据集

正如 Check Point 报告的那样,TLS 证书信息使用相同的颁发者和主体可分辨名称来验证 C2 服务器,然后再发送任何数据。

为了构建我们的数据集,我们使用了 Censys CLI 工具来收集证书数据。我们需要对 Check Point 研究中的查询进行一些调整,但结果相似。

censys search 'services.tls.certificates.leaf_data.subject_dn:"CN=localhost, C=AU, ST=Some-State, O=Internet Widgits Pty Ltd" and services.tls.certificates.leaf_data.issuer_dn:"CN=localhost, C=AU, ST=Some-State, O=Internet Widgits Pty Ltd" and services.port=443'

[
  {
    "ip": "103.208.85.237",
    "services": [
      {
        "port": 22,
        "service_name": "SSH",
        "transport_protocol": "TCP"
      },
      {
        "port": 80,
        "service_name": "HTTP",
        "transport_protocol": "TCP"
      },
      {
        "port": 443,
        "service_name": "HTTP",
        "certificate": "c5e7d92ba63be7fb2c44caa92458beef7047d7f987aaab3bdc41161b84ea2850",
        "transport_protocol": "TCP"
      }
    ],
    "location": {
      "continent": "Oceania",
      "country": "New Zealand",
      "country_code": "NZ",

…truncated…

这为我们提供了 113 个 IP 地址,这些地址正在使用我们可以归因于 ICEDID 活动的证书。

JARM / JA3S

在查看来自 Censys 的数据时,我们还识别出其他可用于跟踪 TLS 通信的字段:JARMJA3S,它们都是 Salesforce 团队提供的 TLS 指纹识别工具。

从高层次来看,JARM 通过主动收集 TLS 服务器 Hello 响应的特定元素来对 TLS 服务器进行指纹识别。JA3S 被动地从 TLS 服务器 Hello 消息中收集值。JARM 和 JA3S 分别以 62 个字符或 32 个字符的指纹表示。

JARM 和 JA3S 添加了其他数据点,提高了我们连接 ICEDID C2 基础设施的信心。在我们的研究中,我们将 2ad2ad16d2ad2ad22c2ad2ad2ad2adc110bab2c0a19e5d4e587c17ce497b15 识别为 JARM 指纹,将 e35df3e00ca4ef31d42b34bebaa2f86e 识别为 JA3S 指纹。

应该注意的是,JARM 和 JA3S 通常不够独特,无法单独用来确定主机的嫌疑。例如,在 Censys 数据集中,JARM 指纹识别出超过 1.5 万个主机,而 JA3S 指纹识别出超过 330 万个主机。同时查看 JARM 和 JA3S 值仍然大约有 8 千个主机。这些是通往答案过程中的数据点,而不是答案本身。

ICEDID 植入防御

在 ICEDID 与其 C2 服务器通信之前,它会通过将证书序列号与证书公钥的哈希值进行比较来执行 TLS 证书检查。由于证书序列号应全部唯一,因此 ICEDID 使用自签名证书和预期的证书序列号来验证 TLS 证书。如果公钥的哈希值和序列号不匹配,则与 C2 服务器的通信不会继续。

我们使用了 Check Point Python 脚本(该脚本为每个传递的 IP 地址返回 truefalse 结果)来执行额外的检查,以提高我们对 IP 地址是 ICEDID C2 基础设施的一部分的信心,而不是仅仅是 ICEDID TLS 证书的主体和颁发者信息巧合相同。true 结果具有匹配的 ICEDID 指纹,而 false 结果则没有。这导致 103 个 IP 被确认为具有 ICEDID TLS 证书,而 10 个 IP 没有(截至 2022 年 10 月 14 日)。

导入到 Elasticsearch

现在,我们有了一种基于 TLS 证书元素收集 IP 的方法,并且有一种添加额外上下文以帮助确认的方法;我们可以将逻辑封装在一个 Bash 脚本中,作为自动化此过程并在 Elasticsearch 中解析数据进行分析的方法。

#!/bin/bash -eu

set -o pipefail

SEARCH='services.tls.certificates.leaf_data.subject_dn:"CN=localhost, C=AU, ST=Some-State, O=Internet Widgits Pty Ltd" and services.tls.certificates.leaf_data.issuer_dn:"CN=localhost, C=AU, ST=Some-State, O=Internet Widgits Pty Ltd" and services.port=443'

while read -r line; do
    _ts=$(date -u +%FT%TZ)
    _ip=$(echo ${line} | base64 -d | jq '.ip' -r)
    _port=$(echo ${line} | base64 -d | jq '.port' -r)
    _view=$(censys view "${_ip}" | jq -c)
    _is_icedid=$(python3 -c "import icedid_checker; print(icedid_checker.test_is_icedid_c2('${_ip}','${_port}'))")

    echo "${_view}" | jq -S --arg is_icedid "${_is_icedid}" --arg timestamp "${_ts}" '. + {"@timestamp": $timestamp, "threat": {"software": {"icedid": {"present": $is_icedid}}}}'
done < <(censys search --pages=-1 "${SEARCH}" | jq '.[] | {"ip": .ip, "port": (.services[] | select(.certificate?).port)} | @base64' -r) | tee icedid_infrastructure.ndjson

这将数据输出为名为 icedid_infrastructure.ndjson 的 NDJSON 文档,我们可以将其上传到 Elasticsearch。

在上图中,我们可以看到有些主机具有已识别的 JARM 指纹、已识别的 TLS 颁发者和主体元素,但未通过 Check Point 验证检查。此外,两个主机中的一个具有不同的 JA3S 指纹。这突出了组合多个数据源以提供置信度评分的价值。

我们还提供了此脚本供其他人使用。

观察到的攻击者战术和技术

Elastic 使用 MITRE ATT&CK 框架来记录高级持续性威胁针对企业网络使用的常见战术、技术和程序。

如上所述,ICEDID 已得到广泛分析,因此下面我们列出了我们在本次研究出版物中观察到并涵盖的战术和技术。如果您对全套 MITRE ATT&CK 战术和技术感兴趣,可以查看 MITRE 关于 ICEDID 的页面

战术

战术代表技术或子技术的原因。这是攻击者的战术目标:执行操作的原因。

技术 / 子技术

技术和子技术代表攻击者如何通过执行操作来实现战术目标。

检测和预防

检测逻辑

预防

  • 恶意行为检测警报:命令 Shell 活动
  • 内存威胁检测警报:Shellcode 注入
  • 恶意行为检测警报:Rundll32 或 Regsvr32 加载的异常 DLL 扩展
  • 恶意行为检测警报:可疑的 Windows 脚本解释器子进程
  • 恶意行为检测警报:带有异常参数的 RunDLL32
  • 恶意行为检测警报:从存档文件执行 Windows 脚本

YARA

Elastic Security 创建了 YARA 规则来识别此活动。以下是专门用于识别 ICEDID 使用的 TLS 证书绑定功能的 YARA 规则。

rule Windows_Trojan_IcedID_cert_pinning {
    meta:
        author = "Elastic Security"
        creation_date = "2022-10-17"
        last_modified = "2022-10-17"
        threat_name = "Windows.Trojan.IcedID"
        arch_context = "x86"
        license = "Elastic License v2"
        os = "windows"
    strings:
		$cert_pinning = { 74 ?? 8B 50 ?? E8 ?? ?? ?? ?? 48 8B 4C 24 ?? 0F BA F0 ?? 48 8B 51 ?? 48 8B 4A ?? 39 01 74 ?? 35 14 24 4A 38 39 01 74 ?? }
    condition:
        $cert_pinning
}

参考

在以上研究中引用了以下内容

指标

本研究中观察到的指标如下发布。所有工件(包括通过 TLS 证书绑定发现的工件)也可供下载,合并的 zip 捆绑包包含 ECS 和 STIX 格式。

指标类型注意
db91742b64c866df2fc7445a4879ec5fc256319e234b1ac5a25589455b2d9e32SHA256ICEDID 恶意软件
yolneanz[.]com域名ICEDID C2 域名
51.89.190[.]220ipv4-addrICEDID C2 IP 地址