Инъекция в сторонние процессы для обхода EDR

Инъекция в сторонние процессы обход EDR

В этой статье мы рассмотрим технику внедрения кода в сторонний процесс, известную как Threadless Injection. На момент написания материала данный метод успешно работал на изолированной от сети виртуальной машине с операционной системой Windows 11 23H2 x64, где были активированы встроенные средства защиты. Threadless Injection позволяет инъецировать код в чужой процесс без создания нового потока выполнения, что может обходить некоторые механизмы безопасности.

Еще по теме: Фреймворки для обхода антивируса и EDR

Инъекция в сторонние процессы для обхода EDR

Мы рассмотрим альтернативный подход к традиционной инъекции шелл-кода, который может помочь обойти некоторые средства защиты. Вместо прямого использования функций WinAPI, таких как CreateRemoteThread или NtQueueApcThread, мы можем перехватить вызовы экспортируемых функций из динамических библиотек (DLL), загруженных в процесс-цель.

Основные шаги:

  1. Получить дес­крип­тор про­цес­са ( OpenProcess\NtOpenProcess).
  2. Вы­делить память для полез­ной наг­рузки ( VirtualAllocEx\NtMapViewOfSection).
  3. За­писать полез­ную наг­рузки в эту память ( WriteProcessMemory\Ghost Writing).
  4. Вы­пол­нить шелл‑код ( CreateRemoteThread\NtQueueApcThread).

Для исследования целевого приложения можно использовать программу API Monitor, которая отслеживает вызовы WinAPI в реальном времени. Это позволит определить регулярно вызываемые функции и соответствующие им DLL.

Инъекция в сторонние процессы для обхода EDR
Прос­мотр вызыва­емых фун­кций WinAPI с помощью API Monitor

Такой подход, известный как Threadless Injection, может помочь обойти некоторые средства защиты, так как он не использует функции, обычно связанные с инъекцией кода.

Следует соблюдать осторожность и использовать эту технику только в рамках легального тестирования на проникновение.

Мы обоз­начили шаги, которые нуж­но сде­лать для реали­зации Threadless Injection, теперь приш­ло вре­мя реали­зовать каж­дый шаг в коде.

Сна­чала нам нуж­но получить хендл целево­го про­цес­са по его име­ни:

Да­лее заг­ружа­ем выб­ранную динами­чес­кую биб­лиоте­ку, содер­жащую в экспор­те фун­кцию API, с которой мы хотим порабо­тать. Пусть этой биб­лиоте­кой будет kernelbase.dll.

Те­перь получа­ем адрес нашей API в DLL:

Ищем code cave — область, куда мож­но записать наши дан­ные:

Те­перь пой­дут манипу­ляции с трам­пли­ном и дру­гая ариф­метика. Что­бы было понят­но, обоз­начим трам­плин и пей­лоад. Пей­лоад — обыч­ный, который встре­чает­ся пов­сюду в демонс­тра­цион­ных PoC и запус­кает каль­кулятор. Что каса­ется трам­пли­на, в него вхо­дит балан­сиров­ка сте­ка, сох­ранение и вос­ста­нов­ление регис­тров пос­ле вызова пей­лоада:

Да­лее чита­ем начало экспор­тиру­емой из DLL фун­кции и нас­тра­иваем при помощи получен­ных дан­ных трам­плин:

Те­перь нас­тра­иваем память и даем ей пра­ва PAGE_EXECUTE_READWRITE для уста­нов­ки хука:

Соз­даем хук ( call) в экспортной фун­кции ата­куемой биб­лиоте­ки и нас­тра­иваем его:

Да­лее закан­чива­ем записы­вать трам­плин и полез­ную наг­рузку, а затем меня­ем атри­буты целевой памяти сна­чала на PAGE_EXECUTE_READWRITE, потом обратно на PAGE_EXECUTE_READ, ког­да работа будет выпол­нена:

Пос­ле выпол­нения всех шагов оста­ется толь­ко ждать, пока при­ложе­ние вызовет про­пат­ченную фун­кцию. Но ждать дол­го не при­дет­ся, мы ведь исполь­зовали монитор фун­кций WinAPI и убе­дились, что API, которая под­вер­глась модифи­кации, вызыва­ется регуляр­но.
Выводы

Се­год­ня ты узнал, как реали­зует­ся тех­ника внед­рения и исполне­ния кода Threadless Injection, то есть без явно­го вызова фун­кций соз­дания потока. Это лома­ет при­выч­ный шаб­лон инжектов, что поз­волит нашему уйти от детек­та и про­дол­жить работать.

Ко­неч­но, написан­ный выше код — это все­го лишь демонс­тра­ция и некий шаб­лон, который мож­но зна­читель­но улуч­шать, что­бы добить­ся еще более надеж­ной невиди­мос­ти. Кро­ме того, эта тех­ника не панацея и не сереб­ряная пуля, которая сде­лает код пол­ностью скры­тым: все тех­ники (инжекта, вызова API, обфуска­ции кода и про­чие) нуж­но исполь­зовать сов­мес­тно, а не по оди­ноч­ке, тог­да у ред­тимеров будет шанс победить!

ПОЛЕЗНЫЕ ССЫЛКИ:

Дима (Kozhuh)

Эксперт в кибербезопасности. Работал в ведущих компаниях занимающихся аналитикой компьютерных угроз. Анонсы новых статей в Телеграме.

Добавить комментарий