译者:知道创宇404实验室翻译组
原文链接:CVE-2023-36025 Exploited for Defense Evasion in Phemedrone Stealer Campaign
本文深入研究了 Phemedrone Stealer 活动利用 CVE-2023-36025(Windows Defender SmartScreen 绕过漏洞)进行防御规避的情况,并调查了恶意软件的有效负载。
在例行威胁搜寻过程中,趋势科技发现了有关 CVE-2023-36025 活跃利用的证据,用于感染用户的先前未知的恶意软件——Phemedrone Stealer。
Phemedrone 的目标主要针对 Web 浏览器,以及来自加密货币钱包和消息应用程序(例如 Telegram、Steam 和 Discord)的数据。它还会截图并收集有关硬件、位置和操作系统详细信息的系统信息。然后,被盗数据通过 Telegram 或其命令与控制 (C&C) 服务器发送给攻击者。这个开源窃取程序是用 C# 编写的,并在 GitHub 和 Telegram 上进行维护。
CVE-2023-36025影响 Microsoft Windows Defender SmartScreen,其根源在于 Internet 快捷方式 (.url) 文件缺乏检查和相关提示。黑客可以通过制作 .url 文件来下载并执行绕过 Windows Defender SmartScreen 警告和检查的恶意脚本来利用此漏洞。
Microsoft于 2023 年 11 月 14 日修复了CVE-2023-36025。但是,由于存在在野利用的证据,网络安全和基础设施安全局 (CISA) 也将此漏洞添加到已知被利用的漏洞(KEV) 列表中。有公开注意到,各种演示和概念验证代码已在社交媒体上流传,详细说明了对 CVE-2023-36025 的利用。自此漏洞的细节首次曝光以来,越来越多的恶意软件活动,都将这个漏洞纳入了它们的攻击链中。
通过 vloud 托管的恶意 URL 进行初始访问
值得注意的是,此分析基于我们调查攻击中使用的修改版本。为启动 Phemedrone Stealer 感染过程,攻击者在 Discord 或其他云服务(例如 FileTransfer.io)上托管一系列恶意Internet Shortcut文件。这些文件通常还会使用URL缩短服务,如使用shorturl.at
进行伪装。这使得用户可能会被诱骗打开一个经过恶意制作的.url文件,从而利用CVE-2023-36025漏洞。
利用 CVE-2023-36025 进行防御规避
一旦执行利用 CVE-2023-36025 漏洞的恶意.url ,就会连接到攻击者控制的服务器以下载并执行控制面板 (.cpl) 文件。在执行来自不受信任来源.url文件之前,Microsoft Windows Defender SmartScreen应该通过安全提示警告用户。然而,攻击者通过使用 .cpl 文件作为恶意有效负载传送机制的一部分,制作 Windows 快捷方式 (.url) 文件来逃避 SmartScreen 保护提示。黑客利用 MITRE ATT&CK 技术(T1218.002),滥用 Windows 控制面板进程二进制文件 (control.exe) 来执行 .cpl 文件,这些文件是 DLL 文件。
通过Windows控制面板二进制文件执行恶意的.cpl文件时,它反过来调用rundll32.exe来执行DLL。这个恶意的DLL充当加载器,然后调用Windows PowerShell来下载并执行攻击的下一个阶段,该阶段托管在GitHub上。下一阶段是另一个名为DATA3.txt的PowerShell加载程序。
文件DATA3.txt
是一个额外的混淆加载程序,它使用 PowerShell 字符串和数字操作技术来掩盖其内容,并使静态分析期间破译其真实目的变得更加困难。
通过结合静态和动态分析,我们能够对GitHub托管的加载程序进行反混淆,从而获得该脚本执行的一系列PowerShell命令。这个加载程序将从同一GitHub存储库中托管的ZIP文件下载到由Windows属性实用程序二进制文件(attrib.exe)创建的隐藏目录。
zip 存档包含三个文件:
- WerFaultSecure.exe:这是一个合法的 Windows 故障报告二进制文件。
- Wer.dll: 这是一个恶意二进制文件,在执行 WerFaultSecure.exe时会被旁加载。
- Secure.pdf: 这是一个使用RC4 加密的第二阶段加载器。
利用计划任务和 DLL 旁加载进行持久化
wer.dll
文件在加载程序功能中起着关键作用,负责解密并执行第二阶段加载程序。为实现持久性,恶意软件利用计划任务来创建,并通过多种技术逃避检测,包括 API 哈希和字符串加密。此外,wer.dll
还受到 VMProtect 打包保护。
加载程序采用 DLL 侧面加载技术执行,攻击者通过在应用程序目录中伪装恶意 DLL 文件来欺骗操作系统,使其加载恶意文件而不是合法文件。在我们调查的案例中,WerFaultSecure.exe
执行wer.dll
中的WerpSetExitListeners
函数,从而触发加载程序运行。
加载程序采用动态 API 解析技术,以隐藏其 API 导入并增加静态分析的难度。该技术涉及使用哈希值而非 API 名称来存储必要的 API,并在运行时动态导入它们。在调查的案例中,加载程序使用循环冗余校验32(CRC-32)哈希算法进行这一操作,具体内容如下表所示:
998B531E | 内核32.DLL |
---|---|
46DED02D | 获取模块句柄ExW |
0FC6B42F1 | 获取模块文件名W |
0C97C1FFF | 获取进程地址 |
3FC1BD8D | 加载库A |
0F29DDD0C | lstrcatW |
759903FC | 创建目录W |
0A1EFE929 | 创建文件W |
0A7FB4165 | 获取文件大小 |
8B35A289 | 本地分配 |
95C03D0 | 读文件 |
0B09315F4 | 关闭句柄 |
0B1866570 | 获取模块句柄A |
0F54D69C8 | 复制文件W |
加载程序使用基于 XOR 的算法和动态密钥生成来进行字符串解密。对于每个字节,该算法使用公式 (characterIndex % <num1> + <num2>
) 根据其在缓冲区中的位置生成唯一密钥,然后将该密钥与字节进行异或运算以还原原始字符。每个加密字符串都有其独特的解密函数,具有特定的<num1>
和<num2>
值,增加了解密过程的自动化难度。
以下是来自第一阶段加载器的解密字符串列表:
- “/F /CREATE /TN "Licensing2" /tr "C:\Users\Public\Libraries\Books\WerFaultSecure.exe" /sc minute /MO 90"
- \secure.pdf
- \wer.dll
- \WerFaultSecure.exe
- Activeds.dll
- advapi32
- AllocADsMem
- C:\Users\Public\Libraries\Books\secure.pdf
- C:\Users\Public\Libraries\Books\wer.dll
- C:\Users\Public\Libraries\Books\WerFaultSecure.exe
- C:\Windows\explorer.exe
- C:\Windows\System32\schtasks.exe
- CreateProcessW
- CryptCATCDFOpen
- kernel32.dll
- PathRemoveFileSpecW
- ReallocADsMem
- Shlwapi.dll
- SystemFunction032
- Wintrust.dll
加载程序通过创建名为C:\Users\Public\Libraries\Books
的目录来实现持久性,并将wer.dll
、secure.pdf
和WerFaultSecure.exe
从当前执行目录复制到此位置。然后,它使用参数"/F /CREATE /TN \"Licensing2\" /tr \"C:\\Users\\Public\\Libraries\\Books\\WerFaultSecure.exe\" /sc
执行schtasks.exe
命令,安排 WerFaultSecure.exe
以 90 分钟的间隔运行。
然后,加载器进入到第二阶段,其中加密的第二阶段加载器嵌入在名为secure.pdf
的文件中。为了对其进行解密,恶意软件利用了advapi32.dll
中未记录的函数SystemFunction032
来执行 RC4 解密。然后,它使用Activeds.dll
中的AllocADsMem
和ReallocADsMem
函数来分配内存并重新定位解密后的内容。最后,通过调用VirtualProtect
,将解密缓冲区的内存区域修改为Executable-Read-Write
。
接着,恶意软件利用 API 回调函数将执行流程重定向到第二阶段。回调函数是作为参数传递给 Windows API 函数的例程。随后,API 调用这些例程来执行特定功能。在我们调查的案例中,恶意软件使用了CryptCATCDFOpen函数,该函数用于处理 Windows 中的加密目录文件。它需要两个参数:文件路径(pwszFilePath
)和可选的回调函数(PFN_CDF_PARSE_ERROR_CALLBACK
)。加载器将第二阶段 shellcode 入口点 (EP) 传递给第二个参数PFN_CDF_PARSE_ERROR_CALLBACK
。当调用API函数时,会执行回调函数,从而运行恶意代码。
第二阶段防御回避
攻击者使用了名为Donut的第二阶段加载程序 ,这是一种开源 shellcode,能够在内存中执行 VBScript、JScript、EXE 文件、DLL 文件和 .NET 程序集。Donut 可以直接嵌入到加载程序中,也可以从 HTTP 服务器或 DNS 服务器暂存。在我们调查的案例中,攻击者选择将其直接嵌入到加载程序中。
Donut 具备使用 aPLib、LZNT1、Xpress 和使用 RtlcompressBuffer 的 Xpress Huffman 进行输入文件的压缩功能。它还可以使用Chaskey分组密码对有效负载进行加密。然而,在这种情况下,攻击者仅使用有效负载加密,而没有进行任何压缩。
针对最终的有效负载执行,Donut 被配置为使用非托管 CLR 托管 API 来加载公共语言运行时 (CLR)。一旦 CLR 成功加载到主机进程中,将创建一个新的应用程序域,以允许在一次性 AppDomain 中运行程序集。当 AppDomain 准备就绪时,Donut 将加载 .NET 程序集并调用有效负载的入口点。
Phemedrone Stealer 负载分析
Phemedrone 凭证访问
在运行时,恶意软件会初始化其配置并解密某些项目,例如 Telegram API 令牌、聊天 ID 和Email_To互斥体(用于同步)。这一过程采用预定义的盐、加密密钥以及 RijndaelManaged 对称加密算法完成。
该过程包括从字符串中删除CRYPTED:
前缀,将剩余的 Base64 编码字符串转换为字节数组,并对这些数组进行解密以提取原始的纯文本值。
恶意软件程序使用MutexCheck.Check()
方法来确保它不会与自身的另一个实例同时运行。它通过创建互斥体并使用Config.Email_To
的值作为同步机制来实现此目的。如果互斥体已在使用中,表明恶意软件的另一个实例处于活动状态,则程序将立即使用Environment.FailFast("")
终止自身。解密后的互斥锁值被检测为5dad16bd-6884-4ab8-b182-a504b4c99bcf
。
该恶意软件针对受害者计算机上可能存在的各种应用程序和服务,以提取特定类型的敏感信息:
- 基于 Chromium 的浏览器:该恶意软件会收集数据,包括存储在 LastPass、KeePass、NordPass、Google Authenticator、Duo Mobile 和 Microsoft Authenticator 等应用程序中的密码、cookie 和自动填充信息。
- 加密钱包:从各种加密货币钱包应用程序中提取文件,例如 Armory、Atomic、Bytecoin、Coninomi、Jaxx、Electrum、Exodus 和 Guarda。
- Discord: 从 Discord 应用程序中提取身份验证令牌,从而实现对用户帐户的未经授权的访问。
- 文件抓取器: 恶意软件使用此服务从指定文件夹(例如文档和桌面)收集用户文件。
- 文件Zilla:从 FileZilla 捕获 FTP 连接详细信息和凭据。
- 基于 Gecko 的浏览器:针对基于 Gecko 的浏览器来提取用户数据。
- 系统信息: 收集广泛的系统详细信息,包括硬件规格、地理位置和操作系统信息,并进行截图。
- Steam:访问与 Steam 游戏平台相关的文件。
- Telegram: 从安装目录中提取用户数据,特别针对“tdata”文件夹中与身份验证相关的文件,包括根据大小和命名模式查找文件。
该恶意软件使用名为RuntimeResolver.GetInheritedClasses<IService>()
的自定义方法,通过反射动态查找所有继承自 IService
的子类。该方法利用反射来扫描组件,并根据其优先级将这些服务分组,以便按特定顺序进行处理。对于分组列表中的每个服务,Phemedrone 创建并启动一个新线程。这使得每个服务能够同时开始其 Run
方法,进而执行每个服务中定义的 Collect
方法。
数据泄露的命令和控制
一旦所有线程完成执行,代码就会再次遍历服务。对于每个服务,它会收集该服务所搜集的数据,并使用 MemoryStream
和 ZipStorage
类来处理和压缩信息。MemoryStream
是一种灵活的内存缓冲区,可以临时存储数据,无需进行磁盘 I/O 操作。随后,ZipStorage
直接在 MemoryStream
中将数据压缩为 ZIP 文件格式。
在启动数据泄露之前,恶意软件会通过对 Telegram 的 getMe
端点进行 API 调用,使用 TokenIsValid
方法验证 Telegram API 令牌。此 API 调用是使用存储的 Telegram API 令牌构建的。如果收到的响应以{"ok":true
开头,则被视为有效令牌。但是,如果在此过程中发生任何异常,会记录该异常,并返回 false,表明该令牌无效。如果令牌无效,它会立即通过调用Environment.Exit(0)
终止进程。
验证 Telegram API 令牌后,恶意软件通过 global::Telegram.Telegram
类中的 SendMessage
方法向攻击者发送各种系统信息和统计数据。
Collect
方法用于收集广泛的系统信息和统计信息,包括:地理位置数据(例如 IP、国家/地区、城市、邮政编码)、硬件信息(例如用户名、计算机名称、操作系统、硬件 ID、GPU、CPU、RAM)、浏览器的数据(密码、cookie、信用卡、自动填充、扩展、钱包、文件)以及有关已安装防病毒产品的详细信息。
下图是 Phemedrone Stealer 生成的摘要报告的示例,详细说明了通过网络流量进行的数据泄露的范围。该报告包含有关受感染系统和用户数据的关键信息,涵盖地理位置、硬件规格、Web 数据统计和系统安全功能等方面。
下一步是通过 SendZip
方法泄露包含所收集数据的完整版本的 ZIP 压缩流。该方法使用 HTTP POST 请求与 Telegram API 进行通信,将压缩文件通过此请求作为“文档”进行发送。
SendZip
和 MakeFormRequest2
方法负责构造 multipart/form-data
请求。它们确保设置适当的标头并正确传输文件数据。该请求使用机器人令牌和聊天 ID 发送到 Telegram sendDocument API 端点。整个过程包括错误处理和重试机制,以确保文件上传成功。
图 21 中的代码片段是通过 Telegram 网络流量进行压缩数据泄露的示例:
结论
尽管已经对系统进行了 CVE-2023-36025 的修补,黑客仍在努力寻找利用该漏洞并绕过 Windows Defender SmartScreen 保护的方法,以感染用户并传播多种恶意软件,包括勒索软件和 Phemedrone Stealer 等数据窃取程序。
Phemedrone Stealer 等恶意软件的存在突显了复杂恶意软件威胁不断演进的本质。黑客通过不断寻找和利用关键漏洞,如 CVE-2023-36025,在日常软件中引入新漏洞,迅速增强其感染链的能力。这个案例探讨了开源恶意软件与公共概念验证漏洞之间的关系,因为公共概念验证的发布与其纳入恶意软件感染链之间存在显着的交叉点。
在这一背景下,组织需要保持警惕,确保及时更新系统,以防止暴露于已知漏洞。此外,实施全面的安全措施和多层次的防御策略,以有效防范复杂的恶意软件威胁。
IoCs
相关 IoCs 可点击此处获得
本文由 Seebug Paper 发布,如需转载请注明来源。本文地址:https://paper.seebug.org/3111/