Ramsay:针对气隙网络量身定制的网络间谍工具包
一个以前未曾报道过的网络间谍框架,我们将其命名为Ramsay,他是专门用于收集和泄露敏感文档,并且能够在对气隙网络中运行。
我们最初在VirusTotal中找到了Ramsay的实例。该样本是从日本上传的,并导致我们发现了该框架的更多组件和版本,同时还有大量证据表明,该框架正处于发展阶段,其交付载体仍在微调中。
当前目标的可见性较低;基于ESET的遥测技术,迄今为止,几乎没有发现受害者。我们认为,受害者的这种稀缺性进一步证明了该框架正在不断发展的假说,尽管受害者的可见性较低,这也可能是由于目标系统在气隙网络中的性质所致。
在Retro后门旁边发现了共享的工件。该恶意软件与Darkhotel有关,这是一个臭名昭著的APT组织,该组织至少自2004年以来就进行了网络间谍活动,过去曾以中国和日本的政府机构为目标。
攻击载体
随着Ramsay不同实例的发现,我们还发现它们被一系列攻击媒介利用。它们是:
恶意文件删除Ramsay version 1
此攻击媒介包括利用CVE-2017-0199的恶意文档,目的是删除较旧版本的Ramsay。
本文档提供了一个初始的Visual Basic脚本,在下面的屏幕截图中显示为OfficeTemporary.sct,它将在文档正文中提取Ramsay代理,并通过在JPG标头下使用base64编码的PE来伪装成JPG图像。
表1. oletools看到的Ramsay版本1 RTF文件中包含的OLE对象布局
我们注意到,这些文档删除的特定Ramsay实例在实现上具有较低的复杂性,并且缺少后来Ramsay版本所利用的许多更高级的功能。
发现这些相同恶意文档的多个实例已上载到开源沙盒引擎,并标记为测试工件,例如“ access_test.docx ”或“ Test.docx ”,表示正在对此特定攻击媒介进行试验。
基于所提供的Ramsay代理的低复杂性,威胁参与者可能将此特定实例嵌入到这些恶意文档中以进行评估。
Decoy安装程序删除Ramsay version 2.a
我们发现一个实例伪装成7zip安装程序上传到Ramsay的VirusTotal。
我们之所以将该恶意软件命名为Ramsay,是因为该二进制文件中包含一些字符串,例如:
此版本的Ramsay展示了其规避和持久策略的明显改进,并引入了诸如Spreader组件和rootkit之类的新功能。
恶意文件删除Ramsay version 2.b
此攻击媒介包括传递另一个滥用CVE2017-11882的恶意文档。该文档将删除名为lmsch.exe的Ramsay安装程序,如表2所示。
表2. oletools看到的Ramsay版本2.b RTF文件中包含的OLE对象布局
本文档使用的Ramsay版本是Ramsay版本2.a的略微修改版本,其主要区别在于未利用扩展器组件。其余组件的功能与Ramsay版本2.a相同。
客户端执行受感染文件
如前所述,Ramsay版本2.a提供了一个Spreader组件,该组件将充当文件感染者,从而更改可移动和网络共享驱动器中保存的良性PE可执行文件的结构,以便嵌入在主机文件执行时触发的恶意Ramsay工件。
Spreader的传播机制具有极强的攻击性,驻留在目标驱动器中的任何PE可执行文件都将受到感染。
根据发现的Ramsay各个版本的组件之间的编译时间戳,我们可以估计此框架的以下开发时间表:
对不同组件发现的不同编译时间戳的分析表明,该框架自2019年底以来一直在开发中,目前有可能根据不同目标的配置量身定制两个维护版本。
持久性机制
基于其版本,Ramsay实现了各种具有不同复杂性的持久性机制。其中一些持久性机制如下:
- AppInit DLL注册表项
Windows操作系统提供的功能允许通过AppInit DLL注册表项将自定义DLL加载到几乎所有应用程序进程的地址空间中。这种技术并不是特别复杂;它在Ramsay的早期版本中实现,并在其他恶意软件系列中也很常见。
- 通过COM API调度任务
计划任务使管理员能够在指定时间而不是每次启动系统或用户登录时运行任务或“作业”。可以通过Windows COM API来实现此功能,这是Ramsay的第一个版本定制的。基于与Carberp实施的高度相似性,Ramsay的实施很可能改编自Carberp的公开源代码。
- Phantom DLL Hijacking
Ramsay的更成熟版本表示其持久性技术的复杂性不断提高,其中包括有时称为“ Phantom DLL Hijacking”的一种技术。
Phantom DLL Hijacking滥用了这样一个事实,即许多Windows应用程序使用的过时的依赖项,而这些依赖项对于应用程序本身的功能不是严格必需的,从而允许利用这些依赖项的恶意版本。
为了实施该技术,将以两个服务为目标。它们是:
- WSearch(Windows搜索)劫持msfte.dll:
- 劫持oracle依赖项的MSDTC(Microsoft分布式事务处理协调器)服务在下面显示为oci.dll:
这种持久性技术具有很高的通用性,它使以DLL形式提供的Ramsay代理能够将其逻辑分为多个单独的部分,从而实现了将要加载代理的主题进程量身定制的不同功能。此外,由于将这些DLL加载到它们各自的进程/服务中并不一定会触发警报,因此使用此技术会使检测更加困难。
功能
Ramsay的体系结构通过日志记录机制提供了一系列功能,旨在通过提供可执行的情报来执行渗透,控制和横向移动操作,并提供每个受感染系统的整体行为和系统统计信息,从而协助操作员。由于具有以下功能,因此可以实现这些操作:
该框架的主要目标是收集目标文件系统中的所有现有Microsoft Word文档。整个收集阶段如图6所示:
Word文档将首先被收集并存储在初步收集目录中。该目录的位置可能因Ramsay版本而异。我们观察到的用于此目的的两个目录是%APPDATA%\ Microsoft \ UserSetting
和%APPDATA%\ Microsoft \ UserSetting \ MediaCache
。
根据Ramsay版本的不同,文件收集将不仅限于本地系统驱动器,还会搜索其他驱动器,例如网络驱动器或可移动驱动器:
使用RC4流密码算法对收集的文档进行加密。
用于加密每个文件的RC4密钥将是随机生成的16字节序列的计算得出的MD5哈希值,并在恶意软件样本中加上16字节的硬编码。将保存加密文件的缓冲区的前16个字节将对应于实际使用的RC4密钥:
初步收集目录下的收集文件将使用Ramsay Installer删除的WinRAR实例进行压缩。该压缩档案将保存在初步收集目录中,然后生成Ramsay容器工件:
如前面的屏幕截图所示,这些Ramsay容器在文件的开头包含一个值,以及一个表示受害者机器标识符的硬件配置文件GUID。附加的基于XOR的加密层将应用于生成的压缩档案。下图显示了这些工件的结构:
Ramsay通过使用应用于两个Windows API函数(WriteFile和CloseHandle)的内联挂钩,实现了在受害者的文件系统中存储这些工件的分散方式。
挂钩的WriteFile过程的主要目的是保存要写入的主题文件的文件句柄,并在CloseHandle API函数中编写和安装另一个挂钩。然后,CloseHandle挂钩过程将检查主题文件名是否具有.doc扩展名;如果是这种情况,它将在主题文档的末尾附加Ramsay容器工件,后跟一个1024字节的流,表示Microsoft Word文档页脚。
这样做是为了规避措施,目的是提供一种方法,以隐藏在主题文件内的伪像,使其不被肉眼看到:
将对附加在Word文档上的Ramsay容器进行标记,以避免多余的工件被附加到已经受影响的文档中,并且将清除初步存储目录,以便定期生成一个全新的Ramsay工件。
即使受影响的文档将被修改,也不会影响其完整性;进行工件附加后,每个受影响的Word文档将保持完全正常运行。
这些工件的扩散是通过我们无法检索的外部组件完成的。但是,基于Ramsay实现的用于存储收集的文物的分散方法,我们认为该组件将扫描受害人的文件系统,以搜索Ramsay容器的魔术值,从而确定要渗出的工件的位置。
与大多数传统恶意软件不同,Ramsay没有基于网络的C&C通信协议,也没有为通信目的而尝试连接到远程主机。Ramsay的控制协议遵循为收集的工件存储实现的相同分散原理。
Ramsay将扫描所有网络共享和可移动驱动器(不包括通常为软盘保留的A:和B:驱动器)以查找潜在的控制文件。首先,Ramsay寻找Word文档,并在较新的版本中寻找PDF和ZIP存档:
解析这些文件是否存在特定于控制文件格式的魔术标记。更具体地说,Ramsay寻找两个给定的已编码硬件配置文件GUID中的任何一个。这些GUID中的一个进行了硬编码,如图14所示,而另一个则是根据受害者的计算机动态生成的。如果找到任何主题标识符,将尝试解析命令签名。
对这两个GUID实例的搜索表明,可以故意将Ramsay的控制文档设计为“与受害者无关”,能够通过利用控制文档中的“全局” GUID在多个受害者中部署相同的控制文档实例。另一方面,可以通过嵌入专门在单个受害者机器上传递的特定GUID来制作控制文档。Ramsay控制协议实现的指标表明其后端对应项可能在某种程度上是自动化的。
Ramsay控制协议支持三种不同的命令:
检索到给定的命令签名后,将在控制文档的正文中提取要执行的包含工件,然后将其还原,从而在执行命令后将主题控制文档修改为其原始形式。
在最新版本的Ramsay删除的不同文件中,我们找到了Spreader组件。该可执行文件将尝试扫描网络共享和可移动驱动器,但A:和B:驱动器除外:
需要注意的是,Ramsay用于传播和控制文档检索的目标驱动器之间存在相关性。它评估了Ramsay的传播能力和控制能力之间的关系,展示了Ramsay的运营商如何利用横向移动的框架,表明该框架被设计为在气隙网络内运行的可能性。
传播技术主要由文件感染组成,非常类似于prepender文件感染程序,以便针对上述目标驱动器中的每个可访问PE文件生成结构类似于Ramsay的Decoy安装程序的可执行文件。下图说明了感染后应用于目标可执行文件的更改以及这些组件在执行时如何交互:
感染阶段涉及的所有不同工件都在传播器的范围内,或者先前已由其他Ramsay组件丢弃。将为以下令牌解析一些工件:
给定文件被感染后,将通过在文件末尾写入特定令牌来对其进行标记,以便为扩展程序提供标识符以防止重复感染。
此外,Ramsay的某些组件已实现了网络扫描程序,旨在发现受感染主机子网中易受EternalBlue SMBv1漏洞影响的计算机。该信息将包含在Ramsay收集的所有记录信息中,操作员可以利用这些信息,以便在稍后阶段通过不同的通道在网络上进行进一步的横向移动。
进一步说明
Ramsay的2.a Spreader组件版本已重用了Darkhotel的Retro Backdoor中以前看到的一系列标记。这些标记如下:
Ramsay使用GetCurrentHwProfile API 序列化受害者,然后为特定受害者的计算机检索GUID。还可以在Retro中看到这一点。它们都使用相同的默认GUID,以防API调用失败:
Ramsay和Retro都共享相同的编码算法来对检索到的GUID进行编码。
GetCurrentHwProfile检索的GUID 特定于系统硬件,而不特定于用户或PC实例。因此,仅通过利用此GUID,操作员可能会遇到旨在序列化不同受害者的重复项。
此方案的目的是通过使用计算机的以太网适配器地址“salting” GUID来生成不太可能重复的GUID。这意味着Retro和Ramsay共享相同的方案来生成唯一标识符。
我们还发现Ramsay和Retro在保留一些日志文件的方式上有相似之处,共享相似的文件名约定:
重要的是要强调,在Retro记录的技术中,它利用了msfte.dll,oci.dll和lame_enc.dll的恶意实例,并通过Phantom DLL Hijacking。如前所述,Ramsay在其某些版本中还使用了msfte.dll和oci.dll来使用此技术。
此外,我们还观察到Ramsay和Retro在其工具集中使用的开源工具方面的相似之处,例如利用UACMe进行权限提升,利用ImprovedReflectiveDLInjection部署它们的一些组件。
最后,我们注意到Ramsay利用恶意文档中的韩语元数据,表示使用了基于韩语的模板。
结论
根据所发现的框架的不同实例,Ramsay经历了不同的发展阶段,这表明其能力的数量和复杂性都在不断提高。
负责攻击载体的开发人员似乎正在尝试各种方法,,比如从2017年开始利用旧的Word漏洞进行攻击,以及部署特洛伊木马应用程序。
我们认为这是因为开发人员事先了解了受害人的环境,并且正在定制攻击载体,可以成功地侵入目标系统而无需浪费不必要资源。
Ramsay框架的某些阶段仍在评估中,这可以解释当前受害者的可见性低下的原因,同时要记住Ramsay的预期目标可能处于气隙网络中,这也会影响受害者的可见性。
