电子邮件主题:
葡萄酒活动
葡萄酒品鉴会
品酒活动(更新日期)
大使日历
外交晚宴
-
合法的 PowerPoint 可执行文件, wine.exe可用于 DLL 侧加载。
-
隐藏的 DLL, AppvIsvSubsystems64.dll其中充斥着垃圾代码,仅作为 PowerPoint 可执行文件运行所需的依赖项。
-
另一个隐藏且经过严重混淆的 DLL ppcore.dll可充当加载器,称为 GRAPELOADER,因为它很可能在攻击的后期用于传递 WINELOADER。
一旦 wine.exe 执行并侧载 GRAPELOADER DLL,恶意软件便开始一系列恶意操作:它会将 wine.zip 存档内容复制到磁盘新位置,接着通过修改 Windows 注册表的 Run 键获取持久性,确保 wine.exe 在每次系统重启时自动执行。随后,GRAPELOADER 开始收集受感染主机的基本信息,如主机名和用户名,收集完毕后,这些数据会被发送至命令和控制(C2)服务器,等待接收并投递下一阶段的 Shellcode,进一步扩大对主机的控制与危害 。
WINELOADER 作为 APT29 工具集中知名的模块化后门,早已被安全界熟知。与之不同,GRAPELOADER 是新发现的用于攻击初始阶段的工具,主要作用是对受感染环境进行指纹识别、建立持久化机制以及获取下一阶段有效载荷。尽管二者用途不同,但深入分析显示,新的 WINELOADER 变种与 GRAPELOADER 在代码结构、混淆技术以及字符串解密处理等方面存在诸多相似之处。
对比 WINELOADER 的新旧版本,可发现该后门处于持续演进状态,在保留核心功能的同时,对早期技术进行了优化改进。而 GRAPELOADER 不仅整合并强化了诸如 DLL 解钩、API 解析、代码混淆和字符串混淆等高级技术,还创新引入全新方法,大幅提升自身隐蔽性与攻击有效性 。
GRAPELOADER 以 64 位 DLL(ppcore.dll)的形式存在,其内部包含 PPMain 和 DllGetLCID 这两个导出函数。其中,DllGetLCID 函数充斥着变异的垃圾代码,由在大型循环中进行耗时数学运算的有效指令构成,其主要作用似乎是增加代码量。类似的技术也曾应用于 AppvIsvSubsystems64.dll,该文件仅作为 PowerPoint 可执行文件运行的必需依赖项,而真正触发恶意执行的则是 wine.exe 中的 PPMain 函数。
这个 DLL 借助 wine.exe 的延迟导入来实现 DLL 侧载执行,wine.exe 在此过程中充当初始阶段的下载程序。值得注意的是,由于执行是通过导出 PPMain 函数而非 DllEntryPoint 函数来完成的,所以 GRAPELOADER 不会在加载程序锁下运行,这在一定程度上增加了检测和防范的难度 。
GRAPELOADER 在其整个代码中采用了多种反分析技术
字符串混淆
每个字符串都使用三个独特的函数进行处理,这些函数专门针对特定字符串进行处理。第一个函数检索加密的字节 blob,第二个函数使用自定义算法解密 blob,第三个函数在使用后立即将解密的内存 blob 清零。这种方法通过确保解密的字符串在内存中停留的时间不会足够长,从而避免被自动分析,从而成功绕过了常见的自动字符串提取和反混淆工具(例如 FLOSS) 。此外,由于每个字符串都有独特的处理方法,基于模式的启发式方法难以可靠地检测和提取它们。
运行时 API 解析和 DLL 解除挂钩
在调用任何 WIN API 或 NT API 函数之前,它首先 解除相应的 DLL挂钩 ,然后通过内存中的 PE 解析动态解析 API 。
GRAPELOADER – API 解析和 DLL 解除挂钩
权限维持
恶意执行首先会设置持久性,但前提是进程的当前工作目录不是。C:WindowsSystem32此检查可防止通过诸如之类的工具执行时建立持久性 rundll32.exe,尽管恶意软件仍然会执行。
将所交付档案的内容复制 wine (2).zip 到 C:UsersUserAppDataLocalPOWERPNT。
在 处创建一个 Run 注册表项 ,其中SOFTWAREMicrosoftWindowsCurrentVersionRun 包含 条目 POWERPNT,指向 C:UsersUserAppDataLocalPOWERPNTwine.exe。
C2
建立持久性后,恶意代码会进入无限循环,每 60秒轮询一次其C2服务器。最初,它会收集环境信息,包括:、、和 。 加上 硬编码的64个字符的十六进制字符串 (据信是 活动/版本标签),收集的数据结构如下:
UserNameComputerNameProcessNameProcessPIDe55c854d77279ed516579b91315783edd776ac0ff81ea4cc5b2b0811cf40aa63
struct CollectedEnvironmentInfo
{
BYTE UserName[512];
BYTE ComputerName[512];
BYTE ProcessName[512];
DWORD ProcessPID;
BYTE HardcodedHexString[64];
DWORD GenRandNumFromSystemTime;
};
只有在从 C2 服务器接收到数据后,GRAPELOADER 才会继续执行。有效载荷预计是一段 未加密的、 与内存无关的 Shellcode,它完全在内存中执行,不会写入磁盘。
为了逃避 AV/EDR 解决方案的 内存扫描,GRAPELOADER 实现了一种常见的技术:
接收到的 shellcode 被复制到具有保护的分配内存区域中 PAGE_READWRITE 。
内存保护改为 使用 PAGE_NOACCESS NT API NtProtectVirtualMemory。
调用 WIN API 来创建一个新的 挂起 CreateThread 线程, 并 lpStartAddress 指向不可访问内存区域的开头。
调用Sleep WIN API( 10 秒),让 AV/EDR 解决方案有时间扫描不可访问的内存区域。
内存保护改为 PAGE_EXECUTE_READWRITE 使用 NtProtectVirtualMemory。
调用ResumeThread WIN API来 执行shellcode。
该 DLL 名为 vmtools.dll,其导出的函数名称显示,它被设计用于与存在安全隐患的良性可执行文件一同部署,借助 DLL 侧加载机制来运行恶意代码。尽管我们未能获取加载此 DLL 的确切主模块,但研究迅速发现,VMWare Tools 安装程序中的可执行文件常常使用类似库(相同的 DLL 名称及导出函数)。
不过,要确定漏洞模块的正确版本困难重重。由于 DLL 已被植入木马,多数导出函数充斥着垃圾指令,在加载程序触发某个受损的导出函数前,几乎无法识别目标函数,宛如大海捞针。为突破这一困境,我们采用模拟策略,系统地对所有导出函数进行暴力测试,同时密切监控异常行为。这一策略很快让我们锁定了目标函数 Str_Wcscpy,正是它会启动恶意执行程序 。
WINELOADER 解包
与早期版本一样,核心模块通过RC4 解密 进行脱壳 ,使用硬编码的 256 字节密钥 。字符串解密和 C2 通信也使用相同的 RC4 密钥和算法。
struct CollectedEnvironmentInfo
{
WORD PaddingLength;
BYTE PaddingBytes[PaddingLength];
QWORD PossibleCampaignID;
QWORD PossibleSessionID;
BYTE IPAddress[14];
BYTE ProcessName[512];
BYTE UserName[512];
BYTE ComputerName[30];
DWORD ProcessPID;
BYTE ProcessTokenElevationType;
QWORD PollingInterval;
BYTE RequestType;
QWORD MessageLength;
QWORD Unknown;
QWORD PossibleModuleID;
BYTE Message[MessageLength];
};
https[:]//bravecup[.]com/view.php
Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.2151.25 Safari/537.36 Edg/119.0.2151.25
原文始发于微信公众号(Khan安全团队):APT29 再次发起针对欧洲外交官的网络钓鱼攻击
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论