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. ...
随机推荐
- Kubernetes 中的 Pod 安全策略
来源:伪架构师作者:崔秀龙很多人分不清 SecurityContext 和 PodSecurityPolicy 这两个关键字的差别,其实很简单:•SecurityContext 是 Pod 中的一个字 ...
- 字节一面:事务还没提交的时候,redolog 能不能被持久化到磁盘呢?
又是被自己菜醒的一天,总结面经看到这题目听都没听过,打开百度就像吃饭一样自然 老规矩,背诵版在文末.点击阅读原文可以直达我收录整理的各大厂面试真题 首先,咱需要明白的是,啥是持久化? 听起来高大上,换 ...
- 【C++】STL容器
STL容器 标签:c++ 目录 STL容器 容器的成员函数 所有容器都有的 顺序容器和关联容器 顺序容器(vector/string/list/deque) 容器 vector 构造函数 操作 set ...
- 【记录一个问题】铁威马NAS,升级系统后,所有安装的配置项都丢失了
因为铁威马的系统功能真的是弱,所以写了一些家庭照片处理的系统. 上上周升级了系统后,丢失了以下内容: anaconda 2.及其conda下python3环境的各种库 3.nginx的转发配置 铁威马 ...
- 【小记录】android下opencv的cv::dft()函数,CPU版本与opencl版本的性能相差16倍
cv::dft 相差15.9倍 cpu版本 单次调用 0.029448 毫秒 opencl版本 单次调用 0.468688 毫秒 差别仅 ...
- 通过CVE-2021-43297漏洞在Apache Dubbo<=2.7.13下实现RCE
目录 0 前言 1 找源头 1.1 找到触发点 1.2 可用的gadget 1.3 向上推触发点 2 构造poc 2.1 开启HttpServer 2.2 hessian2序列化过程简述 3 poc ...
- 字符串工具类ToStringBuilder常用方法介绍
一.简介与引入 1.ToStringBuilder.HashCodeBuilder.EqualsBuilder.ToStringStyle.ReflectionToStringBuilder.Co ...
- gorm连接mysql的初始化配置
包含mysql配置.gorm配置.连接池配置.log日志配置 init_db_log.go文件代码 package main import ( "fmt" "gorm.i ...
- golang中GPM模型原理与调度器设计策略
一.GMP模型原理first: 1. 全局队列:存放待运行的G2. P的本地队列:同全局队列类似,存放待运行的G,存储的数量有限:256个,当创建新的G'时,G'优先加入到P的本地队列,如果队列已满, ...
- CSS基本语法(三)
目录 CSS基础语法(三) 十五.CSS定位 1.为什么要使用定位 2.定位组成 定位模式 静态定位 相对定位 绝对定位** 固定定位 粘性定位 边偏移 子绝父相 3.定位的叠放次序 4.拓展 绝对定 ...