
Доказательство концепции, инструмент и техническое глубокое погружение в Process Herpaderping. Process Herpaderping обходит средства безопасности, скрывая намерения процесса.
[
][png.HerpaderpIcon]
Process Herpaderping — это метод сокрытия намерений процесса путем изменения содержимого на диске после того, как образ был отображен. Это приводит к любопытному поведению со стороны продуктов безопасности и самой ОС.
![][png.mimioogle]
![][gif.SurivDemo]
Обычно продукт безопасности реагирует на создание процесса, регистрируя callback в ядре Windows ([PsSetCreateProcessNotifyRoutineEx][msdn.PsSetCreateProcessNotifyRoutineEx]). На этом этапе продукт безопасности может проверить файл, который использовался для отображения исполняемого файла, и определить, следует ли разрешить выполнение этого процесса. Этот kernel callback вызывается при вставке начального потока, а не при создании объекта процесса.
Из-за этого субъект может создать и отобразить процесс, изменить содержимое файла, а затем создать начальный поток. Продукт, выполняющий проверку в callback создания, увидит измененное содержимое. Кроме того, некоторые продукты используют подход сканирования при записи, который заключается в мониторинге записи в файлы. Знакомая оптимизация здесь заключается в записи того, что файл был записан, и откладывании фактической проверки до возникновения [IRP_MJ_CLEANUP][msdn.IRP_MJ_CLEANUP] (например, когда файловый дескриптор закрывается). Таким образом, субъект, использующий рабочий процесс write -> map -> modify -> execute -> close, обойдет сканирование при записи, которое полагается исключительно на проверку в [IRP_MJ_CLEANUP][msdn.IRP_MJ_CLEANUP].
Чтобы злоупотребить этим соглашением, мы сначала записываем двоичный файл в целевой файл на диске. Затем мы отображаем образ целевого файла и передаем его ОС для использования при создании процесса. ОС любезно отображает исходный двоичный файл для нас. Используя существующий дескриптор файла и до создания начального потока, мы изменяем содержимое целевого файла, чтобы скрыть или подменить файл, лежащий в основе образа. Через некоторое время мы создаем начальный поток, чтобы начать выполнение исходного двоичного файла. Наконец, мы закроем дескриптор целевого файла. Давайте рассмотрим это пошагово:
NtCreateProcessEx).NtCreateThreadEx).
![][svg.StateDiagram]
@startuml
hide empty description
[*] --> CreateFile
CreateFile --> FileHandle
FileHandle --> Write
FileHandle --> NtCreateSection
Write -[hidden]-> NtCreateSection
NtCreateSection --> SectionHandle
SectionHandle --> NtCreateProcessEx
FileHandle --> Modify
NtCreateProcessEx -[hidden]-> Modify
NtCreateProcessEx --> NtCreateThreadEx
Modify -[hidden]-> NtCreateThreadEx
NtCreateThreadEx --> [*]
FileHandle --> CloseFile
NtCreateThreadEx -[hidden]-> CloseFile
NtCreateThreadEx --> PspCallProcessNotifyRoutines
PspCallProcessNotifyRoutines -[hidden]-> [*]
CloseFile --> IRP_MJ_CLEANUP
IRP_MJ_CLEANUP -[hidden]-> [*]
PspCallProcessNotifyRoutines --> Inspect
PspCallProcessNotifyRoutines -[hidden]-> CloseFile
IRP_MJ_CLEANUP --> Inspect
Inspect -[hidden]-> [*]
CreateFile : Создать целевой файл, оставить дескриптор открытым.
Write : Записать полезную нагрузку в целевой файл.
Modify : Скрыть файл на диске.
NtCreateSection : Создать раздел, используя дескриптор файла.
NtCreateProcessEx : Раздел образа для процесса отображается и кэшируется в объекте файла.
NtCreateThreadEx : Используется кэшированный раздел.
NtCreateThreadEx : Уведомления о процессе срабатывают в ядре.
Inspect : Содержимое на диске не соответствует тому, что было выполнено.
Inspect : Проверка файла на этом этапе приведет к неверной атрибуции.
@enduml
В демонстрации ниже вы увидите, что CMD.exe используется в качестве цели выполнения. Первый запуск перезаписывает байты на диске шаблоном. Второй запуск перезаписывает CMD.exe файлом ProcessHacker.exe. Инструмент Herpaderping исправляет двоичный файл, чтобы он максимально походил на ProcessHacker.exe, сохраняя даже оригинальную подпись. Обратите внимание на множественные выполнения одного и того же двоичного файла и на то, как процесс выглядит для пользователя по сравнению с тем, что находится в файле на диске.
![][gif.ProcessHerpaderp]
![][png.procmon]
Мы наблюдали за поведением, и кое-что из этого может быть удивительным. Давайте попробуем объяснить это поведение.
[Техническое глубокое погружение][md.DivingDeeper]
При разработке продуктов для обеспечения безопасности платформ Windows многие инженеры в этой области (включая меня) полагались на предвзятые представления о том, как ОС будет обрабатывать данные. В этом сценарии некоторые могут ожидать, что файл на диске останется «заблокированным» при создании процесса. Вы не можете удалить файл. Вы не можете записать в него. Но вы можете его переименовать. Как показано здесь, при определенных условиях вы действительно можете в него записать. Будьте бдительны в своих предположениях, всегда ставьте их под сомнение и проводите исследования.
Мотивация для этого исследования возникла при обнаружении того, как проводить анализ, когда файл записывается. Имея предварительный опыт исследования Process Hollowing и Doppelganging, я теоретизировал, что это может быть возможно. Цель — обеспечить лучшую безопасность. Вы не можете создать лучший замок, не поняв сначала, как взломать старый.
Herpaderping похож на Hollowing и Doppelganging, но есть некоторые ключевые различия:
Process Hollowing включает изменение отображенного раздела до начала выполнения, что абстрактно выглядит так: map -> modify section -> execute. Этот рабочий процесс приводит к тому, что предполагаемый поток выполнения Hollowed-процесса отклоняется в непредусмотренный код. Doppelganging можно считать формой Hollowing. Однако Hollowing, на мой взгляд, ближе к инъекции в том смысле, что Hollowing обычно включает явную запись в уже отображенный код. Это отличается от Herpaderping, где нет измененных разделов.
Process Doppelganging ближе к Herpaderping. Doppelganging злоупотребляет транзакционными файловыми операциями и обычно включает следующие шаги: transact -> write -> map -> rollback -> execute. В этом рабочем процессе ОС создаст раздел образа и учтет транзакции, поэтому кэшированный раздел образа в итоге оказывается тем, что вы записали в транзакцию. ОС исправила эту технику. Ну, они исправили крах, который она вызывала. Может быть, они считают это «легальным» использованием транзакции. К счастью, Windows Defender перехватывает технику Doppelganging. Doppelganging отличается от Herpaderping тем, что Herpaderping не полагается на транзакционные файловые операции. И Defender не перехватывает Herpaderping.
Для справки, обобщенные техники: