Раз­личные спо­собы скры­тия работы сво­его кода пос­тоян­но будора­жат хакер­ские умы. В этой статье я покажу, как запус­кать про­цес­сы при помощи тех­ники Process Ghosting, а затем раз­берем, как работа­ют сис­темы обна­руже­ния вре­донос­ного кода.

Как‑то я уже рас­ска­зывал об одной подоб­ной тех­нике под наз­вани­ем Process Doppelganging. С того вре­мени появи­лись дру­гие, более сов­ремен­ные тех­ники запус­ка кода под прик­рыти­ем легитим­ных про­цес­сов.

Process Ghosting — одна из наибо­лее акту­аль­ных в дан­ный момент тех­ник. С ее помощью зло­умыш­ленник может орга­низо­вать запуск сво­его кода из уже уда­лен­ного фай­ла. Этот при­ем час­то исполь­зует­ся в боевой мал­вари. Но что­бы понять, как он работа­ет, сна­чала раз­берем мат­часть.

warning

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

В статье будут исполь­зовать­ся фун­кции NTAPI. Напоми­наю, что их нель­зя прос­то так вызывать, нуж­но получать их динами­чес­ки из ntdll.dll. Один из спо­собов сде­лать это я показы­вал в статье о Process Doppelganging во врез­ке «Как поль­зовать­ся недоку­мен­тирован­ными NTAPI».

 

Как работает мониторинг EDR (Endpoint Detection and Response)

Средс­тва 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 (CreateProcessCreateProcessInternalWNtCreateUserProcess) или RtlCreateUserProcess (RtlCreateUserProcessExRtlpCreateUserProcessNtCreateUserProcess). То есть, гру­бо говоря, даже если ты пишешь код, исполь­зуя WinAPI, что ред­кость само по себе, то все рав­но в ито­ге будет выз­вана «пра­виль­ная» фун­кция NtCreateUserProcess, удов­летво­ряющая тре­бова­ниям средств EDR.

Но все меня­ется, если про­цесс соз­дает­ся при помощи фун­кции NtCreateProcessEx. Она ста­рее NtCreateUserProcess и оставле­на в Windows для обратной сов­мести­мос­ти. Дело в том, что эта фун­кция поз­воля­ет соз­давать про­цесс в более «руч­ном» режиме, где мож­но вли­ять на сам про­цесс соз­дания и запус­ка потоков из поль­зователь­ско­го режима. В том чис­ле это воз­можно, если под­менять или уда­лять фай­лы и про­цес­сы или уста­нав­ливать нуж­ные фла­ги, что мы, собс­твен­но, и сде­лали. Мы приш­ли к тому, что наш исполня­емый код остался толь­ко в памяти и избе­жал ска­ниро­вания, потому что был уже уда­лен с жес­тко­го дис­ка до соз­дания его пер­вого потока.

 

Кодим!

Те­оре­тичес­кая кар­тина нам ясна, нач­нем прог­рамми­ровать. Давай пос­мотрим, что нуж­но, что­бы реали­зовать Process Ghosting.

Продолжение доступно только участникам

Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

Вариант 2. Открой один материал

Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.


  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    0 комментариев
    Межтекстовые Отзывы
    Посмотреть все комментарии