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里自带的工具
notion image
确实可以 然后开始自写
 
 
编译后,尝试运行;运行成功dump出了lsass的内存,然后让mimikatz进行解析
notion image
 

© muxue 2021-2025