从 LSASS 转储凭证并非新鲜事,多年来一直是攻击性和犯罪分子手法的一部分。LetMeowIn 的核心是使用 dbghelp.dll 中的 MiniDumpWriteDump 函数创建 LSASS 进程的内存转储,但它并非直接将转储写入磁盘,而是先使用 MINIDUMP_CALLBACK_INFORMATION 在内存中操作转储数据,从而使该工具能够在将转储数据写入磁盘之前先在内存中操作转储数据。LetMeowIn 宣称其具备一些额外的隐身和规避功能,使其能够绕过常见的端点安全产品,例如 CrowdStrike Falcon 和 Microsoft Defender。ARC 实验室已确认,LetMeowIn 能够在多个安全端点解决方案运行时转储 LSASS。
通过分析 LetMeowIn 的代码以及提供的文档,LetMeowIn 使用各种方法来避免被端点安全工具检测,例如混淆 Windows API 函数、间接系统调用、篡改 Windows 事件跟踪、间接 LSASS 句柄以及转储文件的反分析。
混淆
在下面的代码片段中,库“dbghelp.dll”被拆分成一个包含单个字符的数组,并读入变量“lldplehgbd”。“minidumpwritedeump”也使用了相同的混淆技术,并将其存储在名为 dwdm 的变量中。LetMeowIn 在不同领域利用了相同的混淆技术,用于常见的关键字检测。
此外,LetMeowIn 会将函数名称用 Unicode 代码点编码,并将值存储在数组中,从而混淆 WinAPI 函数。调用该数组时,LetMeowIn 会调用一个名为 unASCIIme 的函数,该函数将数组解码为字符串形式的 WinAPI 函数名称。
例如,“ISQtN[] = { 81, 117, 101, 114, 121, 83, 121, 115, 116, 101, 109, 73, 110, 102, 111, 114, 109, 97, 116, 105, 111, 110}”将解码为“QuerySystemInformation”。
间接系统调用
间接系统调用是一种常见的防御规避技术,它指的是恶意软件设计成不使用标准库函数或直接系统调用指令直接调用系统调用。相反,恶意软件会通过中间步骤执行系统调用,通常涉及代码混淆或重定向。这种方法可能涉及操纵函数指针、使用内联汇编或利用其他形式的代码间接调用,以一种不易被标准检测机制识别的方式调用系统调用。
以下代码片段是 LetMeowIn 中的一个间接系统调用的示例。
ETW篡改
Windows 事件跟踪 (ETW) 是 Windows 操作系统提供的一种高性能日志记录机制,用于收集详细的系统和应用程序性能数据。端点安全解决方案通常使用它来收集遥测数据,以帮助检测恶意活动。
LetMeowIn 有一个名为 Gluttony 的函数,该函数实现了“acebond”首次记录的一种技术,该技术试图通过限制单个进程所能拥有的 ETW 提供程序数量来阻止其从进程中收集信息。Gluttony 函数利用 EventRegister 函数循环注册提供程序,直到达到最大数量后,LetMeowIn 才能注册任何合法的提供程序。
现有的 LSASS 句柄
由于大多数防病毒和端点检测与响应 (EDR) 解决方案都会检测任何试图直接打开 LSASS 句柄的进程,因此 LetMeowIn 使用了 SkelSec 引入的技术,通过 NtDuplicateObject 函数获取现有的 LSASS 打开句柄的副本。有了 LSASS 打开的句柄,LetMeowIn 就可以转储 LSASS 的内容,从而从转储文件中提取凭据。
LetMeowIn 在名为 HijackHandle 的函数中实现了此技术,该函数通过以下高级步骤劫持进程的现有 LSASS 进程句柄:
- 利用 NtQuerySystemInformation 和 SystemHandleInformation 获取所有打开的句柄及其关联 PID 的列表。
- 通过在安全事件日志中搜索事件 ID 4608 来获取“lsass.exe”的进程 ID。
- 循环遍历列表中的每个句柄,搜索具有现有的 LSASS 打开句柄的进程。
- 对于每个已识别句柄的 PID,使用具有 PROCESS_DUP_HANDLE 权限的 OpenProcess 打开该进程。
- 使用 NtDuplicateObject 将目标进程中的句柄复制到 LetMeowIn 中。
- 在重复的句柄上使用 NtQueryObject 来确定其类型(例如,进程、线程、文件)。
- 如果该句柄是进程句柄,LetMeowIn 将继续访问 LSASS 并生成转储文件。
Dump文件的反分析
在将转储文件写入磁盘之前,LetMeowIn 会运行一个名为 GenerateInvalidSignature 的函数来破坏文件的 MDMP 签名。这会导致文件无法被常用的分析工具分析,从而无法确认转储文件是否包含凭据。LetMeowIn 项目包含一个 Python 脚本,该脚本可以恢复正确的文件签名,从而可以使用 Mimikatz 等工具提取凭据。
LetMeowIn 的检测
进程创建(4688/Sysmon 1):
通常最简单的解决方案就是最好的。审计“LetMeowIn.exe”的进程创建事件,但防御者应该意识到进程名称很容易被修改。
启用进程创建事件(事件 ID 4688)的日志记录。您可以将 Sysmon 配置为将这些事件记录为事件 ID 1,从而捕获有关新创建进程的关键详细信息。
dbghelp.dll 的图像加载(Sysmon 7):
监视生成 Sysmon 事件 ID 7 的 dbghelp.dll 的加载情况。请注意,可以静态构建二进制文件以避免此事件,因此没有此事件并不排除可疑活动。
查询 4608 的事件日志:
查找查询事件日志中事件 ID 4608 的进程,该事件可用于获取 lsass.exe 的 PID。此事件表示系统审核策略更改,并包含 lsass.exe 的进程 ID。
对 NtTraceControl 调用量大的进程
LetMeowIn 会重复注册事件提供程序,直到达到进程的最大提供程序数量,因此查询包含 2048 个提供程序的进程将无法获得正确的结果。因此,防御者可以监控单个进程对 NtTraceControl 的大量系统调用。
审核句柄操作(4690、4658、4656 事件):
事件 ID 4690:句柄重复。
事件 ID 4658:句柄已关闭。
事件 ID 4656:句柄已打开。
启用对句柄操作的审核以捕获如下事件:
这些事件可以与 lsass.exe 上的跟踪操作关联。具体来说,事件 ID 4690(ProcessID=4,SubjectUserSid=S-1-5-18,本地系统帐户)值得关注。将此事件中的 SourceProcessId 与其他事件中的 ProcessId 和 TargetProcessId 关联起来,可以构建全面的活动配置文件。
监控注册表访问:
事件 ID 5656:已访问对象。
事件 ID 4663:尝试访问。
事件 ID 4658:句柄已关闭。
监视与注册表项 HKLMSOFTWAREMicrosoftWindows NTCurrentVersionMiniDumpAuxiliaryDlls 的交互。设置仅限于 SYSTEM 帐户的系统访问控制列表 (SACL) 以捕获访问尝试。
启用对象访问审核以生成如下事件:
创建内存转储:
内存转储通常写入 C:tempdebug.dmp。请注意此位置的文件创建情况,尽管该路径在代码中很容易更改。
请注意,转储文件的标头是随机的,从而否定了简单的基于签名的检测。
暂停命令的进程创建:
使用命令行 C:Windowssystem32cmd.exe /c pause 监视另一个进程创建事件 (4688/Sysmon 1)。这是由 system(“pause”) 命令执行的,但可以将其删除以避免被检测到。
实施和监测策略
原文始发于微信公众号(Khan安全团队):LetMeowIn – 凭证转储程序分析
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论