Use Fork Dump Lsass
type
status
date
slug
summary
tags
category
icon
password
前言
这个东西在我还在学校的时候,就出来了,但是我一直没记录;这下寒假快结束了 我才写分析....
原理可以看下上面参考链接的第一个,我主要写了下源码分析,如何实现的。
就是用了
NtCreateProcess(Ex)
来fork进程参考链接
源码分析
ForkLib
先分析ForkLib文件夹下的内容
ForkLib.cpp
引用了先看pch头文件 定义了一个
PCH_H
宏,引用了framework.h头文件开头他是定义了几个宏,我把对应是上面东西 都写一下
然后又定义了Debug的打印输出信息
然后接下来的这句是
NtCreateProcessEx
的标志最后导入了
ntdll.lib
和创建了NtCreateProcessEx
接着回到
ForkLib.cpp
发现又引入了ForkLib头文件定义了一个
ForkSnapshot
类,里面定义了俩句柄,然后构造 析构 函数接着回到主文件的cpp看,
这个cpp就是实现了头文件的功能
首先是一个构造方法,传入目标的PID;初始化fork快照,然后打开目标进程,如果没有成功打开就输出下错误信息
然后重写了方法,如果直接传了一个进程句柄,就把本类里未定义的TargetProcess赋值一下
析构函数就是调用
CleanSnapshot
,清空fork快照然后就是
TakeSnapshot
函数,首先判断是否有CurrentSnapshotProcess
,如果有就清空返回了。没有就创建一个进程这里我们创建的进程是lsass的目标句柄,将创建远程进程的分支(这里也就是fork)
CurrentSnapshotProcess
是句柄,TargetProcess
是PID,然后判断是否打开,没打开就输出debug信息,打开了就返回句柄。这个主文件里最后一个函数就是
CleanSnapshot
了,就是用来清空快照的判断是否
CurrentSnapshotProcess
有没有,有就调用TerminateProcess
来终止指定进程及其所有线程,如果没终止成功就输出debug信息,最后强制把CurrentSnapshotProcess赋值
为NULL到这里ForkLib这个文件夹内的内容就分析完了
ForkDump
EscalateDebugPrivilege
没啥好说的 提升权限的函数,也可以用RtlAdjustPrivilege
进行提权然后看下main函数
我觉得这几个应该就不用说了,主要看功能
先打开一个文件,用于我们写入dump后的内存,然后就是判断是否打开
snapshot = new ForkSnapshot(targetProcessId);
,这个就是调用了ForkSnapshot
的构造方法 然后打开这个进程snapshotProcess = snapshot->TakeSnapshot();
然后调用这个函数,把用NtCreateProcessEx
打开后的句柄赋值给snapshotProcess
然后判断句柄的情况,如果不行就找问题,有权限不足?然后如果提权成功了就再次走一圈上面那行,如果还不行就直接退出了
如果打开成功了,就要开始dump内存了;前三个参数就是句柄,id,输出文件;如果dump成功就输出个sucess就完事了
一个工具就这么分析完了
接下来 我想手动实现下 感觉也不难
先使用下GitHub-release里自带的工具
确实可以 然后开始自写
编译后,尝试运行;运行成功dump出了lsass的内存,然后让
mimikatz
进行解析