Найти тему

Process Ghosting

Оглавление
 Изображение: Lukas (Pexels)
Изображение: Lukas (Pexels)

В этой статье пойдет речь о новом методе атак под названием Process Ghosting. Он потенциально может использоваться хакерами для обхода защиты и выполнения вредоносного кода на системах под управлением Windows.

Введение

Недавно в сети был опубликован пост, в котором автор подробно рассказывает о методе, с помощью которого атакующий может записать вредоносный код на диск таким образом, чтобы его было сложно сканировать или удалить. Process Ghosting позволяет хакеру запускать уже удаленные исполняемые файлы, по сути, превращая их в «призраков».

Подготовка к атаке и «дыры» в защите Windows

В экосистеме Windows разработчики антивирусных решений используют различные API (например, PsSetCreateProcessNotifyRoutineEx), которые сообщают программе о выполнении определенных процессов. Однако сигнал о любых действиях в системе отправляется не при открытии файла, а при выполнении программой первой операции. Следовательно, промежуток времени между созданием процесса и отправкой уведомления о его выполнении антивирусному решению является той «дырой» в защите, благодаря которой хакеры способны применить новый метод атак Process Ghosting.

Исполняемые файлы, процессы и потоки

Исполняемый файл — это скомпилированный файл, содержащий внутри себя программу, которая должна быть запущена на ПК жертвы. Исполняемые файлы могут выполнять несколько функций, и каждая из них называется процессом.

Процесс (простыми словами) — это исполняемая программа. Каждый процесс связан с определенным PE (.exe, .dll). Может существовать несколько процессов, присущих одному исполняемому файлу. Их можно просмотреть по следующему пути: «Task Manager -> Details».

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

  • выполнение (занимает процессор);
  • готовность (процесс временно приостановлен, чтобы позволить выполняться другому процессу);
  • ожидание (процесс не может быть запущен по своим внутренним причинам, например, ожидая операции ввода/вывода).

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

Процесс может быть создан в Windows с помощью функции «CreateProcess» или «NtCreateUserProcess». Данная функция представляет собой комбинацию индивидуально изменяемых иных функций, которые могут взаимодействовать с дескрипторами, потоками, Image Section.

Например, процесс «CreateProcess (lpApplicationName)» определяет, какое приложение следует запустить.

Process Ghosting

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

  • Дескрипторы дают возможность ссылаться на окна, объекты ядра, графические объекты. Они не только содержат информацию о ресурсе, но и предоставляют права доступа.

int fh = open(“/etc/passwd”, O_RDWR);

*где fh — это дескриптор файла. Когда пользователь открыл файл с помощью функции «open()», он вернул дескриптор переменной fh. Теперь его можно использовать для выполнения следующих функций:

  • fh.read()
  • fh.append()
  • fh.close()

А также файл, к которому обращается fh, не может быть прочитан, записан или выполнен любым другим дескриптором (или любым другим процессом). Функция «fh.close()» закроет дескриптор файла, т.е. доступа к файлу у пользователя больше не будет.

  • Image Section представляет собой раздел, который подходит для PE-файлов, и может быть создан только из файлов PE (.exe, .dll).
  • Delete_Pending State. Подобно состоянию чтения, записи, удаления, которое может быть актуальным для файла, Delete_Pending — это состояние, при котором файл еще не удален. Он еще не удален, потому что дескриптор, возможно, оставил его активным. Как только дескриптор закроется, файл будет удален. В состоянии Delete_Pending другие процессы не могут взаимодействовать с файлом.

Таким образом, применение метода Process Ghosting выглядит примерно так:

  • Нужно создать файл с помощью функции «NtCreateFile()». Таким образом, у пользователя появляется вредоносная программа и дескриптор файла. Например: «hFile = NtCreateFile(C:\Users\a_cha\Desktop\random.exe)».

*hFile – это дескриптор для этого файла.

  • Следует перевести данный файл в состояние delete_pending. Это можно сделать с помощью функции «NtSetInformationFile()». При использовании флага «FileDispositionInformation» файл будет переведен в состояние ожидания удаления. Можно также ввести «filefile» для выполнения этой задачи в файле.
-2
  • Пользователь добавит полезную нагрузку (вредоносное ПО) в этот вновь созданный файл. Поскольку он находится в состоянии delete_pending, как только файл закроется, данные исчезнут. Однако пользователь сделает следующий шаг перед этим.
  • Image Section создается с помощью функции «NtCreateSection(hFile, SEC_IMAGE)». Это можно сделать следующим образом: «section = NtCreateSection(HFile, SEC_IMAGE)». Вот почему дескриптор был необходим, так как «NtCreateSection()» принимает дескриптор файла в качестве входных данных. Теперь можно безопасно удалить его.
  • Пользователь удаляет недавно созданный дескриптор. Это также приведет к удалению соответствующего файла (вредоносного ПО) с диска, однако его копия все еще останется в Image Section.
  • Необходимо создать новый процесс в Image Section. Поскольку код существует в виртуальной памяти, новый процесс может быть создан с помощью «NtCreateProcessEx(section)». Это будет сделано следующим образом: «hProcess = NtCreateProcessEx(hSection)».
  • Пользователь назначит аргументы процесса и переменные среды. Это важно, так как без аргументов процесса и переменных среды ОС не будет выполнять процесс, а выполнение кода встанет на паузу.
  • Создается поток для выполнения процесса. Это можно сделать с помощью функции «CreateThread()» и указать начальный адрес выполняемого процесса.

Антивирус блокирует файл, как только создается поток для выполнения вредоносной программы. Поскольку поток создается после удаления файла, антивирус никогда не будет вызываться. Любые попытки антивируса открыть этот файл приведут к ошибке «STATUS_FILE_DELETED».

IkerSaint подтвердил эффективность концепции данного метода атак, создав инструмент под названием KingHamlet. Его можно скачать здесь. Этот инструмент сначала шифрует файл, а затем выполняет атаку.

Давайте наконец взглянем на практический пример осуществления Process Ghosting.

Process Ghosting с помощью SharpGhosting

Основываясь на методологии, описанной выше, многие POC появились после публикации поста в сети. В данном практическом примере пользователь будет реализовать процесс Process Ghosting на C#, опираясь на информацию от Wrath. Прежде чем он попробует это сделать, важно, чтобы у пользователя была более старая версия Windows 10, поскольку Microsoft исправила эту «дыру» в безопасности в новых версиях своей ОС.

Читатели могут найти код в репозитории github здесь.

-3

Можно скомпилировать этот исходный код с помощью следующей команды:

C:\Windows\Microsoft.NET\Framework64\v3.5\csc.exe /out:SharpGhost.exe /unsafe C:\ProcessGhosting\SharpGhosting-main\*.cs

Если необходимо, следует изменить путь по своему усмотрению. Кроме того, пользователю понадобится .NET Framework (v3.5), чтобы скомпилировать его самостоятельно.

-4

Чтобы упростить задачу и избавить читателей от хлопот с компиляцией, был создан EXE-файл, который можно скачать здесь. Как только читатели скачают данный файл, можно продолжить демонстрацию практического примера. Как видно на картинке, Защитник Windows запущен и работает исправно.

-5

Теперь пользователь запускает Process Ghosting, используя следующую команду:

.\SharpGhost.exe -real <path>\name.exe

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

.\SharpGhost.exe -real C:\ProcessGhosting\mimikatz.exe

Здесь я запускаю экземпляр mimikatz, который обнаруживается как вредоносное ПО любым мыслимым антивирусным решением. Цель состоит в том, чтобы обойти обнаружение антивируса во время выполнения.

.\SharpGhost.exe -real C:\ProcessGhosting\mimikatz.exe

Эта команда запускает mimikatz с использованием метода Process Ghosting. Пользователь может открыть диспетчер задач и просмотреть там детали запущенного им процесса. У этого процесса нет имени, потому что соответствующий EXE-файл не существует.

-6

Защитник Windows не смог обнаружить mimikatz как вредоносное ПО во время его запуска. Далее файл будет удален, что приведет к тому, что антивирусное ПО не сможет обнаружить опасную программу.

-7

Заключение

В статье было представлено простое теоретическое объяснение подробных и различных функций кодирования, используемых при запуске атак с использованием PE-инъекций с Process Ghosting. Вскоре после того, как этот метод был обнаружен, Microsoft выпустила апдейт для ОС для устранения этой проблемы. Осуществить подобного рода атаки невозможно в последних версиях Windows 10 и Windows 11, однако более старые версии ОС все еще используются в некоторых организациях и на домашних ПК. Следовательно, чтобы избежать неприятностей, следует постоянно обновлять свою оперативную систему и следить за выходом апдейтов.

Автор переведенной статьи: Harshit Rajpal.

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

Больше интересного материала на cisoclub.ru. Подписывайтесь на нас: Facebook | VK | Twitter | Instagram | Telegram | Дзен | Мессенджер | ICQ New | YouTube | Pulse.