Как скрыть процессы от антивирусов. Часть 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).
Сканирование процесса в поисках вредоноса
Как мы уже говорили, антивирусное ПО может получать уведомления о событиях создания процессов и потоков:
Выглядит это дело как-то так:
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) и любой файл, не вызывающий подозрений у антивирусных программ. Разберем методику
- 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 спокойно лежит на рабочем столе.