May 30, 2022

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

#Обучение

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

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

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

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

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

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

PsSetCreateProcessNotifyRoutineEx

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

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

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

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

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

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

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

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

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

hFile = CreateFile(“C:\Windows\System32\svchost.exe”)

Соз­дается image section нап­ример:

hSection = NtCreateSection(hFile, SEC_IMAGE)

Image section пред­став­ляет собой осо­бый раз­дел и слу­жит для отоб­ражения фай­ла (или час­ти фай­ла) в память. Раз­дел соот­ветс­тву­ет PE-фай­лам и может быть соз­дан толь­ко в них.

Соз­дается про­цесс в image section нап­ример:

hProcess = NtCreateProcessEx(hSection)

Наз­нача­ются аргу­мен­ты и перемен­ные сре­ды нап­ример:

CreateEnvironmentBlock/NtWriteVirtualMemory

Соз­дается поток для выпол­нения про­цес­са нап­ример:

NtCreateThreadEx

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

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

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

  • PsSetCreateProcessNotifyRoutineEx
  • PsSetCreateThreadNotifyRoutineEx

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

typedef struct _PS_CREATE_NOTIFY_INFO {
  SIZE_T Size;
  union {
    ULONG Flags;
    struct {
      ULONG FileOpenNameAvailable : 1;
      ULONG IsSubsystemProcess : 1;
      ULONG Reserved : 30;
    };
  };
  HANDLE ParentProcessId;
  CLIENT_ID CreatingThreadId;
  struct _FILE_OBJECT *FileObject;
  PCUNICODE_STRING ImageFileName;
  PCUNICODE_STRING CommandLine;
  NTSTATUS CreationStatus;
} PS_CREATE_NOTIFY_INFO, *PPS_CREATE_NOTIFY_INFO;

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

NTSYSCALLAPI
NTSTATUS
NTAPI
NtCreateProcess(
  _Out_ PHANDLE ProcessHandle,
  _In_ ACCESS_MASK DesiredAccess,
  _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,
  _In_ HANDLE ParentProcess,
  _In_ BOOLEAN InheritObjectTable,
  _In_opt_ HANDLE SectionHandle,
  _In_opt_ HANDLE DebugPort,
  _In_opt_ HANDLE ExceptionPort
  );

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

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

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 в «чис­том» виде, он тут же будет обна­ружен анти­виру­сом. Нам нуж­но обой­ти ста­тичес­кий ана­лиз, но этот этап мы сей­час рас­смат­ривать не будем.

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

git clone https://github.com/jxy-s/herpaderping.git
cd .\herpaderping\
git submodule update --init –recursive

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

ProcessHerpaderping.exe mimikatz.exe hack.exe lsass.exe

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

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

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

Продолжение следует...

Источник