Procdump чем открыть дамп
Сведения о анализе файла дампа см. в разделе анализ User-Mode файла дампа.
Противодействие
Вместо заключения приведу несколько рекомендаций, которые помогут свести к минимуму возможности для потенциального злоумышленника сдампить LSASS или извлечь из сделанного слепка значительную выгоду:
Свести к минимуму доступ к любым сетевым узлам в домене с учетными данными пользователей, входящих в привилегированные доменные группы (Domain Admins, Enterprise Admins, Administrators и др.), а для администрирования серверов и рабочих станций использовать выделенные для данных целей УЗ с минимально необходимым набором привилегий (смотрим концепцию Tiered Access Model).
Настроить механизм безопасности Remote Credential Guard для предотвращения сохранения аутентификационных данных пользователей при подключении к удаленным сетевым узлам по протоколу RDP для привилегированных УЗ.
Использовать механизм Protected Process (PPL) для предотвращения потенциальной возможности доступа к памяти процесса lsass.exe.
Использовать группу безопасности Windows «Защищенные пользователи» (Protected Users Security Group) и добавить в нее УЗ критически важных пользователей, например, администраторов домена (эта фича требует тестирования перед внедрением в прод, поэтому аккуратнее).
Следовать рекомендациям производителя ОС для снижения риска проведения атак типа Pass-the-Hash.
Ну а пока извечная игра в кошки-мышки между пентестерами и вендорами антивирусного ПО продолжается, Happy hacking!
Одна из самых распространенных проблем, с которой потребители обращаются в группу поддержки Microsoft, — слишком высокие показатели использования центрального процессора. Часто найти решение бывает трудно, так как необходимо сначала определить, какой процесс или операция потребляет много ресурсов центрального процессора, а затем выбрать оптимальный метод сбора данных о действиях процесса в период проявления проблемы, чтобы исследовать основную причину. На этот случай компания Microsoft предоставляет целый ряд инструментов, которые помогут решить проблему центрального процессора. В данной статье приведен краткий обзор этих средств и описана новая бесплатная утилита под названием ProcDump, с помощью которой можно сэкономить много времени, когда в следующий раз придется искать причины перегрузки центрального процессора.
Инструменты диагностики
До сих пор для диагностики проблем высокого показателя использования центрального процессора в компьютерах Windows применялись в основном следующие инструменты.
При использовании XPERF необходимо учитывать, что инструмент собирает данные обо всех процессах и активности в системе и лишь впоследствии позволяет сузить зону поиска. Поэтому нельзя сформулировать условие: «Пройти стек для XYZ.EXE», приходится собирать данные обо всей системе. Сбор и запись всех данных об активности в поисках проблемы, которая возникает лишь один раз в сутки, могут оказаться нецелесообразными, в зависимости от типичной рабочей нагрузки контролируемых компьютеров. Дополнительные сведения об Xperf приведены в статье «Изучаем Xperf», опубликованной в предыдущем номере журнала.
Введение в ProcDump
С помощью ProcDump можно указать, сколько ресурсов центрального процессора должен занимать процесс и какое время должно пройти, прежде чем ProcDump создаст дамп процесса. Значит, администратору не обязательно присутствовать у консоли, чтобы выдать команду, когда процесс в очередной раз повысит нагрузку на центральный процессор. Необходимо определить порог потребления ресурсов центрального процессора, прежде чем ProcDump сформирует дамп процесса.
Например, замечено, что wmiprvse.exe (процесс WMI Provider Host) в произвольные моменты времени занимает до 90% ресурсов центрального процессора, и нужно получить несколько дампов для анализа. Следующая команда записывает дамп процесса диспетчера очереди печати три раза, когда потребление ресурсов центрального процессора программой wmiprvse.exe достигает или превышает 90% в течение трех секунд, и сохраняет дамп в заранее подготовленном каталоге c:procdumps:
Параметр -c задает порог нагрузки центрального процессора. Параметр -s указывает, в течение какого времени служба должна занимать ресурсы центрального процессора на пороговом уровне, прежде чем начнется формирование дампа. Параметр -n указывает, сколько дампов нужно создать, а wmiprvse.exe — имя процесса, который предстоит отслеживать.
Больше не приходится гадать, какой поток выполняет работу. В окне экрана 1 можно ввести в отладчике команду ~ (тильда), чтобы выяснить, какой номер потока соответствует числу 0 x1194. На экране 2 показана командная строка и ее результат. Как видно, поток 2 (с числом 1194 в строке) является потоком, соответствующим 0x1194.
Я привел этот пример, чтобы продемонстрировать инструмент, но теперь можно переключить внимание на поток 2, чтобы выяснить, что происходило в то время, когда были заняты ресурсы центрального процессора. В командном окне выполните следующую команду, чтобы изменить контекст потока 2:
Результат команды на экране 3 показывает, что процесс wmiprvse.exe во время проведения теста перебирал различные каталоги (EnumDirsNT). Это вполне объяснимо, так как выданный мною запрос WMI требует перечисления всех каталогов в системе.
ProcDump также создаст процесс, если зависает любое из окон процесса (параметр -h); как всегда при использовании ProcDump, для запуска задачи не обязательно находиться у консоли.
Запуск процесса в отладчике
Особенно полезный параметр ProcDump (-x) обеспечивает запуск процесса непосредственно в отладчике. Параметр -x взаимодействует с разделом реестра Image File Execution Options. На экране 4 приведен пример команды, в которой параметр -x указан с процессом lsass.exe, и формируются три дампа lsass.exe, когда процесс занимает 90% ресурсов центрального процессора.
При следующем запуске lsass.exe утилита ProcDump отслеживает процесс с заданными параметрами. Это чрезвычайно удобный подход, так как существуют процессы, которые могут захватить ресурсы центрального процессора немедленно после запуска и приостановить систему до тех пор, пока центральный процессор не разгрузится, но к тому времени записывать в дамп будет нечего, так как перегрузка центрального процессора произошла. Благодаря параметру -x можно собрать данные об этих перегрузках.
Таким образом, ProcDump может быть оптимальным инструментом для диагностики большинства проблем высокой загрузки центрального процессора. Утилита ProcDump спроектирована в результате инициативы сотрудников группы Global Escalation Services компании Microsoft. Особая благодарность — старшему инженеру Мин Ченю, который первым обратился к Марку; ведущему инженеру Джеффу Дейли — за руководство и ценные указания; и, конечно, огромная благодарность Марку Русиновичу, ведущему техническому специалисту Microsoft, за то, что он прислушивается к нашим пожеланиям и быстро вносит изменения.
Introduction
ProcDump is a command-line utility whose primary purpose is monitoring an application for CPU spikes and generating crash dumps during a spike that an administrator or developer can use to determine the cause of the spike. ProcDump also includes hung window monitoring (using the same definition of a window hang that Windows and Task Manager use), unhandled exception monitoring and can generate dumps based on the values of system performance counters. It also can serve as a general process dump utility that you can embed in other scripts.
ProcDump
Другим фаворитом внутренних пентестов долгое время был метод создания снимка памяти LSASS с помощью служебной программы ProcDump из состава Windows Sysinternals. Этот инструмент позволяет создавать дампы процессов с целью их дальнейшего анализа, и процесс lsass.exe тому не исключение (если права позволяют, разумеется, хе-хе).
Создание слепка памяти процесса lsass.exe
Теперь можно притащить слепленный дамп к себе на тачку и распарсить его с помощью того же Mimikatz.
Парсим lsass.dmp с помощью Mimikatz
Или его аналога для Linux – Pypykatz.
Парсим lsass.dmp с помощью Pypykatz
Прелесть этого метода заключается в том, что все необходимые операции по созданию слепка памяти выполняет ProcDump, подписанный Microsoft, и этичному взломщику не требуется тащить на хост никакой малвари. Однако разработчики корпоративных антивирусных решений тоже долго не стояли в стороне и оперативно прикрыли возможность делать дампы LSASS с помощью ProcDump, включив его в разряд PDM:HackTool.Win32.CreDump.rbaa .
«Касперский» не доволен активностью ProcDump
ProcDump
ProcDump — это служебная программа командной строки, основной целью которой является мониторинг приложения на наличие пиковых нагрузок ЦП и создание аварийных дампов во время пиковой нагрузки, которую администратор или разработчик может использовать для определения причины резкого. ProcDump также включает мониторинг окна с зависанием (с использованием того же определения окна, которое зависает Windows и диспетчер задач), необработанное отслеживание исключений и может формировать дампы на основе значений счетчиков производительности системы. Она также может использоваться в качестве общей программы дампа процесса, которую можно внедрить в другие сценарии.
Сведения о создании файла дампа пользовательского режима с помощью служебной программы Sysinternals ProcDump см. в разделе ProcDump.
Related Links
-
The official updates and errata page for the definitive book on Windows internals, by Mark Russinovich and David Solomon. The official guide to the Sysinternals utilities by Mark Russinovich and Aaron Margosis, including descriptions of all the tools, their features, how to use them for troubleshooting, and example real-world cases of their use.
Download ProcDump (680 KB)
Меня зовут @snovvcrash, и я работаю в отделе анализа защищенности компании Angara Security. Отвечаю я, значится, за инфраструктурный пентест, и в этой статье я хотел бы поговорить об одном из самых эффективных методов добычи учетных данных на «внутряке» — извлечении секретов из памяти процесса lsass.exe (MITRE ATT&CK T1003.001) — и, в частности, об особенностях реализации этого метода в ру-сегменте тестирования на проникновение.
За два года работы пентестером мои нервы были изрядно потрепаны нашим любимым отечественным антивирусным решением Kaspersky Endpoint Security (далее — KES), который установлен у каждого первого второго нашего клиента, и который, в отличие от других средств антивирусной защиты, наглухо блокирует все попытки потенциального злоумышленника получить доступ к lsass.exe (не реклама!).
Далее я расскажу свой опыт использования и кастомизации публично доступных инструментов, которые в разные промежутки времени позволяли мне сдампить память LSASS при активном «Касперском». Погнали!
Создание файлов дампа при отладке
Когда CDB или WinDbg отлаживается приложение пользовательского режима, для создания файла дампа можно также использовать команду . dump (создать файл дампа) .
Эта команда не приводит к завершению работы целевого приложения. Выбрав правильные параметры команды, можно создать файл минидампа, содержащий только требуемый объем информации.
Полные дампы User-Mode
Полный дамп пользовательского режима — это базовый файл дампа пользовательского режима.
Этот файл дампа включает все пространство памяти процесса, собственно исполняемый образ программы, таблицу Handle и другую информацию, которая будет полезна отладчику при восстановлении памяти, которая использовалась в момент создания дампа.
Можно «сжать» полный файл дампа пользовательского режима в Малый дамп. Просто загрузите файл дампа в отладчик, а затем используйте команду . dump (создание файла дампа) , чтобы сохранить новый файл дампа в формате минидампа.
Примечание . Несмотря на их имена, самый крупный файл минидампа фактически содержит больше информации, чем полный дамп пользовательского режима. Например, . dump/МФ или . dump/MA создаст больший и полный файл, чем . dump/f.
В пользовательском режиме лучше подходит . dump/m [миниоптионс] . Файлы дампа, созданные с помощью этого параметра, могут иметь разный размер в меньшем объеме. Указав соответствующие миниоптионс , вы можете точно контролировать, какие именно данные включаются.
Mimikatz
Было бы преступлением не начать повествование с такого мастодонта в области потрошения подсистем аутентификации Windows как Mimikatz, которым хоть раз пользовался любой пентестер.
Модуль sekurlsa::logonpasswords позволяет «налету» парсить память lsass.exe с целью поиска секретиков без сохранения соответствующего дампа на диск. Этот инструмент поистине произвел революцию в наступательных операциях и положил начало многим другим исследованием в области извлечения чувствительной информации с хостов под управлением Windows.
Использование Mimikatz (logonpasswords)
На заметку: официальная вики Mimikatz покрывает далеко не все его возможности, поэтому энтузиасты InfoSec-комьюнити создали вот такой замечательный ресурс, которым я рекомендую пользоваться в случае возникновения вопросов, что делает та или иная команда этого замечательного инструмента.
Сжатие существующего файла дампа
CDB и WinDbg можно также использовать для сжатия файла дампа. Для этого начните отладку существующего файла дампа, а затем используйте команду . dump , чтобы создать файл дампа меньшего размера.
CDB и WinDbg
CDB и WinDbg могут создавать файлы дампа пользовательского режима различными способами.
Создание User-Mode файла дампа
Существует несколько различных средств, которые можно использовать для создания файла дампа пользовательского режима: CDB, WinDbg и ProcDump.
Экскурс в историю дампов LSASS
Рассмотрим первопроходцев в ремесле извлечения данных аутентификации из памяти LSASS.
Минидампы
Файл дампа пользовательского режима, включающий только выбранные части памяти, связанный с процессом, называется минидампа.
Размер и содержимое файла минидампа зависит от программы, для которой выполняется дамп, и от приложения, выполняющего дамп. Иногда файл минидампа довольно большой и включает всю таблицу памяти и обработку. В других случаях он намного меньше — например, он может содержать только сведения о одном потоке или содержать только сведения о модулях, на которые фактически имеются ссылки в стеке.
Имя "Малый дамп" является неверным, так как в самом большом файле минидампа фактически содержится больше информации, чем "полный" дамп пользовательского режима. Например, . dump/МФ или . dump/MA создаст больший и полный файл, чем . dump/f. По этой причине . dump/m[миниоптионс] рекомендуется использовать вместо . dump/f для всех операций создания файлов дампа пользовательского режима.
Если вы создаете файл минидампа с отладчиком, то можете выбрать, какую именно информацию следует включить. Простая команда . dump/m будет включать основные сведения о загруженных модулях, которые составляют целевой процесс, сведения о потоке и сведения о стеке. Это можно изменить с помощью любого из следующих параметров:
/MA
Создает малый дамп со всеми необязательными дополнениями. Параметр /MA эквивалентен /мффхут — он добавляет полные данные памяти, обрабатывает данные, выгруженные сведения о модулях, основную информацию о памяти и потоковую информацию в Малый дамп.
/мф
Добавляет данные о полном объеме памяти в Малый дамп. Будут добавлены все доступные зафиксированные страницы, принадлежащие целевому приложению.
/мф
Добавляет все основные сведения о памяти в Малый дамп. При этом в Малый дамп будет добавлен поток, содержащий все основные сведения о памяти, а не только сведения о допустимой памяти. Это позволяет отладчику воссоздать полную структуру виртуальной памяти процесса при отладке минидампа.
/MH
Добавляет данные об дескрипторах, связанных с целевым приложением, в Малый дамп.
/му
Добавляет выгруженные сведения о модуле в Малый дамп. он доступен только в Windows Server 2003 и более поздних версиях Windows.
/MT
Добавляет дополнительные сведения о потоке в Малый дамп. Это включает время потока, которое можно отобразить с помощью . ттиме (отображение времени потока) при отладке минидампа.
/ми
Добавляет дополнительную память в Малый дамп. Дополнительная память — это любая память, на которую ссылается указатель в стеке или резервном хранилище, а также небольшая область, окружающая этот адрес.
/mp
Добавляет в Малый дамп блок среды процесса (ПЕБ) и данные блока среды потока (ТЕБ). это может быть полезно, если требуется доступ к Windows системным сведениям о процессах и потоках приложения.
/мв
Добавляет все зафиксированные закрытые страницы для чтения и записи в Малый дамп.
/md
Добавляет все сегменты данных для чтения и записи в образ исполняемого файла в Малый дамп.
/MC компоновать
Добавляет разделы кода в изображения.
/мр
Удаляет из минидампа эти части стека и памяти хранилища, которые не подходят для повторного создания трассировки стека. Локальные переменные и другие значения типа данных также удаляются. Этот параметр не делает малый дамп меньше (так как эти разделы памяти просто обнуляются), но это полезно, если требуется защитить конфиденциальность других приложений.
/мр
Удаляет полные пути модулей из минидампа. Будут добавлены только имена модулей. Это полезный вариант, если требуется защитить конфиденциальность структуры каталогов пользователя.
/МК "ИмяФайла"
(только Windows Vista) создает малый дамп режима ядра в дополнение к мини-дампу пользовательского режима. Малый дамп режима ядра будет ограничен теми же потоками, которые хранятся в мини-дампе пользовательского режима. Имя файла должно быть заключено в кавычки.
Эти параметры можно комбинировать. Например, команда . dump/МФИУ можно использовать для создания достаточно большого минидампа или команды . dump/МРР можно использовать для создания минидампа, сохраняющего конфиденциальность пользователя. Полные сведения о синтаксисе см. в разделе . dump (создание файла дампа).
Автоматическое создание файла дампа
при возникновении ошибки приложения Windows может отвечать несколькими способами, в зависимости от параметров отладки подпрограммы-дампа. Если эти параметры предписывает средству отладки создать файл дампа, будет создан файл дампа памяти пользовательского режима. Дополнительные сведения см. в разделе Включение отладки по неустранимой отладке.
comsvcs.dll
Безусловно, интересной находкой стало обнаружение экспорта функции MiniDumpW в системной библиотеке C:\Windows\System32\comsvcs.dll , которая дергает вызов Win32 API MiniDumpWriteDump и позволяет делать слепки процессов в рамках концепции Living Off The Land Binaries And Scripts (LOLBAS), когда злоумышленнику не нужно приносить ничего лишнего на атакуемую машину.
Анализ библиотеки comsvcs.dll с помощью PE-bear
Эта библиотека легла в основу первых версий замечательной утилиты lsassy, позволяющей делать слепки LSASS и удаленно читать необходимые области памяти созданного дампа, а не перенаправлять его целиком на машину атакующего (подробнее о принципе работы можно почитать в блоге автора утилиты).
Если взглянуть на код, можно найти суперские «однострочники» для Cmd и PowerShell, которые автоматически позволяют получить идентификатор процесса lsass.exe и сдампить его память по заданному пути.
Примечание: лучше пользоваться PowerShell-версией команды, так как для оболочки PowerShell в отличии от Cmd по дефолту включена привилегия SeDebugPrivilege для привилегированной сессии шелла, которая понадобится для доступа к памяти lsass.exe.
Дампим LSASS с помощью LOLBAS-техники comsvcs.dll
Стоит ли говорить, что создание дампа по такой простой технике, разумеется, будет предотвращено хотя бы мало-мальски неравнодушным антивирусом?
Связанные ссылки
-
Официальные обновления и страница эрраты для окончательной книги на Windows внутренних, Марк Руссинович и Дэвид Соломон. . Официальное руководство по служебным программам Sysinternals Марком Руссиновичем и Аароном Маргозом, включая описания всех средств, их функции, способы их использования для устранения неполадок и примеры реальных вариантов их использования.
Download ProcDump (680 KB)
Examples
Write a mini dump of a process named 'notepad' (only one match can exist):
C:\>procdump notepad
Write a full dump of a process with PID '4572':
C:\>procdump -ma 4572
Write 3 mini dumps 5 seconds apart of a process named 'notepad':
C:\>procdump -s 5 -n 3 notepad
Write up to 3 mini dumps of a process named 'consume' when it exceeds 20% CPU usage for five seconds:
C:\>procdump -c 20 -s 5 -n 3 consume
Write a mini dump for a process named 'hang.exe' when one of it's Windows is unresponsive for more than 5 seconds:
C:\>procdump -h hang.exe hungwindow.dmp
Write a mini dump of a process named 'outlook' when total system CPU usage exceeds 20% for 10 seconds:
C:\>procdump outlook -p "\Processor(_Total)\% Processor Time" 20
Write a full dump of a process named 'outlook' when Outlook's handle count exceeds 10,000:
C:\>procdump -ma outlook -p "\Process(Outlook)\Handle Count" 10000
Write a MiniPlus dump of the Microsoft Exchange Information Store when it has an unhandled exception:
C:\>procdump -mp -e store.exe
Display without writing a dump, the exception codes/names of w3wp.exe:
C:\>procdump -e 1 -f "" w3wp.exe
Write a mini dump of w3wp.exe if an exception's code/name contains 'NotFound':
C:\>procdump -e 1 -f NotFound w3wp.exe
Launch a process and then monitor it for exceptions:
C:\>procdump -e 1 -f "" -x c:\dumps consume.exe
Register for launch, and attempt to activate, a modern 'application'. A new ProcDump instance will start when it activated to monitor for exceptions:
C:\>procdump -e 1 -f "" -x c:\dumpsMicrosoft.BingMaps_8wekyb3d8bbwe!AppexMaps
Register for launch of a modern 'package'. A new ProcDump instance will start when it is (manually) activated to monitor for exceptions:
C:\>procdump -e 1 -f "" -x c:\dumps Microsoft.BingMaps_1.2.0.136_x64__8wekyb3d8bbwe
Register as the Just-in-Time (AeDebug) debugger. Makes full dumps in c:\dumps:
C:\>procdump -ma -i c:\dumps
See a list of example command lines (the examples are listed above):
C:\>procdump -? -e
Дампим LSASS по OPSEC-овски
Итак, перейдем к самому интересному: как же можно «угодить» антивирусным средствам защиты и сделать дамп памяти процесса lsass.exe в стиле Operational Security?
Запреты AV на создание слепков памяти LSASS условно можно разделить на 3 части:
Запрет на получение дескриптора процесса lsass.exe.
Запрет на чтение виртуальной памяти процесса lsass.exe.
Запрет на сохранение результирующего дампа на диск.
Ниже мы рассмотрим 3 проекта, каждый из которых в свое время помогал мне извлечь чувствительную информацию из памяти сетевых узлов при активном средстве KES на внутренних пентестах или операциях Red Team.
NanoDump
Нашим следующим «спасителем» стал инструмент NanoDump от компании-разработчика Cobalt Strike, который я без преувеличений считаю просто произведением искусства.
Его ключевые особенности:
Использование системных вызовов (с их динамическим резолвом) с помощью SysWhispers2, что позволяет обходить userland-хуки Win32 API, которые вешает антивирусное ПО.
Собственная реализация MiniDumpWriteDump через чтение памяти lsass.exe с помощью ZwReadVirtualMemory, что избавляет оператора от необходимости дергать потенциально подозрительную ручку API.
Поддержка разных трюков и техник создания дампа (перечислены не все):
поиск уже открытых дескрипторов lsass.exe в других процессах [ссылка],
использование утекающего хэндла lsass.exe при вызове функции CreateProcessWithLogonW [ссылка],
загрузка NanoDump в виртуальную память lsass.exe в виде провайдера SSP [ссылка],
возможность снятия защиты PPL [ссылка].
Намеренное повреждение сигнатуры дампа памяти с целью избегания детекта от AV на этапе его записи на диск.
Компиляция в Beacon Object File (BOF) для выполнения NanoDump из памяти в случае, когда моделируемый злоумышленник обладает сессией «Кобальта» на скомпрометированном сетевом узле.
Для нас, как для пентестеров компаний преимущественно из ру-сегмента, наибольший интерес представляет техника загрузки NanoDump, скомпилированного в виде DLL, прямо в LSASS как SSP, то есть в виде псевдопровайдера аутентификации LSA. Исходя из нашего опыта, на данный момент это и есть слабое место «Касперского».
Для того, чтобы воспользоваться этой техникой без сессии Cobalt Strike, моделируемый злоумышленник должен принести на скомпрометированный узел 2 бинаря: загрузчик библиотеки SSP и, собственно, саму библиотеку SSP. Полагаю, что в скором времени оба они начнут детектиться по крайней мере на уровне сигнатурного анализа, поэтому воспользовавшись примером из этого ресерча от @ShitSecure мы напилили свой загрузчик NanoDump SSP из памяти с помощью кредла на PowerShell.
Дампим LSASS с помощью NanoDump SSP и восстанавливаем поврежденную сигнатуру
Намеренно не раскрываю исходник кредла (тем более, что в приведенной выше статье все есть), ибо надеюсь, что этот метод проживет хотя бы еще немного. Ну а в общем, смиренно ждем, когда и эта техника начнет «палиться» KES, чтобы начать искать новые ухищрения для дампа памяти LSASS.
Physmem2profit
Последним творением, которое мы сегодня рассмотрим, будет проект Physmem2profit от F-Secure LABS. Его подход к дампу LSASS отличается от остальных тем, что вместо того, чтобы сосредотачиваться на методах уклонения от хуков AV / EDR в userland, он использует драйвер WinPmem (часть форензик-проекта rekall) для получения доступа ко всей физической памяти целевого узла и ищет там область, соответствующую памяти процесса lsass.exe, через монтирование виртуальной ФС FUSE.
Покажем в действии, как заставить это чудо работать:
Для начала клонируем репозиторий проекта, рекурсивно разрешая зависимости в виде git-подмодулей.
Далее исправим версии библиотек acora и pycryptodome в зависимостях rekall-core , чтобы они дружили с актуальным Python 3.
Теперь можно запустить инсталлер, который накатит питонячую виртуальную среду и поставит все, что ему нужно.
Установка Physmem2profit
Следуя рекомендациям из этого issue, я скачал крайний релиз WinPmem (нам понадобится только файл kernel/binaries/winpmem_x64.sys ) и обновил эти константы для изменившегося интерфейса взаимодействия с драйвером. Внесенные изменения можно посмотреть в моем форке проекта.
Также среди внесенных изменений — захардкоженный файл драйвера, который автоматически кладется в файловую систему «жертвы» перед установкой соответствующей службы и стирается после ее остановки и удаления:
Смотрим, как всем этим пользоваться:
Дампим LSASS с помощью Physmem2profit
Вуаля, хеши из LSASS получены!
Время отладки поездок (менее)
В дополнение к CDB, WinDbg и ProcDump другим вариантом отладки приложений в пользовательском режиме является Отладка по времени (менее). Время отладки поездок — это средство, позволяющее записывать выполнение процесса, а затем воспроизводить его позже и в обратном направлении. Отладка по времени (менее) позволяет упростить отладку проблем, позволяя "перематывать" сеанс отладчика, вместо того чтобы воспроизводить ошибку, пока не будет найдена ошибка.
МЕНЕЕ позволяет возвращаться к моменту времени, чтобы лучше понять условия, приводящие к ошибке, и воспроизвести ее несколько раз, чтобы узнать, как лучше решить эту проблему.
МЕНЕЕ может иметь преимущества по сравнению с файлами аварийного дампа, которые часто не содержат кода, который привел к окончательному сбою.
Дополнительные сведения об отладке поездок по времени (менее) см. в разделе время отладки поездок — обзор.
Using ProcDump
Capture Usage:
Install Usage:
Uninstall Usage:
Parameter | Description |
---|---|
-a | Avoid outage. Requires -r. If the trigger will cause the target to suspend for a prolonged time due to an exceeded concurrent dump limit, the trigger will be skipped. |
-at | Avoid outage at Timeout. Cancel the trigger's collection at N seconds. |
-b | Treat debug breakpoints as exceptions (otherwise ignore them). |
-c | CPU threshold at which to create a dump of the process. |
-cl | CPU threshold below which to create a dump of the process. |
-d | Invoke the minidump callback routine named MiniDumpCallbackRoutine of the specified DLL. |
-e | Write a dump when the process encounters an unhandled exception. Include the 1 to create dump on first chance exceptions. |
-f | Filter the first chance exceptions. Wildcards (*) are supported. To just display the names without dumping, use a blank ("") filter. |
-fx | Filter (exclude) on the content of exceptions and debug logging. Wildcards are supported. |
-g | Run as a native debugger in a managed process (no interop). |
-h | Write dump if process has a hung window (does not respond to window messages for at least 5 seconds). |
-i | Install ProcDump as the AeDebug postmortem debugger. Only -ma, -mp, -d and -r are supported as additional options. |
-k | Kill the process after cloning (-r), or at the end of dump collection |
-l | Display the debug logging of the process. |
-m | Memory commit threshold in MB at which to create a dump. |
-ma | Write a dump file with all process memory. The default dump format only includes thread and handle information. |
-mc | Write a custom dump file. Include memory defined by the specified MINIDUMP_TYPE mask (Hex). |
-md | Write a Callback dump file. Include memory defined by the MiniDumpWriteDump callback routine named MiniDumpCallbackRoutine of the specified DLL. |
-mk | Also write a Kernel dump file. Includes the kernel stacks of the threads in the process. OS doesn't support a kernel dump (-mk) when using a clone (-r). When using multiple dump sizes, a kernel dump is taken for each dump size. |
-ml | Trigger when memory commit drops below specified MB value. |
-mm | Write a mini dump file (default). |
-mp | Write a dump file with thread and handle information, and all read/write process memory. To minimize dump size, memory areas larger than 512MB are searched for, and if found, the largest area is excluded. A memory area is the collection of same sized memory allocation areas. The removal of this (cache) memory reduces Exchange and SQL Server dumps by over 90%. |
-n | Number of dumps to write before exiting. |
-o | Overwrite an existing dump file. |
-p | Trigger on the specified performance counter when the threshold is exceeded. Note: to specify a process counter when there are multiple instances of the process running, use the process ID with the following syntax: "\Process(_)\counter" |
-pl | Trigger when performance counter falls below the specified value. |
-r | Dump using a clone. Concurrent limit is optional (default 1, max 5). CAUTION: a high concurrency value may impact system performance. - Windows 7 : Uses Reflection. OS doesn't support -e. - Windows 8.0 : Uses Reflection. OS doesn't support -e. - Windows 8.1+: Uses PSS. All trigger types are supported. |
-s | Consecutive seconds before dump is written (default is 10). |
-t | Write a dump when the process terminates. |
-u | Treat CPU usage relative to a single core (used with -c). As the only option, Uninstalls ProcDump as the postmortem debugger. |
-w | Wait for the specified process to launch if it's not running. |
-wer | Queue the (largest) dump to Windows Error Reporting. |
-x | Launch the specified image with optional arguments. If it is a Store Application or Package, ProcDump will start on the next activation (only). |
-64 | By default ProcDump will capture a 32-bit dump of a 32-bit process when running on 64-bit Windows. This option overrides to create a 64-bit dump. Only use for WOW64 subsystem debugging. |
-? | Use -? -e to see example command lines. |
If you omit the dump file name, it defaults to _.dmp .
Use the -accepteula command line option to automatically accept the Sysinternals license agreement.
Automated Termination:
Setting an event with name ProcDump- is the same as typing Ctrl+C to gracefully terminate ProcDump
Filename:
Default dump filename: PROCESSNAME_YYMMDD_HHMMSS.dmp
The following substitutions are supported:
Substitution | Explanation |
---|---|
PROCESSNAME | Process Name |
Process ID | PID |
EXCEPTIONCODE | Exception Code |
YYMMDD | Year/Month/Day |
HHMMSS | Hour/Minute/Second |
MirrorDump
Первым обнаруженным мною проектом, который на удивление мог обходить защиту KES, был MirrorDump от исследователя @_EthicalChaos_.
Его ключевые особенности:
Применяет магию Boo.Lang и плагина DllExport для генерации «на лету» псевдопровайдера аутентификации LSA SSP и его загрузки в память LSASS для получения дескриптора процесса lsass.exe вместо использования API NtOpenProcess.
В минусы этого способа безусловно входит то, что библиотека DLL псевдопровайдера аутентификации LSA должна быть сохранена на диск скомпрометированного хоста для возможности ее использования в API SpLsaModeInitialize, и которая, ко всему прочему, не может быть удалена после создания дампа без перезагрузки ПК.
Данный проект существует как Proof-of-Concept, который «из коробки» в конечном итоге все равно сохраняет дамп памяти на диск даже с учетом того, что генерация такого дампа проходит столь необычным образом. Поэтому я решил сделать свой форк, добавив две новые фичи:
Парсинг слепка прямо в памяти с помощью библиотеки MiniDump (работает не на всех версиях ОС Windows).
Возможность сжатия и отправки байт слепка памяти по TCP-каналу на машину атакующего, где парсинг может быть произведен силами сторонних инструментов (Mimikatz / Pypykatz).
Для первой фичи был добавлен флаг --parse , при наличии которого байты слепка передаются на EntryPoint MiniDump.
Бесфайловый дамп LSASS с парсингом слепка в памяти
Для второй фичи был написан вспомогательный скрипт на Python, содержащий тривиальный сокет-сервер, ожидающий «зиппованный» дамп. Скрипт также автоматически распакует прилетевший дамп, по желанию проверит контрольную сумму и распрасит его с помощью Pypykatz.
Бесфайловый дамп LSASS с отправкой слепка по TCP
Также метод создания слепков lsass.exe с помощью MirrorDump был добавлен мной для использования вместе с lsassy.
К сожалению, недолго музыка играла и примерно полгода спустя «Касперский» начал блокировать создание дампов LSASS через данную технику на уровне поведенческого анализа, что заставило нас искать другой «непалящийся» способ извлечения кред на внутряках.
Введение
ProcDump — это служебная программа командной строки, основная цель которой — мониторинг приложения на наличие пиков ЦП и создание аварийных дампов во время пиков, которые администратор или разработчик может использовать для определения причины всплеска. ProcDump также включает мониторинг зависания окна (с использованием того же определения окна, что и использование Windows и диспетчера задач), необработанного мониторинга исключений и может создавать дампы на основе значений счетчиков производительности системы. Она также может служить служебной программой дампа общего процесса, которую можно внедрить в другие скрипты.
Out-Minidump.ps1
Еще один древний как мир способ — позаимствовать импорт P/Invoke функции MiniDumpWriteDump из класса NativeMethods сборки System.Management.Automation.WindowsErrorReporting , как это делается в скрипте Out-Minidump.ps1 из арсенала PowerSploit.
Анализ сборки System.Management.Automation.WindowsErrorReporting с помощью dnSpy
Результат работы скрипта аналогичен вызову функции MiniDump из предыдущего метода, поэтому оставлю это в качестве упражнения для читателя. Ну и, соответственно, антивирусы так же негативно к нему относятся.
Краткий ликбез
Если не сильно углубляться в теорию, то Local Security Authority Subsystem Service (он же LSASS) — это процесс (исполняемый файл C:\Windows\System32\lsass.exe ), ответственный за управление разными подсистемами аутентификации ОС Windows. Среди его задач: проверка «кред» локальных и доменных аккаунтов в ходе различных сценариев запроса доступа к системе, генерация токенов безопасности для активных сессий пользователей, работа с провайдерами поддержки безопасности (Security Support Provider, SSP) и др.
Несмотря на то, что в 2к22 при успешном дампе LSASS злоумышленнику чаще всего остается довольствоваться NT-хешами и билетами Kerberos, это все равно с большой вероятностью позволит ему повысить свои привилегии в доменной среде AD за короткий промежуток времени. Реализуя схемы Pass-the-Hash, Overpass-the-Hash и Pass-the-Ticket, злоумышленник может быстро распространиться по сети горизонтально, собирая по пути все больше хешей и «тикетов», что в конечном итоге дарует ему «ключи от Королевства» в виде данных аутентификации администратора домена.
Разновидности User-Mode файлов дампа
Существует несколько видов файлов аварийного дампа пользовательского режима, но они делятся на две категории:
Разница между этими файлами дампа имеет один из размеров. Малые дампы обычно более компактны и могут быть легко отправлены аналитику.
Примечание . Для получения значительной информации можно выполнить анализ файла дампа. Однако ни один из файлов дампа не может предоставить настолько много информации, как фактическая Отладка сбоя непосредственно с помощью отладчика.
Примеры
Напишите мини-дамп процесса с именем "Блокнот" (может существовать только один совпадение):
Блокнот C:\>procdump
Напишите полный дамп процесса с идентификатором PID 4572:
C:\>procdump -ma 4572
Запишите 3 мини-дампа за 5 секунд после процесса с именем "Блокнот":
C:\>procdump -s 5 -n 3 блокнот
Записывайте до 3 мини-дампов процесса с именем "использование", когда загрузка ЦП превышает 20 % в течение пяти секунд:
C:\>procdump -c 20 -s 5 -n 3 использование
Напишите мини-дамп для процесса с именем "hang.exe", когда один из Windows не отвечает более чем на 5 секунд:
C:\>procdump -h hang.exe hungwindow.dmp
Создайте мини-дамп процесса с именем Outlook, если общее использование ЦП системы превышает 20 % в течение 10 секунд:
C:\>procdump outlook -p "\Processor(_Total)\% Процессорное время" 20
Создайте полный дамп процесса с именем Outlook, если число дескрипторов Outlook превышает 10 000:
C:\>procdump -ma outlook -p "\Process(Outlook)\Handle Count" 10000
Создайте дамп MiniPlus в Microsoft Exchange Information Store, если у него есть необработанное исключение:
C:\>procdump -mp -e store.exe
Отображение без записи дампа, коды и имена исключений w3wp.exe:
C:\>procdump -e 1 -f "" w3wp.exe
Напишите мини-дамп w3wp.exe если код или имя исключения содержит "NotFound":
C:\>procdump -e 1 -f NotFound w3wp.exe
Запустите процесс, а затем отслеживайте его для исключений:
C:\>procdump -e 1 -f "" -x c:\dumps consume.exe
Зарегистрируйтесь для запуска и попытайтесь активировать современный "приложение". Новый экземпляр ProcDump запускается при активации для отслеживания исключений:
C:\>procdump -e 1 -f "" -x c:\dumpsMicrosoft.BingMaps_8wekyb3d8bbwe! AppexMaps
Зарегистрируйтесь для запуска современного пакета. Новый экземпляр ProcDump запускается при активации (вручную) для отслеживания исключений:
C:\>procdump -e 1 -f "" -x c:\dumps Microsoft.BingMaps_1.2.0.136_x64__8wekyb3d8bbwe
Зарегистрируйтесь в качестве JIT-отладчика (AeDebug). Выполняет полные дампы в c:\dumps:
C:\>procdump -ma -i c:\dumps
См. список примеров командных строк (примеры приведены выше):
C:\>procdump -? -E
Использование ProcDump
Сбор данных об использовании:
Установка использования:
Удаление использования:
Если не указать имя файла дампа, по умолчанию используется _.dmp значение .
Используйте параметр командной -accepteula строки для автоматического принятия лицензионного соглашения Sysinternals.
Автоматическое завершение:
Задание события с именем ProcDump- аналогично вводу клавиш CTRL+C для корректного завершения ProcDump
Имени файла:
Имя файла дампа по умолчанию: PROCESSNAME_YYMMDD_HHMMSS.dmp
Поддерживаются следующие подстановки:
Подстановка | Объяснение |
---|---|
PROCESSNAME | Имя процесса |
ИД процесса | ИД процесса |
EXCEPTIONCODE | Код исключения |
ГГММДД | Year/Month/Day |
ЧЧММСС | Час,минута в секунду |
Читайте также: