查看原文
其他

九维团队-红队(突破)| 进程转储及其原理分析

sjeong5 安恒信息安全服务 2022-09-07

简介



Minidump是微软从XP版本开始提出的崩溃转储技术,目的是为了方便恢复故障进程的所有线程的调用堆栈,以及查看故障时刻局部变量的值。如果minidump技术被用于针对Lsass.exe进程,则可以结合mimikatz等工具实现进程转储和离线hash导出,通过此类方法可实现绕过部分杀毒软件和终端检测系统的防护。

本文我们将尝试对常见的内存转储技术原理进行分析,并对其常见利用方式进行介绍。


原理介绍



平台:win7
工具:IDA 7.2、x64dbg v25
在此之前,我们先介绍在用户态(user-mode)下的两个API,分别是MiniDumpWriteDump和MiniDump,以及它们和内核态(kernel Mode)的NtReadVirtualMemory之间的关系。

MiniDumpWriteDump
系统目录下有一个系统DLL文件C:\windows\system32\dbghelp.dll,它是一种调试跟踪相关模块,用于跟踪进程工作,在进程崩溃时收集程序产生异常时的堆栈信息,以供开发人员分析,从而很快找出使程序出现异常的原因。

们可以通过IDA等工具查看DLL等导出函数,从导出函数中可以看到MiniDumpWriteDump函数,如下:
dbghelp!MiniDumpWriteDump



此外,除了系统自身的DLL,VS携带的dbgcore.dll也提供了此API的功能实现,如下:

dbgcore!MiniDumpWriteDump


先来看下微软doc对MiniDumpWriteDump函数的介绍:
function:MiniDumpWriteDump (minidumpapiset.h)
*左右滑动查看更多

功能说明:将用户态下的minidump信息写到指定文件。
BOOL MiniDumpWriteDump( HANDLE hProcess, DWORD ProcessId, HANDLE hFile, MINIDUMP_TYPE DumpType, PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam, PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam, PMINIDUMP_CALLBACK_INFORMATION CallbackParam);
*左右滑动查看更多

其中hProcess参数说明中,介绍了访问进程句柄需要PROCESS_QUERY_INFORMATION和
PROCESS_VM_READ权限,而收集句柄信息则需要PROCESS_DUP_HANDLE权限。

MiniDump(需要system权限)
微软COM+服务组件中有一个comsvcs.dll,在C:\windows\system32\下:

通过IDA查看comsvcs.dll的导出函数,发现存在一个MiniDumpW函数:
comsvcs!MiniDump

同时,从函数导入表窗口,可以看到comsvcs.dll导入了dbghelp.dll的MiniDumpWriteDump函数:

跳转到MiniDumpW导出函数到实现代码,可以发现实际上就是MiniDumpWriteDump的封装调用:

函数原型如下:
HRESULT WINAPI MiniDumpW(DWORD, DWORD, PWCHAR);
*左右滑动查看更多

其中前面两个DWORD参数可以忽略,PWCHAR的传参格式为字符串“[PID] [filename] full”的形式。

PS:为什么会有两个无用参数以及第三个参数传参格式这么奇怪?IDA逆向分析可看到前两个参数在函数体内从未被引用(可能为了未来版本功能升级占位?),第三个参数会在函数内部处理,依次传参给OpenProcess()和CreateFile(),并判断最后一个是否为“full”。具体可在IDA自行分析,此处不再详细叙述。

因为comsvcs.dll是DLL文件,我们可以通过rundll32.exe去调用它的导出函数MiniDump,rundll32.exe的用法如下:
void CALLBACK EntryPoint(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow);
*左右滑动查看更多

最后的调用方式如下:
rundll32 comsvcs.dll MiniDump [PID] test.dmp full
*左右滑动查看更多

提供目标进程的PID后,会生成test.dmp转储文件(需要system权限)。

NtReadVirtualMemory
介绍完MiniDump和MiniDumpWriteDump,它们和内核态的NtReadVirtualMemory有什么关系呢?

NtReadVirtualMemory函数位于ntdll中,作用就是把用户态的函数调用翻译成相应的系统调用,进入内核态。内核中一般有一个相同名字的处理函数,接收到该类型的系统调用后做实际的工作。

实际上它们都是对进程的虚拟内存进行读取和结构解析,最后通过NtReadVirtualMemory调用。

函数原型
ntdll!NtReadVirtualMemory
typedef NTSTATUS(NTAPI*Ptr_NtReadVirtualMemory)( IN HANDLE ProcessHandle, IN PVOID BaseAddress, OUT PVOID Buffer, IN ULONG NumberOfBytesToRead, OUT PULONG NumberOfBytesReaded OPTIONAL);
   *左右滑动查看更多

常见进程转储





procdump转储原理




Procdump是微软的一个命令行实用程序,它的主要目的是监控应用程序的CPU峰值并在峰值异常时生成崩溃转储文件,供研发人员和管理员确定问题发生的原因。它可以作为常规进程转储实用程序,也可以嵌入其它脚本中使用。

在内网攻击场景中有时候为了避免mimikatz等工具上传被杀毒软件或安全终端识别,会借用带有微软签名信息等procdump进行lsass.exe进程转储,并远程下载到攻击者本地进行明文或hash获取。

下面我们将分析procdump的进程转储机制,IDA分析过程如下:

IDA加载procdump后,优先查看函数导入/导出表,此时会发现导出表除了start无其它导出函数,导入表窗口,Ctrl+F搜索,并看到类似minidump的函数:


按Shift+F12打开字符串窗口,Ctrl+F搜索minidump,可以发现有MiniDumpWriteDump:

双击跟进MiniDumpWriteDump字符串位置,查看交叉引用,main函数有对这个字符串进行引用:

继续跟进分析,优先对字符串引用位置上下文的函数调用进行分析,如sub_40FE90和sub_405710函数:

在sub_40FE90函数内部,主要实现了加载dbghelp.dll并导入MiniDumpWriteDump函数:

实际上顺着流程图继续往上回溯,在函数sub_40C860内部对procdump的参数进行了判断(本文主要探讨procdump和MiniDumpWriteDump的关系,因此不做深入分析):

结论
简单分析到这里就可以对procdump的转储机制有了比较清晰的了解,procdump本质上也是对dbghelp.dll的函数MiniDumpWriteDump进行调用实现的进程转储。



taskmgr转储原理




taskmgr.exe用于Windows任务管理器。它会显示你的系统中正在运行的进程,并显示出电脑上的cpu、内存、网络宽带、用户登录等使用情况。该程序使用Ctrl+Alt+Del 或Ctrl+Shift+Esc打开,且不是纯粹的系统程序。

同样在有部署杀毒软件和安全终端的情况下,远程登录到目标机器RDP后,可通过任务管理器对lsass.exe进程进行右键--创建转储文件:

随后会在用户临时文件夹生成DMP文件:
C:\Users\administrator\AppData\Local\Temp\lsass.DMP
   *左右滑动查看更多


随后将lsass.DMP文件下载到攻击者本地,通过mimikatz即可对该DMP文件进行读取,进一步获取密码hash或明文(此处不做演示)。

动态分析
下面通过IDA对taskmgr.exe进行简单分析,在IDA的导入函数表窗口搜索,可发现同样也是导入了dbghelp.dll的MiniDumpWriteDump函数:

跟进MiniDumpWriteDump函数的调用,分析程序逻辑也可以理解taskmgr和MiniDumpWriteDump的关系,但为了更直观的了解手动转储和MiniDumpWriteDump的因果关系,直接动态调试会更清晰。

X64dbg附加打开taskmgr.exe进程,这时需要在IDA分析如何快速定位以及准确下断点。先根据MiniDumpWriteDump函数的交叉引用,回溯上一级谁进行了调用,有三处引用,但有两个都是text段段,先忽略:

继续回溯,仅有一处引用:

流程并不复杂,可以往上找最接近的代码,给一些特殊且不是太频繁调用的系统API下断点,继续往上是函数开始的地方,我们需要继续往上寻找引用的地方:

根据交叉引用窗口显示,sub_10001719C+1DD调用了sub_100016FC0函数的地方,继续回溯即可到达适合下断点的位置:

来到这里,需要注意的是,sub_100016FC0函数并非通过常规的call或jmp指令直接跳转,而是函数地址作为参数存放在R8寄存器,再由CreateThread函数进行调用,CreateThread是windows实现线程创建的API,函数原型如下:
HANDLE WINAPI CreateThread( _In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes, _In_ SIZE_T dwStackSize, _In_ LPTHREAD_START_ROUTINE lpStartAddress, _In_opt_ LPVOID lpParameter, _In_ DWORD dwCreationFlags, _Out_opt_ LPDWORD lpThreadId);
*左右滑动查看更多

参数说明: 
第一个参数 lpThreadAttributes 表示线程内核对象的安全属性,一般传入NULL表示使用默认设置。
第二个参数 dwStackSize 表示线程栈空间大小。传入0表示使用默认大小(1MB)。
第三个参数 lpStartAddress 表示新线程所执行的线程函数地址,多个线程可以使用同一个函数地址。
第四个参数 lpParameter 是传给线程函数的参数。
第五个参数 dwCreationFlags 指定额外的标志来控制线程的创建,为0表示线程创建之后立即就可以进行调度,如果为CREATE_SUSPENDED则表示线程创建后暂停运行,这样它就无法调度,直到调用ResumeThread()。
第六个参数 lpThreadId 将返回线程的ID号,传入NULL表示不需要返回该线程ID号。

返回值
CreateThread的返回值是线程的句柄,失败的话就返回NULL。

回到刚才的问题,哪里下断点合适,流程往上回溯涉及三个API,其中CreateFileW较为合适,因为任务管理器一般不会频繁创建文件,因此可在CreateFileW下断点,X64dbg调试taskmgr.exe并下断点方式如下:

先以管理员权限打开任务管理器,接着管理员权限打开X64dbg调试器,文件--附加,进程列表中选择taskmgr.exe,确定,然后F9多按几次运行,如果调试器最下端左下角显示运行中,则代表附加成功,显示暂停则需要继续运行。

PS:如果附加进程列表没找到taskmgr.exe,则关闭任务管理器,直接通过文件--运行,输入taskmgr.exe确定打开。

在CreateFileW下断点,直接在调试器最下端命令行中输入bp CreateFileW(注意区分大小写),提示断点已设置在xxxx则表示下断点成功:

回到任务管理器界面,找到lsass.exe进程,然后右键--创建转储文件,此时断点成功触发,并停了下来:

看窗口顶部位置显示,程序还在系统模块kernel32.dll领空,但没关系,可以先在断点窗口禁用断点,然后回到CPU窗口,执行到返回(Ctrl+F9),再一次单步执行(F7)回到程序领空:

继续步过执行(F8),来到FFCF7379处,这里通过lea指令传送了数据段ds:[FFCF6FC0]的内容,从小图可以看出实际上就是调用了MiniDumpWriteDump,随后,通过FFCF7391调用CreateThread实现了进程的转储:

结论
来到这里,我们对任务管理器taskmgr.exe的进程转储原理有了比较清晰的认知,实际上也是基于dbghelp.dll的MiniDumpWriteDump函数实现了进程的转储功能。



comsvcs.dll的MiniDump转储原理




在上一章节已有详细说明,MiniDump实际上也是调用了MiniDumpWriteDump,具体可参考原理分析的MiniDump。

PS:需要system权限。

防御思路



配置LSA保护
微软为Windows 8.1操作系统(测试2012r2也可行)提供了LSA保护功能,默认不开启,需要手动在注册表或GPO设置:
HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Lsa
*左右滑动查看更多

新建RunAsPPL值为dword类型00000001,配置后转储lsass.exe进程会提示拒绝访问。

官方配置参考:
https://docs.microsoft.com/en-us/windows-server/security/credentials-protection-and-management/configuring-additional-lsa-protection
*左右滑动查看更多

除了原生系统的配置修改,也考虑部署必要的终端安全防护软件进行恶意攻击监测和防范,比如主机进程保护类程序。

—  往期回顾  —




关于安恒信息安全服务团队安恒信息安全服务团队由九维安全能力专家构成,其职责分别为:红队持续突破、橙队擅于赋能、黄队致力建设、绿队跟踪改进、青队快速处置、蓝队实时防御,紫队不断优化、暗队专注情报和研究、白队运营管理,以体系化的安全人才及技术为客户赋能。


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存