
Сделать дамп памяти PPL с помощью эксплойта пользовательского режима.
⚠️ 2022-07-24 - Начиная с Windows 10 21H2 10.0.19044.1826 (обновление июля 2022 года), эксплойт, реализованный в PPLdump, больше не работает. Патч в NTDLL теперь предотвращает загрузку PPL Known DLLs. Подробнее здесь.
Этот инструмент реализует пользовательский эксплойт, который изначально был рассмотрен Джеймсом Форшоу (James Forshaw, он же @tiraniddo) — в этой статье блога — для дампа памяти любого PPL с правами администратора.
Я написал две статьи в блоге об этом инструменте. Первая часть посвящена концепциям защищённых процессов, а вторая — самой технике обхода.
Просто запустите исполняемый файл без аргументов, и вы получите подробную справку/использование.
c:\Temp>PPLdump64.exe
_____ _____ __ _
| _ | _ | | _| |_ _ _____ ___
| __| __| |__| . | | | | . | version 0.4
|__| |__| |_____|___|___|_|_|_| _| by @itm4n
|_|
Description:
Dump the memory of a Protected Process Light (PPL) with a *userland* exploit
Usage:
PPLdump.exe [-v] [-d] [-f] <PROC_NAME|PROC_ID> <DUMP_FILE>
Arguments:
PROC_NAME The name of a Process to dump
PROC_ID The ID of a Process to dump
DUMP_FILE The path of the output dump file
Options:
-v (Verbose) Enable verbose mode
-d (Debug) Enable debug mode (implies verbose)
-f (Force) Bypass DefineDosDevice error check
Examples:
PPLdump.exe lsass.exe lsass.dmp
PPLdump.exe -v 720 out.dmp
Прежде всего, PPL были введены в Windows 8.1, поэтому более старые версии Windows, очевидно, не поддерживаются. Этот проект в основном нацелен на Windows 10 (и её серверные редакции), но я также тестировал его на более старых версиях. Вы найдёте сводную таблицу тестов, которые я провёл, в одноимённом разделе.
Другие инструменты обхода PPL обычно выполняют произвольный код в ядре через цифровую подпись драйвера. Этот отличается тем, что использует только пользовательские трюки и работает (почти) бесфайлово.
Этот инструмент использует очень умный трюк, который изначально был рассмотрен Джеймсом Форшоу в 2018 году (см. раздел "Благодарности"). Он включает использование функции API DefineDosDevice для обмана системы и создания произвольной записи Known DLL. Поскольку PPL не проверяют цифровую подпись Known DLL, это впоследствии можно использовать для атаки подмены DLL и выполнения произвольного кода внутри PPL.
Хотя этот инструмент на втором этапе выполняет атаку подмены DLL, он не создаёт новый файл DLL на диске. Вместо этого он использует транзакцию NTFS, чтобы виртуально заменить содержимое существующей DLL — техника, напрямую вдохновлённая работой @_ForrestOrr (см. раздел "Благодарности").
Краткий ответ — "нет". Во-первых, он не использует прямой доступ к ядру, поэтому нет риска вызвать BSOD с этой точки зрения. В худшем случае инструмент может не удалить созданную запись Known DLL, но это не вызовет отказ в обслуживании. Она просто останется там до следующей перезагрузки машины. Поскольку созданная запись будет просто символической ссылкой, указывающей на несуществующую секцию, система в конечном итоге вернётся к расположению по умолчанию (т.е. папке System32), так что это не повлияет на другие программы, работающие на машине.
⚠️ Эксплойт не работает на полностью обновлённых машинах Windows 8.1 / Server 2012 R2. Мне ещё предстоит выяснить, какой патч вызвал ошибку.
[-] DefineDosDevice failed with error code 6 - The handle is invalid.
⚠️ На Windows 8.1 / Server 2012 R2 вам, возможно, также придётся скомпилировать двоичный файл статически (см. "Инструкции по сборке" ниже).
Это решение Visual Studio состоит из двух проектов (исполняемого файла и DLL полезной нагрузки), которые необходимо компилировать в определённом порядке. Всё предварительно настроено, поэтому вам нужно лишь следовать этим простым инструкциям. Скомпилированная DLL полезной нагрузки автоматически встраивается в конечный исполняемый файл.
Release / x64 или Release / x86 в зависимости от архитектуры целевой машины.Build > Build Solution.На Windows 8.1 / Server 2012 R2 вам, возможно, придётся скомпилировать двоичный файл статически.
PPLdump.Свойства конфигурации > C/C++ > Генерация кода.Многопоточный (/MT) в качестве параметра Библиотека времени выполнения.| Версия Windows | Сборка | Редакция | Архитектура | Администратор | SYSTEM |
|---|
| Windows 10 20H2 | 19042 | Pro | x64 | ✔️ | ✔️ |
| Windows 10 20H2 | 19042 | Pro | x86 | ✔️ | ✔️ |
| Windows 10 1909 | 18363 | Pro | x64 | ✔️ | ✔️ |
| Windows 10 1507 | 10240 | Educational | x64 | ✔️ | ✔️ |
| Windows 10 1507 | 10240 | Home | x64 | ✔️ | ✔️ |
| Windows 10 1507 | 10240 | Pro | x64 | ✔️ | ✔️ |
| Windows Server 2019 | 17763 | Standard | x64 | ✔️ | ✔️ |
| Windows Server 2019 | 17763 | Essentials | x64 | ✔️ | ✔️ |
| Windows 8.1 | 9600 | Pro | x64 | ⚠️ | ⚠️ |
| Windows Server 2012 R2 | 9600 | Standard | x64 | ⚠️ | ⚠️ |