Cybereason全球安全运营中心(GSOC)发布了紫队系列威胁分析报告,其中介绍了攻击组织利用微软的Windows安装文件(.msi)入侵并控制目标机器的一系列技战术。
简介:MSI 文件格式概述。
红队:利用 MSI 文件进行攻击的进攻方法。
蓝队:以防御者的角度研究攻击者如何利用MSI文件。
紫队:针对可疑MSI文件的分析工具与检测建议。
伪装成合法安装程序:恶意 MSI 文件有时很难与合法安装程序区分开来。攻击者通常会将恶意软件伪装成众所周知的软件更新,并诱导受害者“更新”其计算机上的软件。
使用更高的权限运行:MSI 以本地系统帐户(NT Authority\System)执行。以 LocalSystem 权限运行的程序可能会导致主机失陷甚至蔓延到整个网络。
利用 MSI 的多种方法:MSI 基于 COM 结构存储,它允许攻击者将恶意文件存储在 MSI 文件中,并使用自定义操作控制存储的文件。这项技术为攻击者提供了多种执行模式选项,他们可以用来感染受害者的主机。
1.1介绍
本章介绍 Windows 安装程序包 (MSI) 的基础知识。
MSI,以前称为Microsoft Installer,是一种Windows安装程序包格式。MSI 允许将必要的 Windows 应用程序或程序包安装和部署到最终用户的计算机。MSI 是一种标准化的安装方法,可简化用户的安装过程。MSI文件的安装过程很简单,通常不需要太多的用户交互。通常,MSI 的安装过程类似于运行可执行文件。
MSI使用Microsoft的技术COM结构化存储,它允许MSI文件具有文件系统结构。此技术也称为 OLE 文档,是 Microsoft Office 经常使用的组件。该技术由两种类型的对象(称为存储和流)构成,它们在概念上类似于目录和文件。此结构允许 MSI 组件存储多个文件以方便访问。
以最少的用户操作存储和部署必要文件的能力使该技术类似于自解压 zip 文件,后者通常采用可执行文件的形式。安装过程还允许使用本地系统帐户(NT Authority\System)执行。提升的权限行为以及 COM 结构使 MSI 成为攻击者的有吸引力的恶意软件部署方法。
MSI 包含称为数据库流的主流。本节概述了数据库流及其相关组件。
数据库流由构成关系数据库的表组成。这些表与主键值和外键值相关联。此结构允许 MSI 维护不同表之间的关系,并包含执行安装所需的基本信息。
数据库流,表示主键/外键关系
每个表中的信息对安装具有重要作用,例如存储有关安装软件应用程序的信息的表。
文件:安装应用程序文件的元数据。
注册表:安装应用程序的注册表项值。
快捷方式:相关安装应用程序的快捷方式。
其他表包括有关安装和执行序列的包执行的信息。这些表对于 MSI 确定执行流以及安装所需的确切操作至关重要。这些表允许开发人员操作安装过程,并允许安装具有复杂的逻辑。安装逻辑通常使用操作和序列进行操作。
MSI 包含一组用于执行安装的子例程。这些例程分为两种类型:
标准操作:这些是允许开发人员执行安装的内置操作。一些值得注意的行动包括以下内容–
初始化安装目录
将文件拖放到安装目录
为安装软件添加注册表值
自定义操作:标准操作可能不足以让开发人员执行安装逻辑。自定义操作允许开发人员通过在安装期间执行特定的二进制文件或脚本来嵌入标准操作之外的逻辑。一些值得注意的自定义操作包括:
执行存储在 MSI 文件中的可执行文件
从 DLL 执行特定的导出函数
执行 JavaScript 或 Visual Basic 脚本
上述操作可以通过利用属性来操作,属性类似于环境变量。属性通常包含执行某些操作所需的各种数据和控制参数,包括:
标识是否需要重新启动的标志
安装目录
系统信息
安装控制信息
属性表存在于数据库流中。但是,请注意,并非所有属性都存储在属性表中。由于某些属性是在安装过程中以特定操作设置的,因此动态设置的属性可能不在属性表中。
对于此报告,重点将放在安装执行序列上,因为此表与实际安装行为最相关。
示例 MSI 数据库表布局及其关系
本节介绍如何重现恶意 MSI 文件的暂存,以便对其进行分析并为其生成检测。与存档文件类似,MSI 文件可能包含各种恶意二进制文件或脚本来执行其恶意操作。
在本节中,MSI 文件将引用具有次要更新的 MSFVenom 模板。但是,本节将更多地关注MSI文件格式的内部工作原理。
恶意 MSI 执行流程
MSI 文件可允许攻击者嵌入恶意二进制文件或脚本,并以提升的权限接管计算机。为了演示这一点,恶意暂存器二进制文件嵌入到 MSI 文件中,该文件稍后从 C2 服务器获取并执行有效负载。
整体流程如下:
执行 MSI 文件。
执行嵌入的二进制文件。
执行暂存器外壳代码。
从 C2 服务器获取并执行有效负载。
终止安装。
这里的主要用法是在内存中执行任何相关的二进制文件,而不会将任何文件放入磁盘。
在本节中,我们将展示如何使用Windows安装程序XML(WiX)工具集创建MSI文件。这是用于从XML文件构建Windows安装程序包的免费软件。
WXS 文件内容,显示暂存器和退出安装自定义操作
可执行文件需要存储在表中,在执行之前,CustomAction 元素可以访问该表。二进制表通常用于放置动画、位图和图标;但是,它还允许 MSI 存储自定义操作所需的相关二进制数据,甚至是恶意 PE 文件和脚本。
Id 为元素分配唯一标识符,开发人员可以调用这些标识符并将其用于特定操作。MyStager ID 被分配给恶意可执行暂存器.exe。此可执行文件将分配和执行暂存器外壳代码。
二进制和自定义操作元素
MyStager 二进制元素后跟一个带有 Id Stager 的 CustomAction 元素。这是决定 MyStager 行为的关键元素。
自定义操作配置中的每个属性如下所述:
二进制键:指定二进制元素 ID 的属性。
模拟:指定安装程序是否模拟安装用户的上下文的属性。如果属性为 no,则安装程序将使用提升的权限 (LocalSystem) 执行。
执行:指定自定义操作计划的属性。参数“延迟”将延迟执行,并允许开发人员控制特定的自定义操作。这是允许执行以提升的权限运行的唯一值。
返回:指定自定义操作的返回行为的属性。asyncNoWait 值允许从安装程序异步执行自定义操作。
ExeCommand:指定可执行文件参数的属性。
自定义操作暂存器设置为使用提升的权限执行存储在二进制表中的恶意可执行文件,即使在安装终止后仍继续执行。
自定义操作退出安装
在 MyStager 安装之后,另一个自定义操作退出安装设置为尝试执行 VBScript。但是,此执行将故意失败并退出,因为此安装将不包含相关的 VBScript。此自定义操作还有另一个目的,将在下一段中解释。
设置自定义操作后,将设置元素 InstallExecuteSequence,即安装执行序列表。对于其第一个操作,ResolveSource 设置源位置和源目录属性。这是初始化安装过程所必需的。初始化完成后,将分别按此顺序为执行设置相关的自定义操作暂存器和退出安装。
退出安装在此执行中起着重要作用,这将强制安装故意失败并退出。然后,这会强制 MSI 退出并出现故障。但是,恶意二进制文件将继续执行,因为它设置为异步运行。受害者可能会忽略此错误,并且可能不会考虑到恶意活动正在后台运行。
本节中的执行假定受害者通过网络钓鱼电子邮件检索 MSI 文件。将文件部署到受害者的计算机上后,受害者只需双击即可执行 MSI 文件。执行提示并显示 UAC 警告,因为执行由高权限用户执行。用户接受 UAC 警告后,执行将继续执行常规安装过程。
微星进程树
MSI 执行后,安装将失败并退出并显示以下消息:
由于自定义操作退出安装引起的错误消息
MSI 自行终止。但是,由于暂存器设置为异步执行,因此恶意二进制文件将继续执行。
MSI执行的攻击树
一旦 MSI 开始执行自身,执行流就会进入自定义操作中的恶意可执行文件,即 msia8a.tmp。
Msia8a.tmp(名称会有所不同)继续从C2服务器检索有效负载并将其部署到受害者的计算机上。成功部署有效负载后,暂存器将继续执行有效负载。成功执行有效负载会导致成功连接到 C2 服务器,并且很明显,有效负载是使用提升的权限帐户执行的。此时,攻击者可以远程控制计算机。
攻击者的终端,这是一个Metasploit监听器
执行流程图
本节重点分析过去滥用 MSI 文件的恶意软件。技术分析深入探讨了在野外看到的三个不同恶意软件家族的MSI文件使用情况。本节以每个示例的 MSI 文件执行的比较图表结束。
本节分析三个不同的恶意软件系列。分析侧重于以下安全哈希算法 (SHA)-256 样本。
恶意软件家族 | SHA-256 |
Magniber Ransomware | 0e65657740d7f06acda53b7d3190f9728801b984d5bd6ccb0b865d218ae71f66 |
MatanBuchus Loader | face46e6593206867da39e47001f134a00385898a36b8142a21ad54954682666 |
Qbot / Qakbot | c0beb47f629a5debe0e99790d16a4d04afe786d6fb42c5ab6dfcaed84d86e7ad |
众所周知,Magniber勒索软件利用感染方法,例如利用漏洞和伪装成合法软件更新来感染受害者的计算机。以下是过去看到的已知感染方法:
利用 PrintNightmare 漏洞。
通过滥用Windows应用程序包(.appx)文件伪装成合法的Google Chrome或Microsoft Edge更新。
通过滥用微星伪装成合法的Windows 10升级。
根据文件元数据,MSI 文件是使用 WiX 工具集构建的。
微星文件元数据
下表中存在自定义操作可以更好地了解潜在的恶意行为:
示例的自定义操作表,从 Orca工具中看到
自定义操作表配置了两个操作:
SetProgramFilesFolder:将程序文件文件夹设置为本地 appdata 文件夹 (C:\Users\UserName\AppData\Local)。
h54pstl1:获取二进制 m21iivix0ds。
SetProgramFilesFolder 具有自定义操作类型 51,这指示操作将配置属性的值。自定义操作集程序文件文件夹配置源程序文件文件夹属性,该属性是程序文件文件夹的占位符。ProgramFilesFolder 设置为目标 LocalAppDataFolder 属性指定的值,该属性是本地 appdata 文件夹(例如 C:\Users\UserName\AppData\Local)。
示例的目录表,从逆戟鲸工具中看到
目录表包含有关安装目录位置的信息。如图所示,ProgramFilesFolder被视为具有Directory_Parent作为TARGETDIR属性,这是根安装目录。根据目录和自定义操作表,安装目录将放置在本地 appdata 目录下。
自定义操作 h54pstl1 具有类型 65,指示类型和相关选项的组合。
类型 1:表示 DLL 文件存储在二进制表中。
可选常量 +64:指示无论自定义操作是否失败,执行都将继续。
根据自定义操作类型,m21iivix0ds 是存储在二进制表中的 DLL 文件,预计执行导出的函数 t5thamku。
示例的二进制表,从逆戟鲸工具中看到
为了确定在安装过程中的哪个点执行自定义操作,必须分析 InstallExecuteSequence 表。
示例的 InstallExecuteSequence 表,从 Orca工具中看到
序列号为 800 到 1000 的操作与安装成本计算相关,安装成本核算是计算要在其中安装或删除相关文件的磁盘空间量的操作。由于安装文件的成本也与安装目录有关,因此需要配置相关目录。因此,“设置程序文件夹(序列号 999)”操作在成本计算流程中,而在“目录”表中配置的目录解析在“成本定稿”操作中配置。
自定义操作 h54pstl1 在安装初始化后立即执行,这是实际安装执行的序列。InstallInitialize 和 InstallFinalize 之间的任何内容都是将更新和更改目标系统的安装活动的一部分。此时,自定义操作 h54pstl1 以提升的权限执行导出的函数 t5thamku。
安装文件是将相关文件放置在目标位置的操作,在本例中,目标位置是由自定义操作集程序文件夹设置的目标。此文件信息通常存储在“媒体”表、“文件”表和“组件”表中。
示例的文件表,来源于Orca
查看媒体表,MSI 包括压缩文件产品.cab。但是,在文件表中,文件 v514749 的文件大小为 0。这表示存在压缩文件,但在安装过程中不会删除任何文件。即使目录是通过自定义操作和目录表配置的,由于不会删除任何文件,因此安装目录变得无关紧要。
Magniber MSI执行片段,从Cybereason平台看到
马格尼伯微星感染流程
MatanBuchus 是由攻击组织 BelialDemon 开发的恶意软件即服务 (MaaS) 平台,并于 2021 年初在俄罗斯网络犯罪论坛上确定。作为第二阶段恶意软件加载程序,MatanBuchus包含下载和执行恶意负载,运行任意PowerShell命令以及进行隐蔽C2服务器通信的功能。
已经观察到恶意软件本身在网络钓鱼电子邮件中作为ZIP文件传播。此文件包含一个 HTML 文件,该文件在访问时会删除另一个 ZIP 文件。第二个ZIP文件包含加载MatanBuchus有效负载并从其C2服务器启动下载的MSI文件。
MatanBuchus有效负载的加载程序通过文件元数据分析确认为使用WiX创建的MSI文件。该文件本身以“Adobe Font Pack 3.0.12.9”为主题,并由“Westeast Tech Consulting, Corp.”签名,试图伪装成合法的Adobe文件。但是,值得注意的是,该证书已失效。
MatanBuchus MSI文件元数据,通过文件Unix实用程序
马坦布丘斯微星文件数字签名信息
与 Magniber 一样,调查文件的自定义操作值可以更好地了解文件的执行方式。下面的自定义操作表包含两个值为 226 的操作,其类型为 34,选项为 192。自定义操作类型 34 使用命令行执行可执行文件,选项 192 允许此执行异步运行。这些值指示即使 MSI 安装程序本身失败,也可以执行文件。无论 MSI 安装程序是失败还是运行,都将发生以下自定义操作:
regsvr32.exe 将安装main_dll。
wscript.exe 将执行notify_vbs。
MatanBuchus MSI文件数字签名信息,从Orca工具中看到
源被定义为 INSTALLLOCATION,通过调查目录来确认它是 LocalAppDataFolder。
目录信息,从 Orca工具中看到
根据下面的文件表,两个文件main.dll和notify.vbs将被放入INSTALLLOCATION目录中。如 CustomAction 表中所示,命令行将执行其中每个文件,这些文件将格式化数据类型 [#main_dll] 和 [#notify_vbs] 替换为实际文件路径。
文件元数据信息,从 Orca工具中看到
[#main_dll] 和 [#notify_vbs] 不会替换为实际文件路径,除非自定义操作是在 CostInitialize、FileCost 和 CostFinalize 之后排序的。在通过自定义操作执行之前,还需要将文件转储到目录。因此,这些操作需要在 InstallInitialize、InstallFiles 和 InstallFinalize 操作之后执行。因此,RunApplicationQQQ 和 RunApplicationNotifyVBS 都在 InstallExecuteSequence 的最后排序。
自定义操作放置在 InstallExecuteSequence,从Orca工具中看到
由 于MSI文件是 COM 结构化存储构造,因此可以通过 OLE 转储文件的数据流,以便进一步调查该文件。虽然初始分析的输出不可读,但可以观察到包含大量数据的几个数据流。
Matanbuchus MSI file OLE streams
调查第四个数据流显示它以 ASCII 字符 (MSCF) 开头,表明此流是内阁存档 (CAB) 文件。
第四个 OLE 流数据
通过转储此流并打开存档,将删除文件(在本例中为 main.dll 和 notify.vbs)。文件notify.vbs是值得注意的,因为它包含与Adobe Acrobat相关的错误消息;这是试图欺骗用户相信合法的Adobe Acrobat文件没有运行。
实际上,一旦运行MSI文件,就会向用户显示此消息,MatanBuchus在后台通过regsvr32.exe执行主.dll文件。
通知的内容.vbs
通知.vbs 显示的假错误消息
MatanBuchus 使用文件 main.dll 加载有效负载、创建 C2 连接并在被利用的系统中建立持久性。
马坦布丘斯攻击树,从赛贝斯平台看到
MatanBuchus MSI infection flow
Qbot (也称为 Qakbot、Quakbot 和 Pinkslipbot)是一种模块化木马,已经流行了十多年。 它最普遍的活动包括网络钓鱼攻击,这些攻击在 Office 文档中附加恶意宏,特别是 Excel 4.0 宏,以逃避检测。
Qbot 的 MSI 变种于 2022 年 4 月下旬功能的时候 开始流传,这恰好发生在微软实施VBA 宏自动阻止,这使得攻击者更难通过支持宏的恶意文档发起成功的攻击。
根据文件元数据,文件由 P.REGO, sro 签名和验证
文件签名
在属性表中,有多个对 VSDNET* 属性的引用,这些属性是 Visual Studio 使用的 .NET 组件。众所周知,MSI 围绕组件 ,这本质上是一个安装应用程序或软件。 该恶意软件被认为有两个组件。
组件表,似乎来自于Orca tool
C__FEAF4022223844D1906F79DF588CDB8A:此组件在 KeyPath 中具有_FEAF4022223844D1906F79DF588CDB8A的值,该值是注册表、ODBCDataSource 或文件表的主键。键路径_FEAF4022223844D1906F79DF588CDB8A似乎是文件 (1.dll) 的主键;这表示恶意软件将在安装过程中删除模块 1.dll。
文件表,似乎来自于Orca tool
C__653B5566E1394F029FA3A18ACFFE5CC8:与C__FEAF4022223844D1906F79DF588CDB8A不同,此组件没有 KeyPath 值。当 KeyPath 值为 NULL 时,默认情况下,Directory_ 值将用作 KeyPath 值,在本例中为 TARGETDIR。此组件用于 CreateFolder,它包含对需要为特定组件显式创建的目录的引用。在安装过程中清空后,将删除在安装过程中创建的所有目录。此组件可确保在安装期间和之后存在 TARGETDIR 中设置的目录。
创建文件夹表,似乎来自于Orca tool
若要了解此 MSI 的行为,必须检查自定义操作。自定义操作表包含四个操作:但是,该恶意软件的主要操作是_9BED75AC_30E3_4BB1_9F26_1A4F247F32EF和DIRCA_TARGETDIR。
_9BED75AC_30E3_4BB1_9F26_1A4F247F32EF:获取并执行二进制_C212458FE5F810E2D8287472A14C2665
DIRCA_TARGETDIR:将目标目录 (TARGETDIR) 设置为本地 appdata 目录 (LocalAppDataFolder\ProductName)
自定义操作表
第一个操作 (_9BED75AC_30E3_4BB1_9F26_1A4F247F32EF) 是指源 (_C212458FE5F810E2D8287472A14C2665),该源位于二进制表下。
二进制表,似乎来自于Orca tool
自定义操作_9BED75AC_30E3_4BB1_9F26_1A4F247F32EF具有类型 3590,指示类型和相关选项的组合。
Type 6::表示存储在二进制表中的 VBScript。
Optional Term +3584::指示成功完成 InstallFinalize 操作后的计划执行。
随着对自定义操作_C212458FE5F810E2D8287472A14C2665的进一步调查,VBScript 似乎通过 regsvr1.exe 从组件C__FEAF4022223844D1906F79DF588CDB8A执行丢弃的模块 (32.dll)。
VBScript _C212458FE5F810E2D8287472A14C2665
第二个自定义操作DIRCA_TARGETDIR在本地 AppData 目录 (LocalAppDataFolder) 的指定子目录 (产品名称) 中配置安装目录。在本例中,产品名称已命名为属性表中指定的 (SetupTest)。因此,DIRCA_TARGETDIR操作会将安装目录配置为 (C:\Users\<UserName>\AppData\Local\SetupTest)。
已安装文件的输出文件夹路径
通过检查 MSI,很明显恶意软件将模块 (1.dll) 放到本地 appdata 目录的子目录 (SetupTest) 上,该目录通过调用嵌入在二进制表中的 VBScript 来执行它。
QBot攻击树,从Cybereason平台看到
Qbot MSI感染流程
下图标识了本章介绍的每个恶意软件的 MSI 行为中的关键点。
使用中的技术 | Magniber Ransomware | MatanBuchus Loader | Qbot |
将安装目录设置为本地应用数据文件夹 | ✔️ | ✔️ | ✔️ |
将文件转储到安装目录 | ✔️ | ✔️ | |
自定义操作:通过指定的命令行执行可执行文件 | ✔️ | ||
自定义操作:执行存储在二进制表中的 PE/脚本 | ✔️ | ✔️ | |
在安装目录中执行转储的文件 | ✔️ | ✔️ | |
假错误消息 | ✔️ | ||
无论 MSI 故障如何,都能持续恶意执行。 | ✔️ | ✔️ |
比较图
本章重点介绍可能识别恶意 MSI 的关键点,以及可以帮助防御者分析 MSI 文件的工具,该工具已在蓝队部分中使用。
有三个恶意指示器可以识别可疑的 MSI 文件:
文件详细信息与数字签名不匹配
误导性错误
可疑的安装路径
检查站
MSI文件经常伪装成知名应用程序的合法安装软件。但是,MSI 文件的数字签名与发布作者不匹配,如下图所示。MSI 文件的描述或来源与数字签名之间的不匹配可能表明该文件实际上是恶意的,尤其是当它声称来自知名软件供应商时。
Magniber 勒索软件
文件信息与数字签名不匹配
MatanBuchus loader
文件信息与数字签名不匹配
众所周知,许多不同类型的恶意软件会以各种方式欺骗受害者。对于利用 MSI 的恶意软件,它被视为通过嵌入脚本或使安装崩溃来输出错误的错误消息。该错误消息旨在诱使受害者认为软件安装不成功,因为安装程序或其环境配置不正确。错误输出可能表示恶意活动。
可能的错误消息
通常,MSI 的目的是安装软件并将相关应用程序拖放到磁盘上。但是,当安装的根目标目录设置为本地 AppData 文件夹时,这可能表示恶意行为。合法安装通常会在 C:\Program Files 或 C:\Program Files (x86) 下删除必要的文件。
安装目录配置
在上图中,恶意软件将“安装”文件放入本地 AppData 文件夹 (LocalAppDataFolder) 的子文件夹 (ProductName) 中。
防御者可以使用一些工具来分析 MSI 文件。本节介绍一些工具并演示它们的用法。
Msitools 是一组工具,允许开发人员创建和检查 MSI 文件。但是,防御者也可以使用这些工具来分析恶意 MSI 文件。防御者可以使用三种主要的 Msitools:msiinfo、msidump 和 msidiff。这些工具基于命令行,这使得它们更容易自动化并包含在恶意软件分析管道中。
Msiinfo 是一个命令行工具,允许用户列出和提取存储在 MSI 文件中的流或表。例如,分析师通过执行流命令行选项来调查相关的 MSI 文件 15f4cfd.msi (Qbot),并识别存储在二进制表中的二进制文件。为了调查Binary._C212458FE5F810E2D8287472A14C2665,分析人员可以使用提取命令行选项转储此二进制流。
使用 msiinfo 输出流
Msidump 也是另一个命令行工具,可将相关表转储为 idt 文本和存储在 MSI 文件中的流。调查方法和使用与msiinfo相似。
使用 msidump 的输出流
Msidiff 是一个命令行工具,它通过比较每个示例来比较两个 MSI 文件。例如,分析师可以使用 msidiff 比较两个不同的安装程序的有效性。若要验证两个安装程序是否正在安装和转储相同的文件,分析人员可以使用命令行选项 -l 列出并比较可能转储的文件。
来自 msidiff 的文件列表,来自 QBot 示例
Oledump.py 是由Didier Stevens创建的python脚本,主要用于分析OLE文档。由于 OLE 文档是 COM 结构化存储,因此此 Python 脚本也允许防御者分析 MSI 文件。
Oledump.py 显示来自 15f4cfd 的流.msi
每行由以下三列组成:
流编号
流大小
流名称
在大多数情况下,当使用带有 oledump.py 的 MSI 文件时,流名称通常难以理解,如上图所示。
Oledump.py 显示流 4 详细信息
通过使用“-s”选项指定流编号,oledump.py 转储流的内容。在上图中,流 4 具有文件标头 MSCF,它是 CAB 文件的标头。
ORCA是一个基于GUI的Windows SDK组件,允许用户编辑和查看MSI数据库表。分析师可以打开有问题的 MSI 文件并导航到每个表进行调查。GUI 使调查过程更简单,因为它在视觉上更容易遵循。
ORCA显示自定义操作表
建议采取以下措施来检测和响应恶意MSI攻击:
在SIEM平台中,启用签名和机器学习模式,并启用这些功能的检测和预防模式。
谨慎处理来自外部来源(电子邮件、Web 浏览)的文件。