以中东政府实体为目标的DuneQuixote攻击活动分析

2024年 4月 23日 70.7k 0

关键点

Avast 发现了一项通过捏造工作机会针对特定个人的新活动。

“FudModule 2.0”Avast 发现了从感染媒介到利用0day漏洞部署 rootkit 的完整攻击链Admin -> Kernel。

Avast 发现了一种以前未记录的KaolinRAT,除了标准 RAT 功能之外,它还可以更改所选文件的最后写入时间戳并加载从 C&C 服务器接收到的任何 DLL 二进制文件。我们还认为它正在加载 FudModule 以及 0-day 漏洞。

介绍

2023 年夏天,Avast 通过捏造工作机会,确定了一项针对亚洲地区特定个人的活动。攻击背后的动机尚不清楚,但从攻击频率较低来看,攻击者似乎对有技术背景的个人特别感兴趣。这种复杂性从之前的研究中可以明显看出,Lazarus 组织利用易受攻击的驱动程序并执行了多种 Rootkit 技术来有效地蒙蔽安全产品并实现更好的持久性。

在本例中,Lazarus 试图通过利用默认 Windows 驱动程序 appid.sys 中的漏洞(CVE-2024-21338)来蒙蔽安全产品。有关此漏洞的更多信息可以在相应的博客文章中找到。

这表明拉撒路可能分配了额外的资源来开发此类攻击。在利用之前,Lazarus 精心部署了工具集,使用无文件恶意软件并将武器库加密到硬盘驱动器上,如本博客文章后面所述。

此外,攻击的性质表明受害者是经过精心挑选和高度针对性的,因为在执行初始二进制文件之前可能需要与受害者建立一定程度的融洽关系。将如此复杂的工具集与漏洞利用一起部署表明了相当多的足智多谋。

这篇博文将对整个攻击链中的每个模块进行技术分析。此分析旨在建立 Lazarus 小组使用的工具集库与之前发表的研究之间的联系。

初始访问

攻击者通过向毫无戒心的个人提供捏造的工作机会来发起攻击,利用社会工程技术建立联系并建立融洽关系。虽然具体的通信平台仍然未知,但  Mandiant和ESET之前的研究表明,潜在的传递媒介可能包括 LinkedIn、WhatsApp、电子邮件或其他平台。随后,攻击者尝试发送伪装成 VNC 工具的恶意 ISO 文件,这是采访过程的一部分。 ISO 文件的选择开始对攻击者非常有吸引力,因为从 Windows 10 开始,只需双击即可自动安装 ISO 文件,并且操作系统将使 ISO 内容轻松访问。这也可能作为潜在的网络标记 (MotW) 旁路。

由于攻击者与受害者建立了良好的关系,受害者被攻击者诱骗挂载ISO文件,该文件包含三个文件:AmazonVNC.exe、version.dll 和aws.cfg.这导致受害者执行AmazonVNC.exe。  

该AmazonVNC.exe可执行文件仅伪装成 Amazon VNC 客户端,而是choice.exe通常驻留在该System32文件夹中的合法 Windows 应用程序。该可执行文件用于旁加载,version.dll通过合法choice.exe应用程序加载恶意软件。旁加载是攻击者用来逃避检测的一种流行技术,因为恶意 DLL 是在合法应用程序的上下文中执行的。  

当AmazonVNC.exe执行时,它会加载version.dll.此恶意 DLL 使用本机 Windows API 函数,试图避免用户模式 ​​API 挂钩等防御技术。所有本机 API 函数均由直接系统调用调用。恶意功能是在导出函数之一中实现的,而不是在 DLL Main 中实现的。其中没有任何代码,DLLMain只是返回 1,而在其他导出函数中,只是 Sleep 功能。

在 DLL 获得当前 Windows 版本的正确系统调用号后,它就准备好生成一个iexpress.exe进程来托管驻留在第三个文件aws.cfg.仅当受害者计算机上安装了卡巴斯基防病毒软件时才会执行注入,这似乎是为了逃避卡巴斯基检测。如果未安装卡巴斯基,恶意软件将通过在当前进程中创建线程来执行有效负载,而不进行注入。该aws.cfg文件是下一阶段的有效负载,已被 VMProtect 混淆,可能是为了使逆向工程变得更加困难。有效负载能够从命令与控制(C&C)服务器下载 shellcode,我们认为这是一个销售大理石建筑材料的合法被黑网站。官方网站是https://www[.]henraux.com/,攻击者能够从以下位置下载 shellcodehttps://www[.]henraux.com/sitemaps/about/about.asp

在详细说明我们的发现时,我们面临着从 C&C 服务器提取 shellcode 的挑战,因为恶意 URL 没有响应。  

通过分析我们的遥测数据,我们发现了一个客户的潜在威胁,这表明通过 ISO 文件从 C&C 服务器加载 shellcode 与随后出现的 之间存在显着相关性RollFling,这是我们发现的一种新的未记录加载程序,并将稍后将在这篇博文中深入研究。

此外,ISO 文件的传递方法与 Lazarus 组织所采用的方法在战术上有相似之处,Mandiant和ESET的研究人员之前已经注意到这一事实。

此外,RollSling 在受害计算机上还发现了一个样本,显示代码与Microsoft 研究RollSling 中讨论的样本相似。值得注意的是,在我们的客户端环境中发现的实例是由加载程序交付的,这证实了我们对缺失的 shellcode 与初始加载程序之间存在联系的信念。如需视觉确认,请参阅显示Microsoft报告代码SHA 的第一个屏幕截图,而第二个屏幕截图是从我们的示例派生的代码。 RollSling RollFling RollFlingRollSlingRollSling

该图展示了RollSling Microsoft 识别的代码。SHA:d9add2bfdfebfa235575687de356f0cefb3e4c55964c4cb8bfdcdc58294eeaca。

图像展示了RollSling 在我们的目标中发现的代码。SHA:68ff1087c45a1711c3037dad427733ccb1211634d070b03cb3a3c7e836d210f。

在接下来的段落中,我们将解释执行链中的每个组件,从初始RollFling加载器开始,继续随后加载的RollSling加载器,然后是最终RollMid加载器。最后我们来分析一下KaolinRAT,它最终是由这三个加载器的链来加载的。

Loaders

RollFling

该RollFling加载程序是一个作为服务建立的恶意DLL,表明攻击者最初尝试通过注册为服务来实现持久性。伴随该RollFling加载程序的是对于攻击链的一致执行至关重要的基本文件。它的主要作用是启动执行链,其中所有后续阶段都专门在内存中运行。不幸的是,我们无法确定 DLL 文件是作为具有管理员权限的服务安装的,还是仅具有标准用户权限的。

加载程序利用Windows API函数获取系统管理BIOS(SMBIOS)表GetSystemFirmwareTable。从 Windows 10 版本 1803 开始​​,任何用户模式应用程序都可以访问 SMBIOS 信息。 SMBIOS 是通过系统固件传递管理信息的主要标准。

通过调用GetSystemFirmwareTable(参见图 1.)函数,SMBIOSTableData检索 ,并将其用作使用 XOR 运算SMBIOSTableData解密加密加载程序的密钥。RollSling如果没有正确的SMBIOSTableData32 字节长密钥,RollSling解密过程将无效,因此恶意软件的执行将无法进入下一阶段。这表明针对特定个人的高度针对性的攻击。

这表明,在攻击者通过将RollFling加载程序注册为服务来建立持久性之前,他们必须收集有关该SMBIOS表的信息并将其传输到 C&C 服务器。随后,C&C 服务器可以用另一个阶段进行回复。这个附加阶段称为  RollSling,存储在RollFling与".nls"扩展名相同的文件夹中。  

成功XOR解密后RollSling,  RollFling现在可以将解密后的内容加载RollSling到内存中并继续执行RollSling。

图1:获取SMBIOS固件表提供程序

RollSling

RollSling由 启动的加载程序在RollFling内存中执行。此选择可能有助于攻击者逃避安全软件的检测。的主要功能RollSling是定位位于同一文件夹RollSling(或 Package Cache 文件夹)中的二进制 blob。如果二进制 blob 不位于与 相同的文件夹中RollSling,则加载程序将在 Package Cache 文件夹中查找。该二进制 blob 包含恶意功能所必需的各个阶段和配置数据。该二进制 blob 必须已通过感染链中的某个先前阶段上传到受害计算机。  

保存多个文件和配置值的二进制 blob 背后的原因是双重的。首先,将所有信息保存在单个文件中会更有效,其次,大多数二进制 blob 都可以加密,这可能会增加另一层规避意义,从而降低检测的机会。  

Rollsling正在扫描当前文件夹,在其中查找特定的二进制 blob。为了确定当前文件夹中的哪个二进制 blob 是正确的,它首先读取 4 个字节以确定要读取的数据的大小。读取数据后,二进制 blob 中的字节将被反转并保存在临时变量中,然后,它会经历多个条件检查,例如 MZ 标头检查。如果完成了 MZ 标头检查,随后它会“StartAction”从提取的二进制文件中查找导出函数。如果满足所有条件,则会将下一阶段加载RollMid到内存中。在这种情况下,攻击者没有使用二进制 blob 的任何特定文件名或任何特定扩展名,以便能够轻松地在文件夹中找到二进制 blob。相反,他们通过二进制 blob 必须满足的几个条件确定了正确的二进制 blob。这也是攻击者的防御规避技术之一,使防御者更难在受感染的机器中找到二进制 blob。

该阶段代表执行链中的下一个阶段,即第三个加载器,RollMid它也在计算机内存中执行。

在执行RollMid加载程序之前,恶意软件会创建两个文件夹,命名方式如下:

%driveLetter%:\ProgramData\Package Cache\[0-9A-Z]{8}-DF09-AA86-YI78-[0-9A-Z]{12}\ 
%driveLetter%:\ProgramData\Package Cache\ [0-9A-Z]{8}-09C7-886E-II7F-[0-9A-Z]{12}\ 

这些文件夹用作移动二进制 blob 的目标,现在使用新生成的名称和".cab"扩展名进行重命名。RollSlingloader 会将二进制 blob 存储在第一个创建的文件夹中,并在第二个创建的文件夹中存储一个新的临时文件,其用法将在后面提到。  

攻击者利用该"Package Cache"文件夹(软件安装文件的公共存储库)更好地将其恶意文件隐藏在充满合法文件的文件夹中。在这种方法中,攻击者还利用".cab"扩展名,这是文件夹中文件的常用扩展名Package Cache。通过使用这种方法,攻击者试图通过将重要文件重新定位到受信任的文件夹来有效地避免检测。

最后,RollSling加载器调用一个名为 的导出函数"StartAction"。使用特定参数调用此函数,包括有关RollFling加载程序的实际路径、二进制 blob 所在的路径以及RollMid加载程序要创建的临时文件的路径的信息。

RollFling图 2:在与加载程序相同的文件夹中查找二进制 blob

RollMid

加载程序的职责RollMid在于从二进制 blob 加载攻击的关键组件和配置数据,同时建立与 C&C 服务器的通信。

包含基本组件和配置数据的二进制 blob 是攻击链正确执行的关键元素。不幸的是,我们获取这个二进制 blob 的尝试没有成功,导致我们对攻击的全面理解存在差距。但是,我们能够检索RollMid加载程序和存储在内存中的某些二进制文件。

在二进制 blob 中,RollMid加载器是位于开头的基本组件(参见图 3)。二进制 blob 中的前 4 个字节描述了加载程序的大小RollMid。在加载器之后的二进制 blob 中还存储了两个二进制文件RollMid以及配置数据,这些数据位于二进制 blob 的最末尾。这两个其他二进制文件和配置数据还受到压缩和 AES 加密,为存储的信息增加了安全层。  

如图所示,初始黄色框中包含的前四个字节描述了RollMid 加载器的大小。此特定信息对于解析也很重要,可以转换到二进制 blob 中的后续部分。

位于RollMid加载程序之后,有两个 4 字节值,以黄色和绿色区分。前者对应FIRST_ENCRYPTED_DLL截面的大小,后者(绿色框)表示SECOND_ENCRYPTED_DLL截面的大小。值得注意的是,绿框中的第二个 4 字节值具有双重用途,不仅描述大小,同时还构成用于解密该FIRST_ENCRYPTED_DLL部分的 16 字节 AES 密钥的一部分。由于提供了有关嵌入在二进制 blob 中的每个加密 DLL 大小的信息,我们现在可以访问位于二进制 blob 末尾的配置数据部分。

图 3:二进制 blob 的结构

加载RollMid程序需要FIRST_DLL_BINARY 与 C&C 服务器进行正确通信。然而,在加载之前FIRST_DLL_BINARY,RollMid加载器必须首先解密该FIRST_ENCRYPTED_DLL部分。

解密过程应用 AES 算法,首先解析解密密钥以及用于 AES 解密的初始化向量。随后,应用解压缩算法来进一步提取解密的内容。接下来,解密的数据FIRST_DLL_BINARY被加载到内存中,并DllMain调用该函数来初始化网络库。

不幸的是,由于我们无法获得二进制 blob,因此我们没有机会对FIRST_DLL_BINARY.这对我们的理解造成了限制,因为RollMid加载器中导入函数的精确实现细节仍然未知。这些导入的函数包括以下内容:

SendDataFromUrl 
GetImageFromUrl 
GetHtmlFromUrl 
curl_global_cleanup 
curl_global_init 

按名称查看导出的函数后,很明显这些函数的任务很可能是促进与 C&C 服务器的通信。FIRST_DLL_BINARY除了这五个函数之外,还导出其他函数,其中一些函数将在本博客后面提到。  

这五个导入函数的名称暗示它们FIRST_DLL_BINARY是基于curl 库构建的(从名称curl_global_cleanup和可以看出curl_global_init)。为了与 C&C 服务器建立通信,RollMid加载程序使用导入的函数,并利用 HTTP 请求作为其首选通信方法。

选择curl 库发送HTTP 请求的理由可能源于多种因素。一个值得注意的原因可能是攻击者获得的效率,他们可以通过利用 HTTP 通信协议节省时间和资源。此外,curl 库的易用性以及与代码的无缝集成进一步支持了它的选择。

在启动与 C&C 服务器的通信之前,恶意软件需要生成一个充满随机单词的字典,如下图 4 所示。鉴于字典的庞大规模(包含大约数百个元素),我们仅包含部分屏幕截图以供参考。本博客的后续部分将深入全面探讨该字典在恶意软件整体功能中的作用和应用。

图 4:填充主词典

为了与 C&C 服务器建立通信,如图 5 所示,恶意软件必须从该CONFIGURATION_DATA部分获取初始 C&C 地址。解密这些地址后,恶意软件会通过该函数启动与 C&C 服务器第一层的通信GetHtmlFromUrl,可能使用 HTTP GET 请求。服务器使用包含第二个 C&C 服务器层地址的 HTML 文件进行响应。随后,恶意软件利用导入的函数与第二层进行通信GetImageFromUrl。函数名称暗示该函数执行 GET 请求来检索图像。

在这种情况下,攻击者采用隐写术来隐藏关键数据,以供下一个执行阶段使用。遗憾的是,我们无法确定从 C&C 服务器第二层接收到的图像中隐藏的重要数据的性质。

图5:与 C&C 服务器的通信

我们知道图像中的隐藏数据充当负责将数据传输到第三个 C&C 服务器的函数的参数。通过分析,我们确定从图像中获取的数据对应的是第三个C&C服务器的另一个地址。与第三个 C&C 服务器的通信通过 POST 请求启动。  

恶意软件作者战略性地使用多个 C&C 服务器作为其操作策略的一部分,以实现特定目标。在这种情况下,主要目标是从第三个 C&C 服务器获取额外的数据 blob,如图 5 所示,特别是在步骤 7 中。此外,使用不同的 C&C 服务器和不同的通信路径会增加额外的复杂性试图监视此类活动的安全工具。与采用单个 C&C 服务器的场景相比,这种复杂性使得跟踪和识别恶意活动更具挑战性。

然后,恶意软件通过使用 GET 参数(名称/值对)创建查询字符串来构造 URL。参数名称由从先前创建的字典中随机选择的单词组成,并且值作为两个字符的随机字符串生成。格式如下:

"%addressOfThirdC&C%?%RandomWordFromDictonary%=%RandomString%" 

URL 生成涉及从生成的字典中选择单词,而不是完全随机的字符串。此预期选择旨在增强 URL 的外观和合法性。这些单词是从字典中精心挑选的,有助于呈现干净、有组织的 URL,类似于那些通常与真实应用程序相关的单词。诸如"atype"“、"User"”、“或”之类的术语"type"不是任意的,而是从创建的词典中精心挑选的单词。通过使用真实的单词,目的是创建一种真实性的外观,使 HTTPPOST 有效负载显得更加结构化并符合典型的应用程序交互。  

在将POST请求分派到 C&C 服务器的第三层之前,请求会填充由标准分隔符“?”分隔的附加键值元组。键和值之间有“=”。在这个场景中,它包括:

%RandomWordFromDictonary %=%sleep_state_in_minutes%?%size_of_configuration_data%  

解析从第三个C&C服务器接收到的数据。解析的数据可能包含描述睡眠间隔的整数或数据块。该数据 blob 使用 base64 算法进行编码。对数据 blob 进行解码后,其中前 4 个字节表示数据 blob 的第一部分的大小,其余部分表示数据 blob 的第二部分。

数据 blob 的第一部分作为SECOND_ENCRYPTED_DLL从二进制 blob 获得的覆盖层附加到。成功解密和解压后 SECOND_ENCRYPTED_DLL,该过程涉及准备SECOND_ENCRYPTED_DLL,这是一个远程访问木马(RAT)组件,将加载到内存中并使用特定参数执行。

这一举措背后的潜在动机仍然笼罩在不确定性之中。看来攻击者通过选择这种方法,试图在过程中注入一定程度的复杂性。然而,从我们的角度来看,这种方法似乎有点矫枉过正。我们相信,一种更简单的方法足以将数据 blob 传递给KaolinRAT。  

数据 blob 的第二部分一旦解密并解压缩,就会被移交给KaolinRAT 组件,而KaolinRAT 则在内存中执行。值得注意的是,用于解密数据块第二部分的解密密钥和初始化向量驻留在其最初的 32 个字节内。  

Kaolin RAT

策划攻击的关键阶段涉及远程访问木马 (RAT) 的利用。如前所述,该KaolinRAT 在内存中执行,并配置了特定参数以实现正确的功能。它是一个功能齐全的工具,包括文件压缩功能。  

然而,在我们的调查中,KaolinRAT 并没有标志着攻击的结束。在上一篇博文中,我们已经介绍了另一个重要组件——FudModule rootkit。凭借我们强大的遥测技术,我们可以自信地断言该 rootkit 是由上述KaolinRAT 加载的,展示了其无缝集成和部署FudModule.这种分层的进展强调了整体攻击策略的复杂性和复杂性。

重要步骤之一是与 RAT 的 C&C 服务器建立安全通信,并使用 AES 加密算法进行加密。尽管包含通信功能的二进制文件不可用(RAT 还依赖于从FIRST_DLL_BINARY网络导入的功能),但我们的理解是通过攻击链中的其他组件来了解的,这使我们能够对通信方法做出某些假设。

RATKaolin加载了六个参数,其中一个关键参数是网络模块 DLL 二进制文件的基地址,之前也在RollMid加载器中使用过。另一个参数包括来自接收到的数据块的第二部分的配置数据。

为了正确执行,Kaolin RAT 需要解析此配置数据,其中包括以下参数:

睡眠间隔的持续时间。

指示是否收集有关可用磁盘驱动器的信息的标志。

指示是否检索远程桌面上活动会话列表的标志。

其他 C&C 服务器的地址。

另外,KaolinRAT必须从 加载特定的函数FIRST_DLL_BINARY,即:

SendDataFromURL 
ZipFolder 
UnzipStr 
curl_global_cleanup 
curl_global_init 

尽管 RAT 将收集到的信息发送到 C&C 服务器的确切方法Kaolin尚不清楚,但"curl_global_cleanup"和等导出函数的存在"curl_global_init"表明发送过程再次涉及来自curl 库的 API 调用。

为了建立通信,KaolinRAT 首先POST向 C&C 服务器发送请求。在第一个POST请求中,恶意软件构建了一个包含 C&C 服务器地址的 URL。该 URL 生成算法与加载器中使用的算法非常相似RollMid。对于 C&C 地址,KaolinRAT 会附加从之前创建的字典(与加载器中的字典相同RollMid)中随机选择的单词以及随机生成的字符串。 URL的格式如下:

"%addressOfC&Cserver%?%RandomWordFromDictonary%=%RandomString%" 

POST恶意软件利用默认内容类型进一步填充请求的内容"application/x-www-form-urlencoded"。请求的内容POST经过 AES 加密,然后使用 base64 进行编码。

在附加到键值元组(参见下面的表格)的加密内容中,包含以下数据: (EncryptedContent)

加载器的安装路径RollFling和二进制 blob 的路径

来自注册表项 HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionWindowsIconservice 的数据

KaolinRAT进程ID

操作系统的产品名称和内部版本号。

C&C 服务器的地址。

计算机名称

当前目录

在POST包含加密内容的请求中,恶意软件会附加有关在后端解密数据所需的生成密钥和初始化向量的信息。这是通过创建键值元组来实现的,键和值之间用“&”和“=”分隔。在这种情况下,它采用以下形式:

%RandomWordFromDictonary%=%TEMP_DATA%&%RandomWordFromDictonary%=%IV%%KEY%&%RandomWordFromDictonary%=%EncryptedContent%&%RandomWordFromDictonary%=%EncryptedHostNameAndIPAddr% 

成功与 C&C 服务器建立通信后,KaolinRAT 就准备好接收命令。接收到的数据使用上述生成的密钥和初始化向量进行加密,并且需要解密和解析以在RAT内执行特定命令。

当命令被处理时,KaolinRAT 将结果转发回 C&C 服务器,并使用相同的 AES 密钥和 IV 进行加密。该加密消息可能包括错误消息、收集的信息以及执行功能的结果。

RATKaolin能够执行各种命令,包括:

更新睡眠间隔的持续时间。

列出文件夹中的文件并收集有关可用磁盘的信息。

更新、修改或删除文件。

更改文件的上次写入时间戳。

列出当前活动的进程及其关联的模块。

创建或终止进程。

使用命令行执行命令。

更新或检索内部配置。

将文件上传到 C&C 服务器。

连接到任意主机。

压缩文件。

从 C&C 服务器下载 DLL 文件并将其加载到内存中,可能会执行以下导出函数之一:

设置当前目录。

结论

我们的调查显示,Lazarus 组织通过捏造工作机会来针对个人,并使用复杂的工具集来绕过安全产品,从而实现更好的持久性。得益于我们强大的遥测技术,我们能够发现几乎整个攻击链,彻底分析每个阶段。拉撒路组织的技术复杂程度令人惊讶,他们与受害者接触的方式同样令人不安。显然,他们投入了大量资源来开发如此复杂的攻击链。可以肯定的是,Lazarus 必须不断创新,并分配大量资源来研究 Windows 缓解措施和安全产品的各个方面。它们的适应和发展能力对网络安全工作提出了重大挑战。

妥协指标 (IoC)

ISO

b8a4c1792ce2ec15611932437a4a1a7e43b7c3783870afebf6eae043bcfade30 

RollFling

a3fe80540363ee2f1216ec3d01209d7c517f6e749004c91901494fb94852332b 

NLS文件

01ca7070bbe4bfa6254886f8599d6ce9537bafcbab6663f1f41bfc43f2ee370e
7248d66dea78a73b9b80b528d7e9f53bae7a77bad974ededeeb16c33b14b9c56 

RollSling

e68ff1087c45a1711c3037dad427733ccb1211634d070b03cb3a3c7e836d210f
f47f78b5eef672e8e1bd0f26fb4aa699dec113d6225e2fcbd57129d6dada7def 

RollMid

9a4bc647c09775ed633c134643d18a0be8f37c21afa3c0f8adf41e038695643e 

Kaolin RAT

a75399f9492a8d2683d4406fa3e1320e84010b3affdff0b8f2444ac33ce3e690 

参考链接: https://decoded.avast.io/luiginocamastra/from-byovd-to-a-0-day-unveiling-advanced-exploits-in-cyber-recruiting-scams/

图片来源网络侵权可联系删除

相关文章

Mallox勒索软件新Linux变种现世
伪装成破解程序和商业工具的新型恶意软件正在传播
Orcinius后门新样本分析
Poseidon窃取程序通过Google广告感染Mac用户
大选开始之际,欧盟各政党遭受 DDoS 攻击
微软2024

发布评论