
Реализация Ghostly-Hollowing с использованием подменённых системных вызовов для удалённой инъекции PE
[!NOTE] Изначально в репозитории использовалась некорректная лицензия, в которой отсутствовала ссылка на основателя DeceptIQ, @Rad9800, чей репозиторий TamperingSyscalls опубликован под лицензией MIT. Его работа уже была указана в модуле курса (Tampered Syscalls Via Hardware BreakPoints), а также отражена на нашей публичной странице лицензий сторонних разработчиков.
Как только мы узнали об упущении, мы незамедлительно исправили исходный репозиторий и в тот же день связались с Радом, чтобы извиниться за недосмотр. Несмотря на все наши усилия исправить непреднамеренную ошибку, он не ответил и заблокировал дальнейшее общение, а пять месяцев спустя мы получили уведомление DMCA об удалении контента, в результате чего исходный репозиторий был удалён.
К сожалению, недобросовестная эскалация не оставила нам практических путей для урегулирования вопроса, поэтому мы повторно загрузили репозиторий с корректной лицензией и указанием авторства.
Главная страница Maldev Academy
Эта реализация использует две техники, рассмотренные в недавних обновлениях курса Maldev Academy:
Tampered Syscalls Via Hardware BreakPoints: используется для обхода хуков пользовательского режима с одновременной подменой аргументов вызываемого системного вызова.
Ghostly Hollowing: гибридная техника, сочетающая Process Hollowing и Process Ghosting.
Все системные вызовы в этой реализации выполняются через макрос TAMPER_SYSCALL. Этот макрос вызывает функцию StoreTamperedSyscallParms, чтобы:
syscall внутри стаба системного вызова NtQuerySecurityObject (то есть системного вызова-приманки) и установить по этому адресу аппаратную точку останова.При вызове макроса TAMPER_SYSCALL он подменяет первые четыре аргумента вызываемого системного вызова значениями NULL. Затем вызывается системный вызов NtQuerySecurityObject, что активирует установленную ранее точку останова.
Мы обрабатываем возникшее исключение, заменяя SSN системного вызова-приманки (NtQuerySecurityObject) на SSN реально вызываемого системного вызова (например, на SSN ZwAllocateVirtualMemory). Затем мы заменяем подменённые аргументы реальными. Эти шаги выполняются в VEH-функции ExceptionHandlerCallbackRoutine.
Получение PE-полезной нагрузки: Реализация получает PE-полезную нагрузку (mimikatz.exe) с диска. В идеале следует зашифровать полезную нагрузку и хранить её в секции ресурсов.
Создание пустого файла на диске: Создайте временный файл (.tmp) в каталоге $env:TMP. Позже в этот файл будет записана PE-полезная нагрузка.
Создание призрачной секции из временного файла: Призрачная секция создаётся вызовом ZwCreateSection, который создаёт секцию из файла .tmp, ожидающего удаления; после этого дескриптор файла закрывается, а файл удаляется с диска.
Создание удалённого процесса: С помощью WinAPI CreateProcess создаётся удалённый процесс, в который проецируется призрачная секция.
Патчинг ImageBaseAddress: Патчится элемент ImageBaseAddress структуры PEB, чтобы он указывал на спроецированную призрачную секцию, и выполняется входная точка PE-полезной нагрузки через перехват потока.
Огромное спасибо hasherezade за публикацию Ghostly Hollowing и все её остальные интересные техники инъекций.