Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Различные способы скрытия работы своего кода постоянно будоражат хакерские умы. В этой статье я покажу, как запускать процессы при помощи техники Process Ghosting, а затем разберем, как работают системы обнаружения вредоносного кода.
Как‑то я уже рассказывал об одной подобной технике под названием Process Doppelganging. С того времени появились другие, более современные техники запуска кода под прикрытием легитимных процессов.
Process Ghosting — одна из наиболее актуальных в данный момент техник. С ее помощью злоумышленник может организовать запуск своего кода из уже удаленного файла. Этот прием часто используется в боевой малвари. Но чтобы понять, как он работает, сначала разберем матчасть.
warning
Статья имеет ознакомительный характер и предназначена для специалистов по безопасности, проводящих тестирование в рамках контракта. Автор и редакция не несут ответственности за любой вред, причиненный с применением изложенной информации. Распространение вредоносных программ, нарушение работы систем и нарушение тайны переписки преследуются по закону.
В статье будут использоваться функции NTAPI. Напоминаю, что их нельзя просто так вызывать, нужно получать их динамически из ntdll.dll
. Один из способов сделать это я показывал в статье о Process Doppelganging во врезке «Как пользоваться недокументированными NTAPI».
Средства EDR часто мониторят создание процессов при помощи разных функций, например вот этих:
Файл сканируется при запуске, а точнее — при создании процесса. Вот прототипы перечисленных функций:
NTSTATUS PsSetCreateProcessNotifyRoutine( // Callback-функция обработчика [in] PCREATE_PROCESS_NOTIFY_ROUTINE NotifyRoutine, [in] BOOLEAN Remove);NTSTATUS PsSetCreateProcessNotifyRoutineEx( // Callback-функция обработчика [in] PCREATE_PROCESS_NOTIFY_ROUTINE_EX NotifyRoutine, [in] BOOLEAN Remove);NTSTATUS PsSetCreateProcessNotifyRoutineEx2( // Callback-функция обработчика [in] PSCREATEPROCESSNOTIFYTYPE NotifyType, [in] PVOID NotifyInformation, [in] BOOLEAN Remove);
Обрати внимание: сканирование происходит именно при запуске процесса, а не в каких‑то других случаях. Разумеется, делается это ради экономии ресурсов, иначе сканирование всех файлов в системе заняло бы очень много времени, особенно при операциях записи.
Для EDR все идет по плану, если для создания процесса используется функция NtCreateUserProcess
(современный NTAPI, доступный со времен Windows Vista), потому что она берет на себя почти всю работу по созданию процесса и первого потока. Все действия происходят в ее контексте: создается первый поток процесса, производится вызов колбэков из PsSetCreateProcessNotifyRoutineEx
и так далее. На все это сложно как‑то повлиять с нашей стороны. И именно при таком сценарии эффективны защитные средства EDR, потому что они рассчитывают, что процесс будет создан именно через NtCreateUserProcess
.
Этот вызов NTAPI используют и стандартные API типа CreateProcess
(CreateProcess
→ CreateProcessInternalW
→ NtCreateUserProcess
) или RtlCreateUserProcess
(RtlCreateUserProcessEx
→ RtlpCreateUserProcess
→ NtCreateUserProcess
). То есть, грубо говоря, даже если ты пишешь код, используя WinAPI, что редкость само по себе, то все равно в итоге будет вызвана «правильная» функция NtCreateUserProcess
, удовлетворяющая требованиям средств EDR.
Но все меняется, если процесс создается при помощи функции NtCreateProcessEx
. Она старее NtCreateUserProcess
и оставлена в Windows для обратной совместимости. Дело в том, что эта функция позволяет создавать процесс в более «ручном» режиме, где можно влиять на сам процесс создания и запуска потоков из пользовательского режима. В том числе это возможно, если подменять или удалять файлы и процессы или устанавливать нужные флаги, что мы, собственно, и сделали. Мы пришли к тому, что наш исполняемый код остался только в памяти и избежал сканирования, потому что был уже удален с жесткого диска до создания его первого потока.
Теоретическая картина нам ясна, начнем программировать. Давай посмотрим, что нужно, чтобы реализовать Process Ghosting.
Источник: xakep.ru