Dump Lsass内存转储新旧方法
之前看到一篇关于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文件。
要对一个进程设置”静默退出“监控,需要对几个注册表项进行预置:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\<被监控进程名>\ 注册表项下的GlobalFlag值:0x200(FLG_MONITOR_SILENT_PROCESS_EXIT);
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文件创建。
检测方法就看攻击过程分析一一识别。
关于另一个使用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/
Dump Lsass内存转储新旧方法的更多相关文章
- Java内存泄漏分析系列之六:JVM Heap Dump(堆转储文件)的生成和MAT的使用
原文地址:http://www.javatang.com JVM Heap Dump(堆转储文件)的生成 正如Thread Dump文件记录了当时JVM中线程运行的情况一样,Heap Dump记录了J ...
- 新的方法 (New Approach)¶
第一章:简介 - ANSI Common Lisp 中文版 新的方法 (New Approach)¶ 本书的目标之一是不仅是教授 Lisp 语言,而是教授一种新的编程方法,这种方法因为有了 Lisp ...
- C++中内存泄漏的检测方法介绍
C++中内存泄漏的检测方法介绍 首先我们需要知道程序有没有内存泄露,然后定位到底是哪行代码出现内存泄露了,这样才能将其修复. 最简单的方法当然是借助于专业的检测工具,比较有名如BoundsCheck, ...
- 在x64计算机上捕获32位进程的内存转储
这是一个我经常遇到的问题,我们经常会遇到这样的情况:我们必须重新捕获内存转储,因为内存转储是以“错误”的方式捕获的.简而言之:如果在64位计算机上执行32位进程,则需要使用允许创建32位转储的工具捕获 ...
- Bypass Windows Defender Dump Lsass(手法拙劣)
0x00.前言 Windows Defender是一款内置在Windows操作系统的杀毒软件程序,本文旨在记录实战环境中,服务器存在Windows Defender情况下转储凭证的渗透手法,技术简单粗 ...
- UWP游戏防内存修改器的方法
最近我一直在编写适用于Windows 10商店的游戏.这款游戏比较怕玩家用修改器改金钱,因为这种修改会导致某些内购失效并且损害公平性.于是我把自己见过的三种反修改器的方法给网友们介绍一下. 首先说明一 ...
- javascript插入before(),after()新DOM方法
随着web的技术突飞猛进的发展.HTML5 ES6等新技术的发展,与此同时DOM等标准也在悄悄的进步,各大浏览器也在悄悄的发展适配新的属性和方法,今天我们来看看Javascript新的DOM的方法 二 ...
- 使用WinDBG调试查看C#内存转储文件
有时候我们想查看一个正在运行的程序内存中的数据,可以在任务管理器将内存状态保存为转储文件,并使用WinDBG验证,这里我们来试试: 0.安装WinDBG 1.首先写个代码用来测试 一个class pu ...
- 如何 dump jvm 内存及线程栈
1. dump jvm 内存 命令格式: jmap -dump:format=b,file=dump_file_name pid举例:dump pid 为 3239 的 java 进程的内存到 aa. ...
随机推荐
- antd中的form表单 initialValue导致数据不更新问题
初步理解 : initialValue就是所谓的defaultValue,只会在第一次赋值的时候改变,却又有一些不同,因为 initialValue又会因其他改动而改变. 然而当获取的数据重新上来要渲 ...
- 【从小白到专家】收官!Istio技术实践之九:路由控制与灰度发布
本期是Istio技术实践专题的最后一个模块,主题是Istio的路由控制与灰度发布.上一期我们讲到,虚拟服务(Virtual Service)以及目标规则(Destination Rule)是 Isti ...
- 51 Nod 1091 线段的重叠 (贪心算法)
原题链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1091 思路分析:通过读题不难发现这是一道涉及贪心算法的题,刚 ...
- Keil MDK STM32系列(八) STM32F4基于HAL的PWM和定时器输出音频
Keil MDK STM32系列 Keil MDK STM32系列(一) 基于标准外设库SPL的STM32F103开发 Keil MDK STM32系列(二) 基于标准外设库SPL的STM32F401 ...
- 【Java常用类】DateTimeFormatter
DateTimeFormatter 方式一:预定义的标准格式 实例化 如:ISO_LOCAL_DATE_TIME;ISO_LOCAL_DATE;ISO_LOCAL_TIME DateTimeForma ...
- Java中:接口,抽象类,内部类
Java8中的接口 public interface Output { //接口里定义的成员变量只能是常量 //默认使用public static final修饰 int MAX_CACHE_LINE ...
- 论文解读二代GCN《Convolutional Neural Networks on Graphs with Fast Localized Spectral Filtering》
Paper Information Title:Convolutional Neural Networks on Graphs with Fast Localized Spectral Filteri ...
- JAVA主要类集分类
包装类 Integer包装类 方法 返回值 功能描述 byteValue() byte 以 byte 类型返回该 Integer 的值 intValue() int 以 int 型返回此 Intege ...
- pytest文档7-计算单元测试代码覆盖率(pytest-cov)
pytest-cov 先命令行安装 pytest-cov 2.10.1版本 pip install pytest-cov==2.10.1 环境要求:1.python3.6.6 版本备注:其它版本没试过 ...
- tarjan全家桶
tarjan 全家桶 关于tarjan 它太强了 CCCOrz dfs树&low dfs树:在图上做不重复经过同一点的dfs,经过的边与点形成一棵树.于是图上所有点都被这棵树包含,一部分边被包 ...