邮箱地址: feathery@qq.com 
电话号码: +13594780376

找到我们

+13594780376

海口市干夸谷478号

从 BYOVD 到零日漏洞:揭示网络招聘诈骗中的高级利用技术

2024-11-29 17:35:45

重点

Avast 发现了一个新活动,针对特定个人发起虚假工作邀请。Avast 揭露了完整的攻击链,从感染途径到部署 “FudModule 20” 根套件并利用 0day Admin gt Kernel 漏洞。Avast 发现了一种此前未记录的 Kaolin RAT,它不仅具备标准 RAT 功能,还可以更改选定文件的最后写入时间戳,并从 CampC 服务器加载任何接收到的 DLL 二进制文件。我们还相信它在加载 FudModule 的同时,也利用了一个 0day 漏洞。

引言

在2023年夏季,Avast 识别出一个通过虚假工作邀请,针对亚洲地区特定个人的攻势。尽管该攻击的动机仍不明确,但根据攻击的低频率来看,攻击者似乎对具有技术背景的个体表现出特别的兴趣。这种复杂性在以往的研究中已体现,例如 Lazarus 组织利用漏洞驱动程序和多种根套件技术,成功地使安全产品失效并增强了持久性。

在本次事件中,Lazarus 通过利用默认 Windows 驱动程序 appidsys 的漏洞进行攻击,目标是使安全产品失效 (CVE202421338)。有关该漏洞的更多信息,可以查看相关的 博客文章。

这表明 Lazarus 可能分配了额外资源来开发此类攻击。在利用漏洞之前,Lazarus 精心部署了工具集,采用无文件恶意软件并将攻击工具加密存储到硬盘中,具体细节将在本文后面介绍。

此外,攻击的性质表明受害者是精心挑选的,高度针对性的。因为在执行初始二进制文件之前,攻击者可能需要与受害者建立一定的信任关系。引入如此复杂的工具集并配合利用漏洞,表明攻击者的资源利用相当充分。

本文将对攻击链中每个模块进行技术分析,旨在建立 Lazarus 组织使用的工具集与先前发表的研究之间的联系。

初始访问

攻击者通过向毫无戒心的个人呈现虚假的工作邀请来发起攻击,利用社交工程技巧建立联系和信任。虽然具体的沟通平台尚不明确,但 Mandiant 和 ESET 之前的研究表明,潜在的传播渠道可能包括 LinkedIn、WhatsApp、电子邮件或其他平台。随后,攻击者试图发送一个恶意 ISO 文件,该文件伪装成 VNC 工具,作为 面试过程 的一部分。由于在 Windows 10 中,ISO 文件通过双击就能自动挂载,因此选择 ISO 文件对攻击者来说非常有吸引力,操作系统也会使 ISO 内容易于访问。此外,这或许可以作为潜在的网络标记MotW规避方法。

由于攻击者与受害者建立了关系,受害者被诱骗挂载包含三个文件的 ISO 文件:AmazonVNCexe、versiondll 和 awscfg,这导致受害者执行了 AmazonVNCexe。

AmazonVNCexe 可执行文件实际上伪装成 Amazon VNC 客户端,而是一个名为 choiceexe 的合法 Windows 应用程序,通常位于 System32 文件夹中。该可执行文件用于旁加载恶意的 versiondll,通过合法的 choiceexe 应用程序进行加载。旁加载是攻击者常用的一种规避检测的技术,因为恶意 DLL 是在合法应用程序的上下文中执行的。

当 AmazonVNCexe 被执行时,它加载 versiondll。这个恶意 DLL 使用原生 Windows API 函数,试图避免诸如用户模式 API 钩子等防御手段。所有原生 API 函数都是通过直接系统调用syscalls来调用的。恶意功能在导出的函数之一中实现,而不在 DLL Main 中。DLLMain 中没有代码,只是返回 1,而在其他导出的函数中仅有 Sleep 功能。

在获得当前 Windows 版本的正确 syscall 编号后,它准备生成一个 iexpressexe 进程,以承载位于第三个文件 awscfg 中的进一步恶意负载。如果受害者的计算机上安装了卡巴斯基杀毒软件,注入操作仅在此情况下执行,似乎是为了规避卡巴斯基的检测。如果未安装卡巴斯基,恶意软件则通过在当前进程中创建线程来执行负载,不进行注入。awscfg 文件是下一阶段的负载,通过 VMProtect 进行混淆,可能是为了使逆向工程变得更复杂。该负载能够从指挥控制CampC服务器下载 shellcode,我们认为此服务器是一个被黑的网站,销售建筑用大理石。官方网站是 https//www[]henrauxcom/,攻击者能够从 https//www[]henrauxcom/sitemaps/about/aboutasp 下载 shellcode。

在详细描述我们的发现时,我们在从 CampC 服务器提取 shellcode 时遇到了困难,因为恶意 URL 无响应。

通过分析我们的遥测数据,我们发现在一名客户的设备中发现了潜在威胁,表明通过 ISO 文件从 CampC 服务器加载 shellcode 后,出现了新发现的 RollFling,我们将在之后的 blog 中进一步探讨这个未记录的加载程序。

此外,ISO 文件的交付方式显示出与 Lazarus 团队使用的战术相似,这一事实在 Mandiant 和 ESET 的研究中均已提到。

另外,在受害机器上发现的 RollSling 样本显示出与 Microsoft 研究中提到的 RollSling 样本的代码相似之处。值得注意的是,在我们客户环境中发现的 RollSling 实例是通过 RollFling 加载器传递的,证实了我们对于缺失 shellcode 与初始加载器 RollFling 之间联系的信念。欲获得可视化确认,请参考第一张显示来自 Microsoft 报告代码 SHA 的屏幕截图,第二张截图则是我们 RollSling 样本的代码。

图片展示了 Microsoft 识别出的 RollSling 的代码。SHAd9add2bfdfebfa235575687de356f0cefb3e4c55964c4cb8bfdcdc58294eeaca。

图片展示了我们目标中发现的 RollSling 代码。SHA68ff1087c45a1711c3037dad427733ccb1211634d070b03cb3a3c7e836d210f。

在接下来的段落中,我们将解释执行链中的每个组件,首先是初始的 RollFling 加载器,然后是随后的 RollSling 加载器,最后是 RollMid 加载器。最后,我们将分析由这三个加载程序链条最终加载的 Kaolin RAT。

加载程序

RollFling

RollFling 加载器是一个恶意 DLL,作为服务安装,表明攻击者最初试图通过注册服务来实现持久性。附带该 RollFling 加载器的还有一些重要文件,这对于攻击链的持续执行至关重要。它的主要任务是启动执行链,所有后续阶段都会专门在内存中运行。遗憾的是,我们未能确定该 DLL 文件是以管理员权限还是普通用户权限注册为服务的。

手机蜜蜂加速器

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

通过调用 GetSystemFirmwareTable见图 1,获取 SMBIOSTableData,该 SMBIOSTableData 用作通过 XOR 操作解密加密的 RollSling 加载器的密钥。如果没有正确的 SMBIOSTableData一个 32 字节长的密钥,则 RollSling 的解密过程将无法进行,也就无法推进恶意软件的执行,这表明攻击是高度针对特定个体的。

这表明,在攻击者通过注册 RollFling 加载器作为服务建立持久性之前,他们需要收集 SMBIOS 表的信息,并将其传输到 CampC 服务器。随后,CampC 服务器可以回复下一阶段的内容。这一附加阶段,称为 RollSling,存储在与 RollFling 相同的文件夹中,但具有 nls 扩展名。

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

图 1:获取 SMBIOS 固件表提供者。

RollSling

通过 RollFling 启动的 RollSling 加载器是在内存中执行的。这个选择可能帮助攻击者规避安全软件的检测。RollSling 的主要功能是定位与之位于同一文件夹中的二进制 Blob或在 Package Cache 文件夹中。如果二进制 Blob 不在 RollSling 的相同文件夹中,加载器将查看 Package Cache 文件夹。此二进制 Blob 包含恶意功能所需的多个阶段和配置信息。该二进制 Blob 必须是通过感染链上的某个以前阶段上传到受害者计算机上的。

二进制 Blob 持有多个文件和配置值的原因有两个。首先,将所有信息放在一个文件中更有效,其次,大部分二进制 Blob 可以被加密,这可能为规避检测增加了一层保护。

RollSling 正在扫描当前文件夹,寻找特定的二进制 Blob。为了确定当前文件夹中的哪个二进制 Blob 是正确的,它首先读取 4 字节以确定要读取的数据大小。一旦数据被读取,来自二进制 Blob 的字节将被反转并保存在临时变量中,随后经过多个条件检查,例如 MZ 头部检查。如果 MZ 头部检查完成,接下来它会查找从提取的二进制中导出的 “StartAction” 函数。如果所有条件满足,它将加载下一个阶段 RollMid 到内存中。攻击者在这种情况下没有为二进制 Blob 使用特定的文件名或特定的扩展名,而是通过多个条件确定正确的二进制 Blob,因此该二进制 Blob 必须满足这些条件。这也是攻击者用来规避技术人员找到感染机器中二进制 Blob 的一种防御逃避技术。

这一阶段代表了执行链中的下一个阶段,即名为 RollMid 的第三个加载程序,同样在计算机内存中执行。

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

driveLetterProgramDataPackage Cache[09AZ]{8}DF09AA86YI78[09AZ]{12}driveLetterProgramDataPackage Cache [09AZ]{8}09C7886EII7F[09AZ]{12}

这些文件夹的作用是用来移动二进制 Blob,目前重命名为新的名称并具有 cab 扩展名。RollSling 加载器将把二进制 Blob 存储在第一个创建的文件夹中,并将在第二个创建的文件夹中存储一个稍后使用的新临时文件。

攻击者利用 Package Cache 文件夹,这一通常用于软件安装文件的存储库,来更好地隐藏其恶意文件,在满是合法文件的文件夹中。通过这种方式,攻击者还利用了 cab 扩展名,这是 Package Cache 文件夹中通常使用的扩展名。通过采用这种方法,攻击者旨在通过将重要文件转移到可信文件夹来有效地避免检测。

最后,RollSling 加载器调用了一个名为 StartAction 的导出函数。该函数被带着特定参数调用,这些参数包括关于 RollFling 加载器的实际路径、包含二进制 Blob 的路径以及由 RollMid 加载器创建的临时文件路径。

图 2:在与 RollFling 加载器相同的文件夹中查找二进制 Blob。

RollMid

RollMid 加载器的职责在于从二进制 Blob 中加载攻击的关键组件和配置信息,同时与 CampC 服务器建立通信。

包含基本组件和配置信息的二进制 Blob,对攻击链的正常执行至关重要。遗憾的是,我们未能获得该二进制 Blob,导致我们对攻击的全面理解存在差距。然而,我们能够获取到 RollMid 加载器和某些存储在内存中的二进制文件。

在二进制 Blob 中,RollMid 加载器是一个基础组件,位于开头见图 3。二进制 Blob 中的前 4 字节描述了 RollMid 加载器的大小。在 RollMid 加载器之后存储着另外两个二进制文件和配置信息,这些配置信息位于二进制 Blob 的末尾。这两个二进制文件和配置信息也会经过压缩和 AES 加密,增加了存储信息的安全性。

如图所示,初始黄色框中的前四个字节描述了 RollMid 加载器的大小。这些特定的信息对于解析很重要,使我们能够转到二进制 Blob 中的后续部分。

在 RollMid 加载器之后,还有两个 4 字节值,由黄色和绿色颜色区分。前者对应于 FIRSTENCRYPTEDDLL 部分的大小,而后者绿色框则表示 SECONDENCRYPTEDDLL 部分的大小。值得注意的是,绿色框中的第二个 4 字节值不仅描述了大小,同时还构成了解密 FIRSTENCRYPTEDDLL 部分的 16 字节 AES 密钥。通过提供每个加密的 DLL 嵌入在二进制 Blob 中的大小信息,我们现在可以访问放置在二进制 Blob 末尾的配置数据部分。

图 3:二进制 Blob 的结构。

RollMid 加载器需要 FIRSTDLLBINARY 以便与 CampC 服务器进行正常通信。但在加载 FIRSTDLLBINARY 之前,RollMid 加载器必须先解密 FIRSTENCRYPTEDDLL 部分。

解密过程应用 AES 算法,首先解析用作 AES 解密的密钥和初始化向量。随后应用解压缩算法以进一步提取解密的内容。在此之后,解密的 FIRSTDLLBINARY 被加载到内存中,并调用 DllMain 函数以初始化网络库。

遗憾的是,由于我们未能获得二进制 Blob,因此无法逆向工程 FIRSTDLLBINARY。这给我们的理解带来了局限,因为 RollMid 加载器中导入函数的具体实现细节仍不为人知。这些导入函数包括:

SendDataFromUrlGetImageFromUrl GetHtmlFromUrlcurlglobalcleanupcurlglobalinit

在审查这些导出函数的名称后,可以明显看出这些函数可能负责与 CampC 服务器进行通信。FIRSTDLLBINARY 还导出了其他功能,部分将在本博客后续提及。

这些五个导入函数的名称暗示了 FIRSTDLLBINARY 基于 curl 库 可以通过 curlglobalcleanup 和 curlglobalinit 的名称看出。为了与 CampC 服务器建立通信,RollMid 加载器利用导入函数,使用 HTTP 请求作为其首选的通信方法。

选择 curl 库进行发送 HTTP 请求的原因可能有多种。一方面,攻击者通过利用 HTTP 通信协议能够提高效率,从而节省时间和资源。另一方面,curl 库的易用性及其在代码中的无缝集成也支持其选择。

在与 CampC 服务器建立通信之前,恶意软件需要生成一个包含随机单词的字典,如下图 4 所示。考虑到字典的庞大约含数百个元素,我们仅包含部分屏幕截图以供参考。接下来的部分将深入探讨该字典在恶意软件整体功能中的作用和应用。

图 4:填充主字典。

为了与 CampC 服务器建立通信,如图 5 所示,恶意软件必须从 CONFIGURATIONDATA 部分获得初始 CampC 地址。解密这些地址后,恶意软件通过 GetHtmlFromUrl 函数向第一个 CampC 服务器层发起通信,大概使用 HTTP GET 请求。服务器回应一个包含第二层 CampC 服务器地址的 HTML 文件。随后,恶意软件通过导入的 GetImageFromUrl 函数与第二层进行通信。该函数名称表明它执行 GET 请求以获取图像。

在此场景中,攻击者利用隐写术隐蔽关键数据以供下一执行阶段使用。遗憾的是,我们未能确定从第二层 CampC 服务器接收到的图像中隐蔽的重要数据的性质。

图 5:与 CampC 服务器的通信。

我们知道,在图像中隐蔽的数据作为函数的参数用于将数据传送到第三个 CampC 服务器。通过分析,我们已确定从图像上获取的数据对应于第三个 CampC 服务器的另一个地址。与第三个 CampC 服务器的通信通过 POST 请求启动。

恶意软件作者战略性地利用多个 CampC 服务器作为他们的运营战术,以达成特定目标。在这个案例中,主要目的是从第三个 CampC 服务器获取额外的数据 Blob,如图 5 中第 7 步所示。此外,使用不同的 CampC 服务器和多样的通信路径增加了安全工具监控此类活动的复杂性。这种复杂性使得跟踪和识别恶意活动变得更具挑战性,相比之下,单一 CampC 服务器的场景要容易得多。

随后,恶意软件通过创建包含查询字符串的 URL,结合 GET 参数名称/值对的方式构造 URL。参数名称是从先前创建的字典中随机选取的单词,而值则是随机生成的两字符字符串。格式如下:

addressOfThirdC ampCRandomWordFromDictonary=RandomString。

URL 生成涉及从生成字典中选择单词,而不是完全随机字符串。这一选择意在增强 URL 的外观和合法性。字典中的词汇,经过精心挑选,提供了干净和整洁的 URL 外观,类似于那些常与真实应用相关联的 URL。诸如 atype、“User”或者 type 这样的名词并非偶然,而是来自创建字典的精选单词。通过使用真实词汇,意在创建一种真实感,使得 HTTP POST 有效负载看起来更为结构化,并符合典型的应用交互。

在向第三层 CampC 服务器发送 POST 请求之前,请求被填充了其他键值对,标准分隔符 “” 和 “=” 将键与值分开。在这种情况下,包含:

RandomWordFromDictonary=sleepstateinminutessizeofconfigurationdata。

从第三个 CampC 服务器收到的数据将被解析。解析后,数据可能包含一个整数,描述睡眠间隔,或一个数据 Blob。该数据 Blob 经过 base64 编码。解码后,数据 Blob 的前四个字节表示第一个部分的大小,剩余部分则代表数据 Blob 的第二部分。

将数据 Blob 的第一个部分作为叠加附加到来自二进制 Blob 的 SECONDENCRYPTEDDLL。在成功解密和解压 SECONDENCRYPTEDDLL 之后,准备将其作为远程访问木马RAT组件加载到内存中并执行特定参数。

从 BYOVD 到零日漏洞:揭示网络招聘诈骗中的高级利用技术

这一举措的潜在动机仍不明确。看起来攻击者通过选择这种方法,意图为该过程注入一定程度的复杂性。然而,从我们的视角来看,这种方法似乎有些过度。我们认为,可以采取更简单的方法将数据 Blob 提交给 Kaolin RAT。

一旦解密和解压第二部分数据 Blob,便将其交给 Kaolin RAT 组件,而 Kaolin RAT 将在内存中执行。值得注意的是,用于解密数据 Blob 第二部分的密钥和初始化向量位于其前32个字节内。

Kaolin RAT

协调攻击的重要阶段涉及利用远程访问木马RAT。如前所述,该 Kaolin RAT 在内存中执行,并被配置为特定参数以确保正常功能。它是一个功能齐全的工具,具备文件压缩能力。

然而,在我们的调查中,Kaolin RAT 并未标志着攻击的结束。在之前的博客文章中,我们已介绍了另一个重要组件 FudModule 根套件。凭借我们强大的遥测系统,我们可以自信地断言,该根套件是通过上述 Kaolin RAT 加载的,展示了其顺利集成并部署 FudModule 的能力。这一分层的进程强调了整体攻击策略的复杂性和精密度。

一个重要步骤是与 RAT 的 CampC 服务器建立安全通信,该通信由 AES 加密算法加密。尽管缺乏包含通信功能的二进制文件RAT 还依赖 FIRSTDLLBINARY 导入的网络功能,我们通过攻击链中的其他组件得出的理解使得我们能够根据假设作出推断。

Kaolin RAT 加载时包含六个参数,其中一个重要参数是先前也在 RollMid 加载器中使用的网络模块 DLL 二进制文件的基址。另一个参数包括来自第二部分数据 Blob 的配置数据。

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

睡眠间隔的持续时间。一个标志,指示是否收集可用磁盘驱动器的信息。一个标志,指示是否检索远程桌面的活动会话列表。其他 CampC 服务器的地址。

此外,Kaolin RAT 还必须从 FIRSTDLLBINARY 中加载特定功能,即:

SendDataFromURLZipFolderUnzipStrcurlglobalcleanupcurlglobalinit

虽然我们尚未完全了解 Kaolin RAT 如何将收集到的信息发送给 CampC 服务器,但导出函数如 curlglobalcleanup 和 curlglobalinit 的存在暗示发送过程再度涉及 cURL 库的 API 调用。

为了建立通信,Kaolin RAT 首先向 CampC 服务器发送 POST 请求。在第一次 POST 请求中,恶意软件构建的 URL 包含 CampC 服务器的地址。这个 URL 生成算法与 RollMid 加载器中使用的非常相似。Kaolin RAT 为 CampC 地址添加了从之前创建的字典中随机挑选的单词,并附上随机生成的字符串。URL 格式如下:

addressOfC ampCserverRandomWordFromDictonary=RandomString。

恶意软件进一步填充 POST 请求的内容,采用默认的 application/xwwwformurlencoded 内容类型。POST 请求的内容经过 AES 加密,并随后使用 base64 编码。

在加密内容中,附加到键值元组的内容见下方形式包含以下数据 (EncryptedContent):

RollFling 加载器的安装路径及其二进制 Blob 的路径注册表项 HKEYLOCALMACHINESOFTWAREMicrosoftWindows NTCurrentVersionWindowsIconservice 中的数据Kaolin RAT 进程 ID操作系统的产品名称和构建编号CampC 服务器的地址计算机名称当前目录

在包含加密内容的 POST 请求中,恶意软件附加了关于生成密钥和初始化向量的信息,方便后端数据解密。这是通过创建键值元组实现的,并以“amp”和“=”分隔键与值。在本例中,其格式如下:

RandomWordFromDictonary=TEMPDATAampRandomWordFromDictonary=IVKEYampRandomWordFromDictonary=EncryptedContentampRandomWordFromDictonary=EncryptedHostNameAndIPAddr。

在成功与 CampC 服务器建立通信后,Kaolin RAT 准备接收命令。收到的数据用先前生成的密钥和初始化向量加密,需要进行解密和解析以执行 RAT 内的特定命令。

在命令处理完成后,Kaolin RAT 将结果以与上述相同的 AES 密钥和初始化向量进行加密的方式反馈给 CampC 服务器。这条加密消息可能包含错误消息、收集到的信息以及执行函数的结果。

Kaolin RAT 可以执行多种命令,包括:

更新睡眠间隔的持续时间。列出文件夹中的文件并收集可用磁盘的信息。更新、修改或删除文件。更改文件的最后写入时间戳。列出当前活动的进程及其相关模块。创建或终止进程。使用命令行执行命令。更新或检索内部配置。上传文件到 CampC 服务器。连接到任意主机。压缩文件。从 CampC 服务器下载 DLL 文件并在内存中加载,可能执行以下导出函数之一:DoMyFuncDoMyFunc2DoMyThread (执行一个线程) DoMyCommandWork 设置当前目录。

结论

我们的调查揭示了 Lazarus 组织通过虚构工作邀请攻击个人,并运用复杂的工具集以更好地维持持久性,同时绕过安全产品。凭借我们强大的遥测数据,我们能够揭示几乎整个攻击链,并对每个阶段进行了深入分析。Lazarus 组织在技术复杂性的水平让人惊叹,他们与受害者的接触方式同样令人担忧。显然,他们在开发如此复杂的攻击链上投放了大量资源。毫无疑问,Lazarus 必须不断创新,并投入巨大的资源研究 Windows 的各种缓解措施和安全产品。他们迅速适应和进化的能力对网络安全工作构成了重大挑战。

事件指标IoCs

ISOb8a4c1792ce2ec15611932437a4a1a7e43b7c3783870afebf6eae043bcfade30。

RollFlinga3fe80540363ee2f1216ec3d01209d7c517f6e749004c91901494fb94852332b。

NLS 文件01ca7070bbe4bfa6254886f8599d6ce9537bafcbab6663f1f41bfc43f2ee370e7248d66dea78a73b9b80b528d7e9f53bae7a77bad974ededeeb16c33b14b9c56。

RollSlinge68ff1087c45a1711c3037dad427733ccb1211634d070b03cb3a3c7e836d210ff47f78b5eef672e8e1bd0f26fb4aa699dec113d6225e2fcbd57129d6dada7def。

RollMid9a4bc647c09775ed633c134643d18a0be8f37c21afa3c0f8adf41e038695643e。

Kaolin RATa75399f9492a8d2683d4406fa3e1320e84010b3affdff0b8f2444ac33ce3e690。

标签:APT、Lazarus、招聘诈骗