安全技术

卷影副本删除方法再研究

zeronohacker · 4月29日 · 2020年 · · · 243次已读

本文翻译自:https://www.fortinet.com/blog/threat-research/stomping-shadow-copies-a-second-look-into-deletion-methods.html

1 前述

在最近几年,勒索软件对组织机构来说成了一种非常大的威胁,并给其造成了巨大的损失,估计达数十亿美元。为了提高勒索成功率,勒索软件执行的常见操作是擦除卷备份(即卷影副本),从而阻止受害者恢复已加密的任何文件。

在本博客中,我们回顾了勒索软件用于删除卷影副本的现有方法,以便能让防御者对他们需要保护的资源所用到的技术有一个大致的了解。除此之外,我们还介绍了勒索软件可能使用的新方法。这些新方法将能够让防御者为潜在的威胁部署适当的检测方案,因为在野外遇到它们只是时间问题。

2 VSS 体系结构

在我们开始之前,读者需要对关于卷影拷贝体系结构中几个关键性概念有所了解。

2.1 Volume Shadow Copy Service(VSS)

该 Service 负责协调执行卷影拷贝相关操作的实体(例如相关的 Writers 和 Providers)之间的所有操作。VSS 是使用 COM(组件对象模型)技术实现的,读者应该对本文的后半部分有个基本的了解。

2.2 VSS Writers

这些组件负责提供通过 VSS Service 备份的稳定数据管道。Windows 列出了各种软件组件的 “内置 VSS Writers”。

2.3 VSS Providers

这些组件创建并维护实际的卷影副本对象。Providers 主要类型有两种:“硬件 Providers” 和 “软件 Providers”

2.4 组件及其之间的关系

VSS 体系结构图说明了组件及其之间的关系,如下图所示:

3 System Providers

System Providers 是 Windows 上的默认提供程序,目前已实现为软件提供程序。 在处理卷影副本删除尝试时,它是最常见的目标。 System Providers 采用写时复制(C-o-W)机制,因此快照仅保存在卷上进行的更改。 这些更改将保存在指定的“差异区域”存储位置,该位置通常位于同一卷上。 但是,它们也可以保存在任何足以容纳它们的 NTFS 卷上。

4 存在的删除方法

有两种删除卷影副本的方法。 第一种是使用命令行实用程序或以编程方式以各种方式(我们将在本文稍后介绍)明确删除卷影副本。

第二种方法采用间接途径,因为它依赖于可以控制“差异区域”大小的事实。 如果现有快照超过新调整大小的差异区域的大小,则提供程序将删除快照以释放空间,如下图中的文档所述。(请注意,可设置的最小大小为 320 MB)。

请注意,使用 VSS 需要管理员特权。

两个可以管理 VSS 的著名命令行实用程序:vssadmin.exe(从 Windows XP 开始与每个全新的 Windows 安装一起提供)和 WMIC.exe(WMI 命令行),可以提供对 VSS 的访问。 Windows 管理规范。 随着时间的流逝,行为者逐渐发展了对这些实用程序的使用,以抵抗防御者的侦查。

第一种也是最常用的方法是使用 delete 命令运行 vssadmin:

vssadmin delete shadows /all /quiet

使用此方法观察到的一些臭名昭著的勒索软件系列是 Ryuk,WannaCry,Dharma,RobinHood,Hermes,Phobos 和 Locky。

在此方法广为人知并加以防御之后,攻击者开始使用 WMIC.exe 通过以下参数删除卷影副本:

wmic shadowcopy delete /nointeractive

这种方法在勒索软件作者中也非常流行,并且被 GandCrab,Robinhood,Phobos,LockBit,Rapid 和 JCry 使用。

另一方面,与前两种方法相比,调整大小是勒索软件家族中一个相对较新的方法,即使在 vssdamin 中也进行了调整,但在野外也不常见:

vssadmin resize shadowstorage /for=<backed volume> /on=<backup location volume> /maxsize=<new size>

一些勒索软件系列使用了这种方法,例如 Nemty,Ryuk,Hermes,Rap][23fdscid 和 MegaCortex(唯一实际使用最小大小的勒索软件),并且我们希望在将来看到更广泛的使用。

这种方法的问题在于,我们不一定知道在 diff 区域中使用了多少空间,这可能会导致这样的情况:尽管调整了大小,但某些快照仍可能无法删除。由于系统提供者使用 C-o-W,因此更改会在发生更改时以及创建快照之前保存到差异区域。为克服此问题,在调整大小操作之后,应在差异区域中填充等于或大于其缩小大小的数据,然后创建新快照以触发删除所有现有快照。

勒索软件作者的最新创新在于,他们倾向于直接从其代码(或脚本)中调用卷影副本的删除。勒索软件偏向于运行 PowerShell 一线式,只需一行简fds-32单的代码即可枚举和删除卷影副本的所有实例。

通过 WMI 的 Win32_ShadowCopy 类和有用的 PowerShell cmdlet 可以方便地实现此目的,以访问 WMI 对象,如以下示例所示:

Get-WmiObject Win32_ShadowCopy | % { $_.Delete() }
Get-WmiObject Win32_ShadowCopy | Remove-WmiObject

Nemty 和 Sodinokibi 使用 Get-WmiObject cmdlet。 Sodinokibi 将 PowerShell 作为子进程运行,该进程具有 base64 编码的命令行参数,该参数解码为:

Get-WmiObject Win32_Shadowcopy | ForEach-Object { $_Delete(); }

在下一节中,我们将介绍尚未发现的 ITW 删除方法。

5 新的删除方法

在本节中,我们讨论了删除卷副本的新方法,这些副本将来可能被勒索软件使用。 第一种方法提供了其他 PowerShell 技巧来触发删除,而第二种方法和第三种方法则利用了 VSS 体系结构的行为和内部工作原理。

5.1 PowerShell Tradecraft

尽管我们还没有遇到任何使用此工具的勒索软件,但可以使用 CIM cmdlet 代替 WMI cmdlet:

Get-CimInstance Win32_ShadowCopy | Remove-CimInstance

在远程计算机上进行基于 CIM 的调用时,它们将通过 WinRM 而不是 DCOM 发送。PowerShell cmdlet 还支持别名。 有些是内置的,例如 gwmi 用于 Get-WmiObject 或 gcim 用于 Get-CimInstance。 可以通过 New-Alias cmdlet 创建新的,而可以使用 Set-Alias cmdlet 修改现有的。

也可以在没有 PowerShell.exe 二进制文件的情况下运行 PowerShell 脚本。 某些 LOLBins 可以执行 Powershell 脚本。 例如SyncAppvPublishingServer.exe。 这些二进制文件的优点是它们可以绕过应用程序黑名单防御。

除了将已知的主机进程用于 PowerShell Core,还可以使用 .NET Framework 在您自己的进程中执行 PowerShell 脚本。 一些工具已经实现了它(UnmanagedPowerShell 和 SharpPick)。

5.2 调用 COM 对象

WMI 可以通过 COM 而不是命令行工具或 PowerShell 通过编程方式使用,并且正如我们前面提到的,VSS 体系结构本身是基于 COM 的,因此可以使用更直接的方法直接操作那些对象。

如果我们看一下 vssadmin 的内幕,我们很快就会注意到它使用带有 IVssCoordinator 接口的 VSSCoordinator COM 类向 VSS 服务发出删除请求。 该对象在名为 vss_ps.dll 的代理 DLL 中实现。

根据这一发现,显而易见的方向是直接使用同一 COM 对象,因此,vssadmin 二进制文件将变得多余。 相关的接口定义显示在 vscoordint.idl 中,该文件在较早的 Windows SDK 版本中提供。 删除功能定义为:

HRESULT DeleteSnapshots(
    VSS_ID SourceObjectId,
    VSS_OBJECT_TYPE eSourceObjectType,
    BOOL bForceDelete,
    LONG* plDeletedSnapshots,
    VSS_ID* pNondeletedSnapshotID
)

SourceObjectId 是卷影副本本身的 GUID 标识符,并且 eSourceObjectType 设置为 VSS_OBJECT_SNAPSHOT。

还记录了 VSS 对象,这些对象提供了管理快照的所有必需功能。 其中之一是 IVssSoftwareSnapshotProvider 接口,该接口还可用于调用所需的删除操作。 可以使用 IVssDifferentialSoftwareSnapshotMgmt 接口来更改差异区域的大小。

5.3 直接设备访问

删除快照时,执行流将到达将 IOCTL 发送到 volsnap.sys 的提供程序(swprv.dll)。 内核驱动程序不对设备打开请求或发送给它的 IOCTL 进行任何访问检查,以验证源是提供程序服务进程,因此可以从任何进程发送那些 IOCTL,甚至处理 COM 层。

使用 ProcMon,我们可以轻松跟踪提供者执行的操作:

  • 打开卷影副本卷的句柄(例如 \Device\HarddiskVolumeShadowCopy1)。
  • 发送未记录的 IOCTL_VOLSNAP_SET_APPLICATION_INFO。
  • 如果尚未将卷设置为使用 IOCTL_VOLUME_SET_GPT_ATTRIBUTES 隐藏。
  • 接下来,通过发送 FSCTL_DISMOUNT_VOLUME和IOCTL_VOLUME_OFFLINE 禁用该卷。
  • 打开后备卷的句柄(即 C :,卷影副本属性中的“原始卷”)。
  • 发送未记录的 IOCTL_VOLSNAP_DELETE_SNAPSHOT(0x53C038),同时在输入缓冲区中传递要删除的快照名称。

可以使用我们前面介绍的工具(vssadmin,WMI 和 COM 对象)来查询卷影副本属性。 步骤 1-4 是可选的,但请记住,它们可确保过程的有效性,跳过它们可能会导致失败或意外结果。

可以使用我们前面介绍的工具(vssadmin,WMI 和 COM 对象)来查询卷影副本属性。 步骤 1-4 是可选的,但请记住,它们可确保过程的有效性,跳过它们可能会导致失败或意外结果。

为了调整差异区域的大小,提供程序将未记录的 IOCTL_VOLSNAP_SET_MAX_DIFF_AREA_SIZE(0x53C028)发送到原始卷,如下图所示:

即使驱动程序会验证请求的来源是提供者的服务,但向其中注入代码以执行上述操作也将绕过该检查。

6 如何检测

我们描述的方法在不同的层上运行,每种方法都提供了多种检测机制的选择。

首先要开始的是命令行参数扫描,这是一个非常基本的解决方案。虽然它涵盖了勒索软件当今使用的大多数技术4fewd[,但防御者必须考虑各种语法风格,并能够处理新的混淆形式和发现新的 LOLBins。此外,存在隐藏命令行参数的已知技术。

对于更广泛的方法,需要某种形式的 COM 监视。

一个直观的解决方案可以是搜索意外进程中加载​​的库的任何异常。例如,如果 vss_ps.dll 由 vssadmin.exe 或 wmiprvse.exe 以外的其他进程加载(使用 WMI 时),则可以将其视为可疑文件。但是,这可能会产生假阳性,因为它不能确保我们实际上正在使用 vss_ps.dll,并且卷影副本正在被删除。监视实际的 COM 对象将授予更准确的结果。可以监视对注册表中相关键的访问,但是对于假阳性也有相同的问题。相反,使用 COM 对象代理和筛选器可能被证明是适当的解决方案。

最终的解决方案是监视执行流程中的最后一步,因为它是所有方法中的通用交点-设备 IO 控件调用驱动程序。这些应该源自提供者服务。可以在每个进4fewd[程的 DeviceIoControl 和 ZwDeviceIoControlFile 之类的函数上安装挂钩,以监视这些调用,但是可以避免攻击者逃避它们的麻烦。消耗 ETW 事件来检测那些 IOCTL 代码是一种更可行的可能性。最后一个选择是使用内核驱动程序并执行 IRP 筛选,它还支持阻止任何潜在的恶意请求的功能。

7 如何解决

FortiEDR 平台能够检测本文档中概述的现有技术和新技术。

8 总结

在本文中,我们介绍了各种擦除卷影副本的方法,从已知的命令行实用程序到各种程序形式。

几乎所有这些方法都以一种或另一种方式操作 COM 对象,即使没有正式记录的方法也是如此。我们展示了一种替代方法,该方法不依赖那些对象,而是在直接访问卷影复制设备时模仿它们的操作。

我们提出了不同的想法来检测和防止所描述方法的任何恶意使用,因为仅依靠命令行参数进行检测被证明是徒劳的。首选方法是监视对卷影拷贝设备本身的访问。

总而言之,这项研究强调了前提,即防御者必须保持警惕,以领先于坏人,并不断采用新的检测方法和功能。而且,为了保持领先地位,进行进攻性研究对防御者而言与对攻击者一样重要。

(本文完)

0 条回应

必须 注册 为本站用户, 登录 后才可以发表评论!