Dump Lsass内存转储新旧方法
阅读原文时间:2023年07月11日阅读:1

  之前看到一篇关于Lsass内存dump的文章,学习记录一下。

  lsass.exe(Local Security Authority Subsystem Service)进程空间中,存有着机器的域、本地用户名和密码等重要信息。如果获取本地高权限,用户便可以访问 LSASS 进程内存,从而可以导出内部数据(password),用于横向移动和权限提升。

  Windows环境中,一款知名的开源工具Mimikatz(开发者为Benjamin Delpy)可以从 LSASS 内存数据中提取用户名和密码。但是直接运行相应工具,可能会被本地AV产品检测到,因此 dump LSASS 进程内存后进行回传变得原来越常见。

Dump LSASS 的已知方法

1. 微软签名文件

  • ProcDump

    ProcDump是微软签名的合法二进制文件,被提供用于转储进程内存。

  • 任务管理器

    打开任务管理器,选中目标进程,右键菜单中点击“创建转储文件”,文件保存为%temp%\<进程名>.dmp。

  • ProcExp

    和ProcDump同属于Windows提供的合法工具,该程序可以认为是任务管理器的升级版,同样是右键选中目标进程后创建转储文件,包括 Minidump 和 Full Dump 两种。如果是要窃取 LSASS 中的用户登录凭据,应选择全部DUMP。

  • SQLDumper

    SQLDumper.exe包含在Microsoft SQL和Office中,可生成完整转储文件。

  • Comsvcs.dll

    每个Windows系统中都可以找到该文件,可以使用Rundll32执行其导出函数MiniDump实现进程的完全转储。

  • CreateDump.exe

    .NET5中提供的工具。

2. 其他工具/方法

  • PowerSploit的模块之一Out-MiniDump
  • Process Hacker
  • AvDump.exe(Avast反病毒产品组件)

3. 全内存转储(指的是整个RAM内存空间进行转储,耗时长且占磁盘空间大)

  • WinPmem
  • RowCopy(从 hiberfil.sys 导出凭据)
  • 从 VMEM/VMSN 中获取凭据,这二者是虚拟机内存存储文件

4. 自定义转储

  • MiniDumpWriteDump方法,导出自dbghelp.dll,该API调用 NtReadVirtualMemory 读取目标进程内存数据
  • MiniDumpWriteDump + PssCaptureSnapshot,后者可用于获取目标进程的内存快照,之后调用MiniDumpWriteDump将从获取的快照内存中读取数据,而不是直接从目标进程中获取,更容易躲避AV/EDR检测。

一种DUMP LSASS的新方式

  该技术和Werfault.exe进程有关,在某个运行中的进程崩溃时,werfault.exe将会Dump崩溃进程的内存,从这一点看,可以利用该行为进行目标进程内存的Dump。

  这种方法依赖于Win7开始引入的一种被称为“静默进程退出”的机制,该机制提供了在两种情况下可以触发对被监控进行进行特殊动作的能力:

  (1)被监控进程调用 ExitProcess() 终止自身;

  (2)其他进程调用 TerminateProcess() 结束被监控进程。

  经过配置,在触发"静默进程退出"机制时,可被支持的几个动作包括:

  • 启动一个监控进程

  • 显示一个弹窗

  • 创建一个Dump文件

      这里主要讨论第3种方式,即创建DUMP文件。

      要对一个进程设置”静默退出“监控,需要对几个注册表项进行预置:

  1. HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\<被监控进程名>\ 注册表项下的GlobalFlag值:0x200(FLG_MONITOR_SILENT_PROCESS_EXIT);

  2. HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SilentProcessExit\<被监控进程名>\ 注册表项下的3个键值:

    1)ReportingMode(REG_DWORD),该值可设置为以下几个,具有不同功能:

      a)LAUNCH_MONITORPROCESS (0x1) – 启动监控进程;

      b)LOCAL_DUMP (0x2) – 为导致被监控进程终止的进程和被监控进程本身 二者 创建DUMP文件;

      c)NOTIFICATION (0x4) – 显示弹窗。

    2)LocalDumpFolder (REG_SZ) – DUMP文件被存放的目录,默认为%TEMP%\\Silent Process Exit

    3)DumpType – 根据 MINIDUMP_TYPE 枚举值指定DUMP文件的类型 (Micro, Mini, Heap 或 Custom) ,完全转储目标进程内存的值为MiniDumpWithFullMemory (0x2)。

      那么现在只需要终止目标进程即可获得相应文件的DUMP文件,但是我们的目的是为了获取LSASS进程中的管理员登录凭据,而kill掉LSASS意味着系统将重启。不仅增大了被发现的风险,还可能导致程序无法再次运行。

      那么是否具有可以触发”Silent Process Exit“机制但又不实际终止被监控进程的方法呢?还是有的。根据作者所述,它参考了博客 Hexacorn’s blog(该博客发布过大量Windows平台利用技术的研究文章) 。从中可知,当进程终止时,它将从ntdll.dll调用 RtlReportSilentProcessExit API,该API将与Windows错误报告服务(WerSvcGroup下的WerSvc )通信,以告知当前进程正在执行静默退出。然后,WER服务将启动WerFault.exe转储当前进程。值得注意的是,调用此API不会导致进程退出。这可以让我们在LSASS进程上执行DUMP动作而不导致LSASS的终止。

    NTSTATUS(NTAPI* RtlReportSilentProcessExit) (
    In HANDLE ProcessHandle,
    In NTSTATUS ExitStatus
    );

      作者使用两种方式,一种是直接调用RtlReportSilentProcessExit,一种是远程在LSASS中创建线程执行RtlReportSilentProcessExit。这里我只尝试直接调用RtlReportSilentProcessExit,注入其他进程动作太多了(懒)。

  通过Procmon观察一下,可知进程顺序是 lsassdump.exe->svchost.exe (WerSvcGroup)->WerFault.exe,由运行级别为high的Wefault.exe进行dump文件创建。

  CODE

  检测方法就看攻击过程分析一一识别。

  关于另一个使用Silent Process Exit进行持久化驻留的手法,个人感觉纯粹为了持久化的话感觉没有那么实用,倒不如用于恶意进程被删除时进行保护,比如重启或是延迟重启、重命名移动重启等等,不过如果对于专业人员没啥用。

参考

https://www.deepinstinct.com/2021/01/24/lsass-memory-dumps-are-stealthier-than-ever-before/

https://www.deepinstinct.com/2021/02/16/lsass-memory-dumps-are-stealthier-than-ever-before-part-2/

https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/registry-entries-for-silent-process-exit