Как скрыть процессы от антивирусов

Обойти антивирус

Скрывать процессы от антивирусов — важ­ная задача не толь­ко создателей вирусов (см. также Как ловят создателей вирусов), но и пен­тесте­ров (этичных хакеров). Для сокрытия процессов сущес­тву­ют раз­личные способы. В этой статье рас­смот­рим два из них: Herpaderping и Ghosting. О дру­гих техниках — Hollowing и Doppelgänging — поговорим в отдельной статье.

Еще по теме: Как создать и скрыть вирус для Windows

Как скрыть процессы от антивирусов

В этом примере я буду использовать Microsoft Defender и Mimikatz.

Статья написана в образовательных целях, для обучения этичных хакеров. При демонстрации работы, были использованы наши собственные устройства. Использование техник обхода антивирусов на чужих устройствах без надлежащего письменного разрешения, является незаконным и будет расцениваться, как уголовное преступление. Ни редак­ция spy-soft.net, ни автор не несут ответс­твен­ность за ваши действия.

Особенности процессов

Как анти­вирусы узна­ют, что в ОС был запущен какой‑то про­цесс?

Microsoft позволяет раз­работ­чикам анти­вирус­ного ПО получать с помощью API все нуж­ные им события нап­ример:

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

Прикол в том, что уве­дом­ление CreateProcessNotify — совсем не про соз­дание про­цес­са. Callback полетит в тот момент, ког­да внут­ри данного про­цес­са воз­никнет пер­вый поток (thread). В промежуток, ког­да про­цесс был соз­дан и анти­вирус узнал об этом творчески используется зло­умыш­ленни­ками.

Важно понимать

Для тех, кто не в теме, напомню, что ис­полня­емый файл — это не про­цесс. Исполня­емый файл может быть свя­зан со различными про­цес­сами (откройте Task Manager и посмотрите, сколь­ко и какие про­цес­сы свя­заны, нап­ример, с svchost.exe). Все про­цессы всегда будут свя­заны с каким‑нибудь PE-фай­лом (.dll, .exe и т.д). А про­цес­сы пре­дос­тавля­ют необходимые ресур­сы, для запуска и выпол­нения приложений.

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

По­ток — это базовая еди­ница, в которой ОС выделя­ет про­цес­сорное вре­мя. Поток может выпол­нять любую часть кода про­цес­са, вклю­чая час­ти, которые в конкретный момент выпол­няют­ся дру­гим потоком.

Создание процесса

Рас­смот­рим этапы создания про­цес­са:

  1. В начале для исполня­емо­го фай­ла мы получа­ем дес­крип­тор (handle), который запус­каем, нап­ример таким образом:
  2. Соз­дается image section нап­ример:

    Image section пред­став­ляет собой осо­бый раз­дел и слу­жит для отоб­ражения фай­ла (или час­ти фай­ла) в память. Раз­дел соот­ветс­тву­ет PE-фай­лам и может быть соз­дан толь­ко в них.
  3. Соз­дается про­цесс в image section нап­ример:
  4. Наз­нача­ются аргу­мен­ты и перемен­ные сре­ды нап­ример:
  5. Соз­дается поток для выпол­нения про­цес­са нап­ример:

Имейте ввиду: про­цес­сы запус­кают­ся из исполня­емых фай­лов, но информа­ция внут­ри исполня­емо­го фай­ла может менять­ся отно­ситель­ного того, что находит­ся в image section (так как она кеширу­ется memory manager).

Сканирование процесса в поисках вредоноса

Как мы уже говорили, анти­виру­сное ПО может получать уве­дом­ления о событи­ях соз­дания про­цес­сов и потоков:

  • PsSetCreateProcessNotifyRoutineEx
  • PsSetCreateThreadNotifyRoutineEx

Выг­лядит это дело как-то так:

Из инте­рес­ного: FILE_OBJECT соот­ветс­тву­ет дес­крип­тору NtCreateSection. Если же мы взгля­нем на API NtCreateProcess, то уви­дим там тоже дес­крип­тор раз­дела, а не фай­ла.

Отличия двух техник

Для прос­тоты я свел отли­чия опи­сыва­емых в статье тех­ник в таб­лицу.

Тех­ника Дей­ствия
Hollowing map → modify section → execute
Doppelgänging transact → write → map → rollback → execute
Herpaderping write → map → modify → execute → close
Ghosting delete pending → write → map → close(delete) → execute

Herpaderping

Нам пот­ребу­ется mimikatz.exe, целевой исполня­емый файл (тут мож­но ука­зывать что угод­но, у нас это будет hack.exe) и любой файл, не вызыва­ющий подоз­рений у анти­вирус­ных прог­рамм. Раз­берем методи­ку

Herpaderping по шагам.

  1. Write. Соз­даем и откры­ваем hack.exe, копиру­ем в него mimikatz.exe, дес­крип­тор не зак­рыва­ем.
  2. Map. Соз­даем image section и мапим содер­жимое в память.
  3. Modify. Соз­даем про­цесс с дес­крип­тором ранее соз­данно­го раз­дела. Пос­ле это­го меня­ем содер­жимое фай­ла hack.exe, копируя туда что‑нибудь легитим­ное. Пом­ните важ­ный момент из раз­дела про соз­дание про­цес­са? Так вот это он и есть: с это­го момен­та то, что у нас в памяти, и то, что хра­нит­ся в фай­ле, отли­чает­ся.
  4. Execute. Соз­даем initial thread. Толь­ко сей­час анти­виру­су летит process creation callback. Раз­личие содер­жимого в фай­ле и в памяти сво­дит с ума Defender, он не может понять, мож­но ли раз­решать выпол­нение это­го про­цес­са.
  5. Close. Зак­рыва­ем откры­тый дес­крип­тор.

Herpaderping на практике

За все­ми дей­стви­ями будет наб­людать пол­ностью обновлен­ный Microsoft Defender. Естес­твен­но, если дроп­нуть на диск Mimikatz или пей­лоад из MSFvenom в «чис­том» виде, он тут же будет обна­ружен анти­виру­сом. Нам нуж­но обой­ти ста­тичес­кий ана­лиз, но этот этап мы сей­час рас­смат­ривать не будем.

Microsoft Defender
Microsoft Defender

Клонирум про­ект из GitHub и собира­ем его:

Клонируем Herpaderping
Клонируем Herpaderping

Вы­пол­няем коман­ду:

Вы­пол­нение ProcessHerpaderping.exe
Вы­пол­нение ProcessHerpaderping.exe

Как мы видим, все выпол­нилось успешно, Defender не сре­аги­ровал. Давайте взгля­нем, что покажет нам ProcessHacker.

Herpaderping ProcessHacker
Herpaderping ProcessHacker

У нас исполня­ется не mimikatz.exe, а hack.exe. А еще у нашего при­ложе­ния hack.exe есть сер­тификат, выдан­ный Microsoft.

У нашего при­ложе­ния есть сер­тификат
У нашего при­ложе­ния есть сер­тификат

Ну а сам hack.exe спо­кой­но лежит на рабочем сто­ле.

Ра­бочий стол
Ра­бочий стол

Этот при­ем работа­ет не толь­ко с Mimikatz: давайте проб­росим себе сес­сию Meterpreter. Для это­го сге­нери­руем полез­ную наг­рузку и запус­тим лис­тенер:

Создание пейлоада

Вы­пол­ним те же дей­ствия и гля­нем, при­лете­ла ли сес­сия.

Вы­пол­нение met.exe
Вы­пол­нение met.exe
По­лучен­ная сес­сия
По­лучен­ная сес­сия

Получи­лось!

Ghosting

Для исполь­зования это­го метода нам опять же пот­ребу­ется наш исходный файл (mimikatz.exe) и целевой исполня­емый файл. В качес­тве таково­го мож­но ука­зывать что угод­но, у нас это будет уже при­выч­ный нам hack.exe. Как и в прош­лый раз, раз­берем тех­нологию по шагам.

  1. Delete pending. Delete Pending — это сос­тояние, при котором файл еще не уда­лен, потому что дес­крип­тор на него открыт. Как толь­ко дес­крип­тор зак­роет­ся, файл уда­лит­ся. Соз­даем файл и перево­дим в сос­тояние delete-pending, исполь­зуя NtSetInformationFile (FileDispositionInformation). Исполь­зование FILE_DELETE_ON_CLOSE не уда­лит файл.
  2. Write. Копиру­ем наш исходный исполня­емый файл в соз­данный файл. Содер­жимое не сох­раня­ется, так как файл находит­ся в сос­тоянии delete-pending. Так­же это сос­тояние бло­киру­ет попыт­ки открыть файл извне.
  3. Map. Соз­даем image section и мапим содер­жимое в память.
  4. Сlose(delete). Зак­рыва­ем дес­крип­тор, файл уда­ляет­ся.
  5. Execute. Соз­даем про­цесс с дес­крип­тором ранее соз­данно­го раз­дела. Соз­даем initial thread. В этот момент анти­виру­су нап­равля­ется process creation callback, но файл уже уда­лен. Попыт­ка открыть его завер­шится с ошиб­кой STATUS_FILE_DELETED. Если поп­робовать открыть файл до того, как он будет уда­лен, получите ту же самую ошиб­ку.

Ghosting на практике

Клонирум про­ект и собира­ем. Либо кача­ем уже соб­ранный про­ект из GitHub.

Вы­пол­няем коман­ду:

Вы­пол­нение proc_ghost64.exe
Вы­пол­нение proc_ghost64.exe

Как мы видим, сно­ва все выпол­нилось успешно и Defender не сре­аги­ровал. Теперь давайте оце­ним информа­цию, которую пре­дос­тавит нам ProcessHacker.

Скрыть процессы от антивирусов. ProcessHacker
ProcessHacker

Сто­ит обра­тить вни­мание на еще один инс­тру­мент, который реали­зует дан­ную тех­нику, — KingHamlet. Он так­же реали­зует воз­можнос­ти крип­тования исходно­го пей­лоада:

KingHamlet
KingHamlet

А process ghosting исполь­зует­ся на сле­дующем шаге:

Скрыть процесс от антивируса. KingHamlet
KingHamlet

KingHamlet так­же отра­ботал успешно. В ProcessHacker мы уви­дим сле­дующее.

ProcessHacker пос­ле при­мене­ния KingHamlet
ProcessHacker пос­ле при­мене­ния KingHamlet

Заключение

По­веде­ние Microsoft по отно­шению к опи­сан­ным в этой статье методам не до кон­ца понят­но. То ком­пания заяв­ляет, что выпус­тила зак­рыва­ющий патч, то Microsoft Security Response Center (MSRC) неожи­дан­но сооб­щает: проб­лема не соот­ветс­тву­ет кри­тери­ям, тре­бующим выпус­тить обновле­ние безопас­ности или инс­трук­ции по пре­дот­вра­щению атак.

Но как видим, пока эти механиз­мы работа­ют без каких‑либо труд­ностей, глав­ное — обой­ти ста­тичес­кий ана­лиз.

Полезные ссылки:

Дима (Kozhuh)

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

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