攻击者总是能找到各种创造性的方法来绕过防御功能并达到他们的目的,例如通过打包程序、加密程序和代码混淆来实现。然而,逃避检测以及最大化兼容性的最佳方法之一是使用操作系统自身的功能。
在勒索软件威胁的背景下,一个值得注意的情况是利用加密 DLL ADVAPI32.dll 中存在的导出函数,例如 CryptAcquireContextA、CryptEncrypt 和 CryptDecrypt。通过这种方式,攻击者可以确保恶意软件在支持此 DLL 的各种版本的操作系统中运行并模拟正常行为。
而在最近的一次事件响应中,另一种巧妙的技术引起了安全研究人员的注意:使用原生 BitLocker 功能加密并窃取解密密钥。BitLocker 的最初目的是解决丢失、被盗或不当退役设备导致数据被盗或泄露的风险,然而,威胁者发现这种机制可以被重新用于实现恶意目的,且效果非常好。
在该事件中,攻击者能够部署并运行一个高级 VBS 脚本,该脚本利用 BitLocker 进行未经授权的文件加密。安全研究人员在墨西哥、印度尼西亚和约旦发现了此脚本及其修改版本。本文将详细分析在事件响应工作中获得的恶意代码,并提供缓解此类威胁的建议。
这不是我们第一次看到 BitLocker 用于加密驱动器并索要赎金。以前,攻击者在访问和控制关键系统后,会使用此 Microsoft 实用程序来加密这些系统。然而,在这种情况下,攻击者采取了额外的措施来最大限度地扩大攻击造成的损害,并阻碍对事件的有效响应。
一个有趣的现象是,攻击者没有像威胁者通常做的那样费心混淆大部分代码。对此最合理的解释是,当脚本执行时,他们已经完全控制了目标系统。它以 Disk.vbs 的形式存储在 C:\ProgramData\Microsoft\Windows\Templates\ 中。
它的第一行包含一个函数,该函数使用 ADODB.Stream 对象将字符串转换为其二进制表示形式。此函数稍后用于编码要在 HTTP POST 请求中发送的数据。
脚本主要功能的第一步是使用 Windows 管理规范 (WMI) 在 Win32_OperatingSystem 类的帮助下查询有关操作系统的信息。对于查询结果中的每个对象,脚本都会检查当前域是否与目标不同。如果不同,脚本将自动完成。
之后,它会检查操作系统的名称是否包含“xp”、“2000”、“2003”或“vista”,如果 Windows 版本与其中任何一个匹配,脚本将自动完成并删除自身。
此后,脚本继续依赖 WMI 查询有关操作系统的信息。然后,它会执行磁盘大小调整操作,这些操作可能会因操作系统版本检查的结果而异。这些操作仅在固定驱动器(DriveType = 3)上执行。文件系统中通常存在以下驱动器类型:
恶意软件不会尝试在网络驱动器(DriveType = 4)上执行相同操作的可能原因是为了避免触发网络上的检测工具。
为了调整 Windows Server 2008 或 2012 中的本地驱动器大小,脚本会检查主启动分区并保存此信息。它会保存不同分区的索引,然后使用 diskpart 执行以下操作:
·将每个非启动分区的大小缩小 100 MB。这将在启动卷以外的每个分区中创建 100 MB 的未分配空间;
如果操作成功,代码将使用实用程序 bcdboot 和之前保存为启动卷的驱动器号在新的主分区上重新安装启动文件。
其他操作系统版本的分区缩小操作类似,但出于兼容性原因,使用不同的代码段实现。下面的示例显示了应用于 Windows 版本 7、8 和 8.1 的过程。
对于 Windows 2008 或 7,分区压缩过程完成后,变量 matchingDrives 会保存以逗号分隔的驱动器号,但前提是文件系统为 NFTS、exFAT、FAT32、ReFS 或 FAT。代码经过修改,可打印示例:
此外,有多个函数执行这些操作,每个函数都是为不同版本的 Windows 设计的。在某些条件下,它会通过远程服务器管理工具的 ID 266 检查 BitLocker 驱动器加密工具是否处于活动状态。然后,恶意软件会检查 BitLocker 驱动器加密服务 (BDESVC) 是否正在运行。如果没有,它会启动该服务。
之后,恶意软件会禁用用于保护 BitLocker 加密密钥的保护程序并将其删除。删除方法可能因操作系统版本而异。在 Windows Server 2008 或 Windows 7 场景中,这是通过 VBS 功能实现的,之后脚本使用 PowerShell 强制删除保护程序。
·著名的全字母句子“敏捷的棕色狐狸跳过了懒狗”,有小写和大写两种形式,其中包含英文字母表的每个字母;
该密码的随机性由受影响系统的各种元素(例如已用内存和网络统计信息)组成的种子实现。稍后,这些信息将发送给攻击者。我们在自己的环境中测试了密钥生成逻辑,对脚本进行了轻微修改后,就能看到生成的密码。
然后,代码将先前生成的加密密钥转换为安全字符串(一种防止在内存中创建字符串对象的 PowerShell 选项),并有效地在驱动器上启用 BitLocker。
攻击者使用域名混淆其真实地址。该域名是合法的,属于CloudFlare,用于为开发人员提供快速隧道。攻击者配置的子域名是scottish-agreement-laundry-further。
通过一些调整,我们能够打印发送给攻击者的数据,如下图所示。请注意,数据包括计算机名称、Windows 版本、受影响的驱动器和密码字符串。因此,受害者的 IP 地址也将记录在攻击者的服务器上,从而允许他们跟踪每个受害者。
删除 BitLocker 保护器并配置驱动器加密后,脚本将执行以下步骤来掩盖其踪迹。它会验证主机名是否是此恶意软件的目标,然后删除文件:
它会打开系统防火墙并删除其所有规则,还会删除 VolumeInit 和 VolumeCheck 任务,最后,恶意软件会执行强制关机。
关机后,受害者将看到 BitLocker 屏幕。如果用户尝试使用恢复选项,他们将看不到任何内容,只会看到一条消息:“您的 PC 上没有其他 BitLocker 恢复选项”。
分析显示,该威胁者对 VBScript 语言以及 Windows 内部和实用程序(例如 WMI、diskpart 和 bcdboot)有深入的了解。以下是针对此场景确定的 TTP。
由于脚本执行的本地活动包括清理其痕迹、清除一些日志和为执行而创建的任务,以及最后加密整个驱动器,因此获取取证证据来识别恶意活动并找到解密的机会并不容易。
幸运的是,部分脚本内容和执行的命令已被第三方服务注册并记录,并被收集起来进行分析。这使我们能够从部分受影响的系统中获取加密密钥转换后的安全字符串。
在其他地方,我们尝试收集存储对 C2 的 POST 请求的网络日志。但是,Web 活动日志的最常见配置包括 GET,但不包括 POST 请求。
最终获得了 POST 请求。该案例提供了记录 POST 流量的理由,并确保所有关键系统活动都转发到中央存储库,该存储库有足够的空间来存储建议保留期(六个月或更长时间)的数据,以避免在攻击者从各个系统中删除所有痕迹后丢失证据。
最后,客户基础设施中的一些系统仍未加密,最初被认为未受到影响。然而,后来发现它们确实受到了影响,但这些系统中没有配置 BitLocker。这使我们能够获取脚本本身,分析其行为并收集进一步的证据。
虽然我们可以获得威胁者为创建加密密钥而实施的一些密码和固定值,但脚本包含一些变量值,并且每个受影响的系统都不同,这使得解密过程变得困难。
鼓励公司使用 BitLocker 或其他加密工具(例如 VeraCrypt)来保护公司机密。但是,必须采取一些预防措施,以避免攻击者滥用。
·启用网络流量日志记录和监控。配置 GET 和 POST 请求的日志记录。如果发生感染,对攻击者域发出的请求可能包含密码或密钥;
·监控与 VBS 执行和 PowerShell 相关的事件,并将记录的脚本和命令保存到外部存储库,存储可能在本地删除的活动;
此次事件响应和恶意软件分析证明攻击者不断改进策略以逃避检测。在这次事件中,安全研究人员观察到攻击者滥用原生 BitLocker 功能,进行未经授权的数据加密。VBS 脚本表明参与此次攻击的恶意分子对 Windows 内部机制了如指掌。尽管脚本分析一点也不复杂,但这种威胁很难检测,因为可以轻松修改工件内部的唯一字符串以绕过 YARA 规则。因此,在这种情况下,最好的检测方法是行为分析,它将应用程序执行的不同操作关联起来以得出结论。