早在2020年8月下旬,就有研究人员发布了DeathStalker的活动报告,包括Janicab、Evilnum和PowerSing活动。同时,在2020年8月,研究人员还首次发布了一份关于VileRAT的私人报告。VileRAT是一种Python植入程序,是专门针对外汇和加密货币交易公司一种高度复杂的攻击活动,其幕后攻击者就是DeathStalker。
自2020年6月首次被发现以来,DeathStalker确实不断利用和更新其VileRAT工具链来对付相同类型的目标。而且DeathStalker最近可能会加大力度使用此工具链来破坏目标。自2022年3月以来,研究人员已经识别出更多与VileRAT相关的恶意文件和新基础设施的示例,这可能是攻击尝试增加的征兆。
VileRAT的初始攻击和工具集介绍
早在2020年夏天,DeathStalker的VileRAT的攻击就包括发送给外汇公司的鱼叉式网络钓鱼电子邮件。如果目标上钩,假冒的角色会在某个时候根据请求提供指向托管在GoogleDrive上的恶意文件的链接(伪装成PDF或ZIP存档的Windows快捷方式文件),作为身份证明文件,然后,恶意链接将触发任意系统命令的执行,以释放无害的诱饵文档,以及我们称为VileLoader的恶意且非常复杂的二进制加载程序。
至少从2021年末开始,攻击技术略有变化,但最初的攻击媒介仍然是恶意消息:通过电子邮件向目标发送Word文档。2022年7月,攻击者利用嵌入在目标公司公共网站中的聊天木马向目标发送恶意DOCX。
恶意DOCX的钓鱼消息
DOCX文档经常使用“合规性”或“投诉”关键字来命名,这表明攻击者正在回答识别请求或表达某个问题作为发送它们的理由。
至少从2021年底开始,最初的攻击和工具集部署如下图所示。
VileRAT攻击和工具集概述
秘密执行VileDropper
最初的DOCX攻击文档本身是无害的,但它包含指向另一个恶意和启用宏的DOTM文档的链接作为“远程模板”。打开DOCX时,Word会自动下载这些DOTM文件,如果收件人启用了执行,则会触发其嵌入的宏。
DOCX中包含的恶意远程模板
恶意DOTM远程模板利用VBAstomping技术来隐藏嵌入式宏的代码。VBAstomping使可编辑的VBA源代码(即宏的可见代码)不同与实际执行的代码。这是可能的,因为可编辑源代码和被称为p-code的经过转换的内部版本都嵌入在启用宏的文档中。由于使用了VBAstomping,将要执行的真正宏代码对标准工具(MicrosoftWord的宏编辑工具以及OLETools)是隐藏的。
这种技术有一个严重的限制:隐藏的宏(即内部p代码)只有在启用宏的文档使用生成它的相同Office版本打开时才能执行。否则,隐藏的宏将无法运行,而将执行可见的宏。在最后一种情况下,DeathStalker确保它会向用户弹出一条消息。但最重要的是,DeathStalker确保将多个攻击文档变体传播给目标,每个变体都针对特定的Office版本进行准备。
恶意DOTM远程模板中的VBAstomping失败
在任何情况下,可见和隐藏的宏都会下载一张图片来取代感染文档中的社会工程消息,并欺骗读者相信某些事情失败了。
执行宏时下载的图像示例
然而,在后台,如果VBAstomping有效,嵌入DOTM的宏会使用WMI静默收集有关安装在目标计算机上的安全产品的信息,将它们发送到命令和控制(C2)服务器,解码并释放文件,然后最终执行我们称为VileDropper的恶意混淆JavaScript(JS)后门。
嵌入DOTM的宏本身已经揭示了一些有趣且具体的技术。它被轻微混淆,因为大多数文本字符串都是XOR编码的,其密码源自一个句子,例如,“OperatesCatholicsmalltownspueblosTwoof”。
DOTM嵌入宏中的XOR解码函数
XOR解码算法看起来非常接近过去在PowerPepper工具链的VBS加载程序脚本中使用的算法,而且看起来合法的函数名也让人想起PowerPepper宏中使用的函数名,例如"insert_table_of_figures","change_highlight_color"等。
PowerPepperVBS加载程序中的XOR解码函数(MD5DB6D1F6AB887383782E4E3D6E4AACDD0)
嵌入DOTM的宏从编码数据中解码并删除两个文件(在“%APPDATA%”文件夹中:“Redist.txt”和“ThirdPartyNotice.txt”,或“pattern.txt”和“changelog.txt”)存储在不可见的TextBox表单中。利用Office对象属性作为隐藏数据源也是之前采用的技术。
用作恶意DOTM文档中数据存储的TextBox表单,如Microsoft的VBA编辑器所示
另一个值得注意的特性是,嵌入DOTM的宏通过向固定的C2URL发送HTTPGET请求来指示执行过程中的进展或错误。有趣的是,VBA宏中的所有HTTP请求都是使用远程图片插入函数触发的。
嵌入DOTM的宏利用“AddPicture”作为Web客户端
在任何情况下,嵌入DOTM的宏最终都会触发VileDropper的执行,使用“WScript”解释器的重命名副本(“%APPDATA%”文件夹中的“msdcat.exe”或“msgmft.exe”),使用如下命令作为:
“changelog.txt”是VileDropper,“91”是VileDropper用来解码异或数据的密码的一部分,“pattern.txt”是一个包含VileLoader的编码包。
VileDropper:一个过度混淆的任务调度器
在DeathStalker错综复杂的VileRAT攻击链中还有一个VileDropper。它是一个混淆的JavaScript文件,主要释放和调度下一阶段的执行:VileLoader。
VileDropper代码的原始形式
第一次运行VileDropper至少需要两个参数,第三个参数可以用作触发特定环境执行变化的标志,具体取决于安装在目标计算机上的安全产品:
第一个是部分密码(用于解码XOR编码的数据),第二个是一个编码的有效负载文件的路径(包含VileLoader及其配套的shellcode)。
VileDropper还会检查它的解释器和文件名,如果它没有按计划调用,则立即停止执行,这可能是为了规避沙箱检测:
VileDropper中的反混淆执行检查
VileDropper的确切执行流程取决于目标计算机上安装的安全产品,但大多数时候,它将自己复制到另一个文件,重新启动自己,并删除其原始副本。在执行VileDropper期间:
1.收集有关目标环境的附加数据(使用WMI)以及生成目标标识符并将它们发送到C2服务器;
2.解码并释放VileLoader及其编码的结果shellcode。文件名和位置会因示例而异,但他们被放在一个看似合法的公共文件夹“%APPDATA%”(例如,“exe”和“dev0Y11ZF.tmp”在“%APPDATA%\Microsoft\PrinterSettings\Printers\”)下。
3.安排一个任务在35到65秒后运行VileLoader,之后每3小时45分钟运行一次。
使用预设的User-Agent(C2的URL和User-Agent的变化取决于VileDropper的示例),VileDropper使用一个HTTPGET请求将数据发送到C2服务器到一个固定的URL(例如,“hxxp://hubflash[.]co/admin/auth.php”)。有用的信息被存储为一个JSON项,然后该文档被xor编码、base64编码、url编码,并被设置为HTTP请求中的cookie值:
JSON 项和内容(JSON 值)如下:
1.u,目标标识符:标识符是目标登录(%USERNAME% 环境变量)和计算机 UUID(在 WMI 查询的第一个结果中获得的类似 UUID 的自定义表示形式:SELECT UUID FROM Win32_ComputerSystemProduct)。然后这个类似 UUID 的值是 base64 编码和 URL 编码的。由于标识符生成逻辑的固定长度和填充,标识符的最终形式总是 48 个字符长。
2.d,一个硬编码的 VileDropper 标识符,它可能指定一个活动或版本(例如,“9745B355”)。
3.a,安装在目标计算机上的安全产品(WMI 中的 AntiVirusProduct)名称列表,以竖线符号 (|) 分隔,然后是 XORed、base64 编码和 URL 编码。
4.n,目标的完全限定登录,作为“%USERDOMAIN%\%USERNAME%”的shell扩展,然后进行异或、base64 编码和 URL 编码。
5.w ,目标的操作系统版本,从 WMI 查询 SELECT Version FROM Win32_OperatingSystem 返回,然后是 base64 编码和 URL 编码。
由VileDropper调度的任务(其名称因样例而异,如“CDS同步”或“UpdateModel任务”)会触发以下类型的执行命令:
命令行中方括号之间的字符(例如[u])指定相应JSON项的内容,即[u]是编码的目标标识符。
在继续讨论VileLoader之前,请注意VileDropper使用XOR编码方案来保护发送到C2服务器的数据,因为类似的方案将在以后使用。该算法生成的数据块布局如下,有时还会进一步进行base64编码和URL编码:
类型一:
生成的blob是自给自足的,并且可以由接收者解码,而无需访问预共享密钥。在VileDropper中,作为JavaScript混淆的一部分编码的字符串受益于额外的异或:嵌入数据blob中的异或密钥还使用特定于脚本的固定密码进行了异或,此固定密码的一部分被传递给VileDropper在攻击链中的前一个DOTM宏执行的命令行上,另一部分在VileDropper中硬编码。
后来,VileLoader和VileRAT使用该算法的其他变体。
类型二:
类型三:
类型四:
VileLoader:一个多阶段植入程序下载器
VileLoader它自2020年第2季度就被公布,首次公开记录为dddp.exe,但此后一直在不断更新和维护,并且在撰写本文时仍然部署在VileDropper上。VileLoader的主要目标是从C2服务器下载并执行额外的有效负载。虽然我们只观察到它触发了VileRAT的执行,但加载程序在技术上可以下载并执行其他植入程序。
最近的VileLoader示例是由一个二进制可执行文件(第1阶段)和一个编码的配套shellcode文件(第2阶段)组成。以前的VileLoader示例通常将shellcode直接嵌入到二进制可执行文件中,并将呈现为单个整体文件。
第1阶段:修改二进制解包器
VileLoader最初是作为二进制可执行文件呈现的,它确保第1阶段执行。这个二进制文件始终是合法的,被攻击者精心修改以集成恶意解包器类型的有效负载。因此,从快速自动静态代码分析的角度来看,二进制文件可能看起来是合法的,它包含合法应用程序的所有代码,但不会按预期工作。这个“解包器”阶段旨在解码、加载和执行内存中的第2阶段。
VileLoader的工作流程从等待17秒开始。然后它解析命令行参数。命令行必须至少包含五个参数,否则VileLoader会终止执行。在实践中,VileDropper通常会向VileLoader提供七个参数,正如我们之前所描述的。VileLoader然后打开其编码的附带的shellcode文件。其名称作为第二个参数传递给VileLoader,例如,“devENX1C6SS.tmp”,使用第二个类型的XOR算法读取并解码它,将去混淆数据映射到一个区域中读取、写入和执行(RWX)权限,并通过启动新线程来运行下一阶段(第2阶段)。
VileLoader的第1阶段包含非常独特的“签名”技术,自我们在2020年第二季度分析的第一个示例以来一直很稳定:
利用“Sleep”和“GetTickCount”Windows API函数来生成随机的等待延迟。这些函数以一种不寻常的方式解析:通过从当前二进制映像的开头引用硬编码偏移量,这些偏移量直接指向合法可执行文件的导入地址表(IAT)中的条目;
VileLoader的编码附带的shellcode文件的解包和加载利用了多个自定义系统调用,这些调用类似于针对不同Windows版本的低级WindowsAPI函数(NTDLL):NtOpenFile、NtReadFile、NtAllocateVirtualMemory、NtCreateThreadEx和NtWaitForSingleObject。
VileLoader的第1阶段自定义系统调用
然而,虽然旧示例通过解析和调用专用WindowsAPI函数(例如“GetCommandLineW”)来解析命令行参数,但最近的示例直接从它们自己的PEB(进程环境块)结构中读取此信息。这样做可能是为了更好地绕过对某些安全解决方案的检测。
第2阶段:内存下载器
第2阶段的内容从VileLoader的编码附带的shellcode文件中提取,并由VileLoader的第1阶段在内存中的新线程中运行。从数据的角度来看,第2阶段的shellcode是一个PE二进制文件,它的标头被去掉并嵌入了额外的编码数据。
第2阶段首先从其本身的内容中解码(使用第三类XOR算法)所需的数据。一些数据被解码为使用djb2算法生成的哈希值。这些哈希值反过来用于通过自定义IAT解析所需的函数导入:加载所需的库,解析它们的导出表,使用djb2对导出的函数名称进行哈希,并将哈希值与从内部数据解码的哈希值进行比较。第2阶段继续创建一个互斥锁,其名称自2020年第二季度以来没变过,与VileRAT中的相同(“Global\wU3aqu1t2y8uN”)。
最后,VileLoader的第2阶段构建一个HTTPGET请求,用于下载植入程序包。在较早的VileLoader示例中,下载器使用了如下所示的一个静态URL:
唯一的规避尝试是在四个固定列表中随机选择一个HTTP User-Agent标头值。VileLoader使用目标系统的正常运行时间作为“随机性”的来源。在最近的示例中,开发人员试图改进这些规避技术,HTTP请求现在看起来如下所示:
现在,所有以红色着色的值都是从从第2阶段内容解码的硬编码列表中随机选择的(使用C类XOR算法)。加密的blob(cookie值)最初是一个JSON字典,使用RC4算法加密(使用密钥“BDDE96D29C68EE064964D1E58A860512B09A50004EF2E4925C76ABFC9023DFC6”,从第2阶段内容解码)、异或(使用B型异或算法)、base64编码和URL编码。实际的JSON内容与VileDropper发送到C2服务器的内容非常相似:
然后,C2服务器在HTTP响应正文中进行了响应,并使用以下其中一个指令:
什么都不做:答案是四个空字节;、
植入包:答案是要解析的编码植入包(见下文);
发送截图:答案是一个值为“1”的字节,后面是三个空字节;
在较早的版本中,VileLoader的第2阶段并没有嵌入截图功能,但是VileRAT实现了截图功能。
如果C2服务器使用植入程序包进行应答,它会发送一个第四类的异或blob。生成的数据使用LZMA1算法进一步解压缩,并包含一个或多个带有以下附加元数据的“文件”:
一个CSIDL值,表示必须将文件释放的根文件夹(使用“SHGetFolderPathW”WindowsAPI函数解析);
子目录名称;
一个文件名;
如果要安排文件执行,则为任务名称;
如果要执行文件,则为命令行参数。
如果在C2服务器响应数据中设置了特定标志,VileLoader会为最后放置的文件创建一个Windows计划任务以设置其持久性。该任务是使用ITaskService接口创建的。最后一个被删除的文件也会使用“CreateProcessW”Windows API函数立即执行。应该注意的是,一些较旧的VileLoader示例在内存中执行下载的有效负载,而最近的变体倾向于将下载的植入物放在目标文件系统上。
如果C2服务器请求屏幕截图,则VileLoader第2阶段发送一个HTTPPOST请求,其中包含一个cookie,其值为第二算法异或的JSON字典,包含以下字段:
相关的HTTPPOST正文数据是一个编码的JPEG
本文翻译自:https://securelist.com/vilerat-deathstalkers-continuous-strike/107075/如若转载,请注明原文地址