Введение
Габриэль Ландау опубликовал здесь пост об Elastic Security, в котором рассказывается о методе, с помощью которого было обнаружено, что обход антивируса возможен. Этот метод связан с созданием процесса-призрака, термин, используемый автором для описания механизма удаления полезной нагрузки с диска перед его запуском, что, по сути, делает его призраком.
Создание процесса и брешь в безопасности
В экосистеме Windows разработчики антивирусных решений вызывают API-интерфейсы (например, PsSetCreateProcessNotifyRoutineEx), которые могут информировать их антивирусное решение о выполнении определенного процесса, однако обратные вызовы отправляются не при выполнении процесса, а при первом потоке в этом процессе который выполняется. Следовательно, именно в этом промежутке между созданием процесса и отправкой уведомления об его создании антивирусному решению злоумышленники могут реализовать дублирование процесса.
Исполняемые файлы, процессы и потоки
Исполняемый файл — это скомпилированный файл, содержащий программу, которая должна быть запущена машиной. Исполняемые файлы могут выполнять несколько функций, и когда каждая из этих функций запускается, она называется процессом.
Проще говоря, процесс — это исполняемая программа. Каждый процесс связан с определенным PE (exe, dll и т.д.). Также может быть несколько процессов из одного исполняемого файла. Это можно посмотреть в Диспетчере задач -> Подробности.
Поток — это основная единица процесса, которой ОС выделяет процессорное время.
Поток может выполнять любую часть кода процесса. В процессе существует несколько потоков. Многопоточность означает, что несколько потоков выполняют одну и ту же часть кода процесса. Windows поддерживает многозадачность, поэтому может быть создано столько потоков, сколько процессоров доступно для их одновременного запуска. Пороцесс может иметь три состояния: работает, готово и заблокировано.
Создание процесса
Процесс можно создать в Windows с помощью функции CreateProcess или NtCreateUserProcess. Эта функция представляет собой комбинацию отдельно изменяемых других функций, которые могут работать с дескрипторами, секцией образов, потоками и т. д.
Например, CreateProcess (lpApplicationName) определяет, какое приложение выполнять.
Призрачный процесс
Теперь, когда мы рассмотрели основы, давайте разберемся, как обрабатывать призрака.
Это метод, при котором злоумышленник создает файл (вредоносное ПО), помечает его для удаления (состояние ожидания удаления), копирует/сопоставляет вредоносное ПО в памяти, закрывает дескриптор (что удаляет его с диска), затем создайте процесс из теперь безфайлового раздела. Прежде чем понять атаку, мы должны знать следующее:
Дескрипторы: используются для управления памятью, это ссылки на ресурс в пространстве ядра. Они не только содержат информацию о ресурсе, но и предоставляют права доступа.
int fh = open("/etc/passwd", O_RDWR);
fh — дескриптор файла.
Когда мы открывали файл с помощью функции open(), она возвращала дескриптор переменной fh. Теперь fh можно использовать для выполнения таких функций над файлом, как:
fh.read()
fh.append()
fh.close()
Кроме того, файл, к которому обращается fh, не может быть прочитан, записан или выполнен любым другим дескриптором (или любым другим процессом). fh.close() закроет дескриптор файла, т. е. к файлу не будет доступа.
Секция образа. Секция — это сопоставление файла с памятью. Секция образа — это специальный тип раздела, который соответствует файлам Portable Executable (PE) и может быть создан только из файлов PE (EXE, DLL и т. д.).
Состояние Delete_Pending: как и состояние чтения, записи, удаления, которое может существовать для файла, Delete_Pending — это состояние, в котором файл еще не удален.
Файл еще не удален, потому что дескриптор, возможно, оставил его открытым. Как только хэндл закроется, файл будет удален. Никакой другой процесс не может работать с этим файлом в состоянии Delete_Pending.
Таким образом, весь поток Process Ghosting выглядит так:
Шаг 1: Создайте файл с помощью функции NtCreateFile(). Это создаст предполагаемое вредоносное ПО.Кроме того, даст нам дескриптор файла.
например: hFile = NtCreateFile(C:\Users\a_cha\Desktop\random.exe)
hFile — это дескриптор этого файла.
Шаг 2: Поместите файл в состояние delete_pending. Это можно сделать с помощью функции NtSetInformationFile(). При использовании флага FileDispositionInformation файл будет переведен в состояние delete_pending. Мы можем использовать hFile для выполнения этой задачи в нашем файле.
Шаг 3: Запишите полезную нагрузку (вредоносное ПО) в этот вновь созданный файл.
Поскольку файл находится в состоянии ожидания удаления, как только он закроется, данные исчезнут. Но мы выполним Шаг 4 до того, как он исчезнет!
Шаг 4: Образ файла создается с помощью функции NtCreateSection(hFile, SEC_IMAGE).
Это можно сделать так: hSection = NtCreateSection(hFile, SEC_IMAGE). Вот почему наш дескриптор был необходим, так как NtCreateSection() принимает дескриптор файла в качестве входных данных. Теперь мы можем безопасно удалить наш дескриптор.
Шаг 5: Удалите наш только что созданный дескриптор. Это также удалит наш соответствующий файл (вредоносное ПО) с диска, однако его копия все еще существует в секции образов.
Шаг 6: Создайте новый процесс из секции образов. Поскольку код существует в виртуальной памяти, новый процесс можно создать с помощью NtCreateProcessEx(hSection). Это будет сделано следующим образом: hProcess = NtCreateProcessEx(hSection)
Шаг 7: Назначьте аргументы процесса и переменные среды. Это важно, так как без аргументов процесса и переменных среды ОС не будет выполнять процесс, и код останется в приостановленном состоянии.
Шаг 8: Создайте поток для выполнения в процессе. Это можно сделать с помощью функции CreateThread() и указания начального адреса выполняемого процесса.
Антивирусные коллбэки вызываются, и файл блокируется, как только создается поток для выполнения вредоносного ПО. Поскольку поток создается после удаления файла, антивирусные коллбэки никогда не будут вызываться. Любые попытки антивируса открыть этот файл вызовут ошибку STATUS_FILE_DELETED.
IkerSaint создал ПОК атаки с фантомным копированием процессов под названием "KingHamlet", которое можно скачать здесь (https://github.com/IkerSaint/KingHamlet/releases). Этот инструмент сначала шифрует файл, а затем выполняет атаку. Давайте запустим демо и посмотрим, как обрабатывать фантомные процессы.
Демо Process Ghosting с использованием SharpGhosting
Основываясь на методологии, описанной выше, многие POC всплыли на поверхность после публикации Габриэля в Elastic Security. В этой демонстрации мы будем использовать реализацию Process Ghosting на C#, разработанную Wra7h. Прежде чем вы попробуете её, важно, чтобы у вас была более старая версия Windows 10, поскольку Microsoft исправила обнаружение защитника после того, как этот метод появился в дикой среде. Если вы проводите пентест и находите более старую версию Windows 10, вы знаете, что делать!
Вы можете скачать код из репозитории github здесь (https://github.com/Wra7h/SharpGhosting).
Вы можете скомпилировать этот исходный код, используя следующую команду:
C:\Windows\Microsoft.NET\Framework64\v3.5\csc.exe /out:SharpGhost.exe /unsafe C:\ProcessGhosting\SharpGhosting-main\*.cs
Не стесняйтесь менять путь по своему усмотрению. Кроме того, вам понадобится .NET framework v3.5, чтобы скомпилировать его самостоятельно.
Чтобы упростить задачу и избавить вас от необходимости компиляции, я форкнул репозиторий и создал для вас EXE-файл, который можно скачать здесь. После того, как вы загрузили файл, мы можем продолжить нашу демонстрацию. Как видите, защитник у нас активен и работает.
Теперь мы можем запустить наш призрачный процесс с помощью следующей команды:
.\SharpGhost.exe -real <path>\name.exe
Здесь я запускаю экземпляр mimikatz, который определяется как вредоносное ПО любым мыслимым антивирусным решением. Цель состоит в том, чтобы обойти антивирусное обнаружение во время выполнения.
.\SharpGhost.exe -real C:\ProcessGhosting\mimikatz.exe
И эта команда запустит mimikatz как процесс-призрак. Вы можете открыть диспетчер задач и перейти к деталям, чтобы увидеть запущенный призрачный процесс. У этого процесса нет имени, поскольку связанный с ним EXE-файл не существует.
Как видите, во время работы защитник не определил mimikatz как вредоносное ПО. Это связано с тем, что при вызове обратных вызовов AV файл блокируется, как только создается поток для выполнения вредоносного ПО. Поскольку поток создается после удаления файла, антивирусные коллбэки никогда не будут вызываться.
Вывод
В статье было представлено простое для понимания теоретическое объяснение мельчайших деталей и различных функций, используемых при запуске атак внедрения PE с помощью Process Ghosting. Вскоре после того, как эта техника была выпущена, Microsoft выпустила патч для устранения этой проблемы. Эта техника больше не работает в последних версиях Windows 10 и Windows 11, однако более старые версии Windows 10 все еще используются в организациях и домашних системах, и умный злоумышленник может этим воспользоваться.
Следовательно, нужно всегда обновлять свои системы и устанавливать последние исправления в своих системах. Надеюсь, вам понравилась статья. Подпишитесь на Яшу
, чтобы получать ежедневные обновления и спасибо за чтение.
Переведено специально для xss.pro
Автор перевода: yashechka
Источник: https://www.hackingarticles.in/process-ghosting-attack/
Габриэль Ландау опубликовал здесь пост об Elastic Security, в котором рассказывается о методе, с помощью которого было обнаружено, что обход антивируса возможен. Этот метод связан с созданием процесса-призрака, термин, используемый автором для описания механизма удаления полезной нагрузки с диска перед его запуском, что, по сути, делает его призраком.
Создание процесса и брешь в безопасности
В экосистеме Windows разработчики антивирусных решений вызывают API-интерфейсы (например, PsSetCreateProcessNotifyRoutineEx), которые могут информировать их антивирусное решение о выполнении определенного процесса, однако обратные вызовы отправляются не при выполнении процесса, а при первом потоке в этом процессе который выполняется. Следовательно, именно в этом промежутке между созданием процесса и отправкой уведомления об его создании антивирусному решению злоумышленники могут реализовать дублирование процесса.
Исполняемые файлы, процессы и потоки
Исполняемый файл — это скомпилированный файл, содержащий программу, которая должна быть запущена машиной. Исполняемые файлы могут выполнять несколько функций, и когда каждая из этих функций запускается, она называется процессом.
Проще говоря, процесс — это исполняемая программа. Каждый процесс связан с определенным PE (exe, dll и т.д.). Также может быть несколько процессов из одного исполняемого файла. Это можно посмотреть в Диспетчере задач -> Подробности.
Поток — это основная единица процесса, которой ОС выделяет процессорное время.
Поток может выполнять любую часть кода процесса. В процессе существует несколько потоков. Многопоточность означает, что несколько потоков выполняют одну и ту же часть кода процесса. Windows поддерживает многозадачность, поэтому может быть создано столько потоков, сколько процессоров доступно для их одновременного запуска. Пороцесс может иметь три состояния: работает, готово и заблокировано.
Создание процесса
Процесс можно создать в Windows с помощью функции CreateProcess или NtCreateUserProcess. Эта функция представляет собой комбинацию отдельно изменяемых других функций, которые могут работать с дескрипторами, секцией образов, потоками и т. д.
Например, CreateProcess (lpApplicationName) определяет, какое приложение выполнять.
Призрачный процесс
Теперь, когда мы рассмотрели основы, давайте разберемся, как обрабатывать призрака.
Это метод, при котором злоумышленник создает файл (вредоносное ПО), помечает его для удаления (состояние ожидания удаления), копирует/сопоставляет вредоносное ПО в памяти, закрывает дескриптор (что удаляет его с диска), затем создайте процесс из теперь безфайлового раздела. Прежде чем понять атаку, мы должны знать следующее:
Дескрипторы: используются для управления памятью, это ссылки на ресурс в пространстве ядра. Они не только содержат информацию о ресурсе, но и предоставляют права доступа.
int fh = open("/etc/passwd", O_RDWR);
fh — дескриптор файла.
Когда мы открывали файл с помощью функции open(), она возвращала дескриптор переменной fh. Теперь fh можно использовать для выполнения таких функций над файлом, как:
fh.read()
fh.append()
fh.close()
Кроме того, файл, к которому обращается fh, не может быть прочитан, записан или выполнен любым другим дескриптором (или любым другим процессом). fh.close() закроет дескриптор файла, т. е. к файлу не будет доступа.
Секция образа. Секция — это сопоставление файла с памятью. Секция образа — это специальный тип раздела, который соответствует файлам Portable Executable (PE) и может быть создан только из файлов PE (EXE, DLL и т. д.).
Состояние Delete_Pending: как и состояние чтения, записи, удаления, которое может существовать для файла, Delete_Pending — это состояние, в котором файл еще не удален.
Файл еще не удален, потому что дескриптор, возможно, оставил его открытым. Как только хэндл закроется, файл будет удален. Никакой другой процесс не может работать с этим файлом в состоянии Delete_Pending.
Таким образом, весь поток Process Ghosting выглядит так:
Шаг 1: Создайте файл с помощью функции NtCreateFile(). Это создаст предполагаемое вредоносное ПО.Кроме того, даст нам дескриптор файла.
например: hFile = NtCreateFile(C:\Users\a_cha\Desktop\random.exe)
hFile — это дескриптор этого файла.
Шаг 2: Поместите файл в состояние delete_pending. Это можно сделать с помощью функции NtSetInformationFile(). При использовании флага FileDispositionInformation файл будет переведен в состояние delete_pending. Мы можем использовать hFile для выполнения этой задачи в нашем файле.
Шаг 3: Запишите полезную нагрузку (вредоносное ПО) в этот вновь созданный файл.
Поскольку файл находится в состоянии ожидания удаления, как только он закроется, данные исчезнут. Но мы выполним Шаг 4 до того, как он исчезнет!
Шаг 4: Образ файла создается с помощью функции NtCreateSection(hFile, SEC_IMAGE).
Это можно сделать так: hSection = NtCreateSection(hFile, SEC_IMAGE). Вот почему наш дескриптор был необходим, так как NtCreateSection() принимает дескриптор файла в качестве входных данных. Теперь мы можем безопасно удалить наш дескриптор.
Шаг 5: Удалите наш только что созданный дескриптор. Это также удалит наш соответствующий файл (вредоносное ПО) с диска, однако его копия все еще существует в секции образов.
Шаг 6: Создайте новый процесс из секции образов. Поскольку код существует в виртуальной памяти, новый процесс можно создать с помощью NtCreateProcessEx(hSection). Это будет сделано следующим образом: hProcess = NtCreateProcessEx(hSection)
Шаг 7: Назначьте аргументы процесса и переменные среды. Это важно, так как без аргументов процесса и переменных среды ОС не будет выполнять процесс, и код останется в приостановленном состоянии.
Шаг 8: Создайте поток для выполнения в процессе. Это можно сделать с помощью функции CreateThread() и указания начального адреса выполняемого процесса.
Антивирусные коллбэки вызываются, и файл блокируется, как только создается поток для выполнения вредоносного ПО. Поскольку поток создается после удаления файла, антивирусные коллбэки никогда не будут вызываться. Любые попытки антивируса открыть этот файл вызовут ошибку STATUS_FILE_DELETED.
IkerSaint создал ПОК атаки с фантомным копированием процессов под названием "KingHamlet", которое можно скачать здесь (https://github.com/IkerSaint/KingHamlet/releases). Этот инструмент сначала шифрует файл, а затем выполняет атаку. Давайте запустим демо и посмотрим, как обрабатывать фантомные процессы.
Демо Process Ghosting с использованием SharpGhosting
Основываясь на методологии, описанной выше, многие POC всплыли на поверхность после публикации Габриэля в Elastic Security. В этой демонстрации мы будем использовать реализацию Process Ghosting на C#, разработанную Wra7h. Прежде чем вы попробуете её, важно, чтобы у вас была более старая версия Windows 10, поскольку Microsoft исправила обнаружение защитника после того, как этот метод появился в дикой среде. Если вы проводите пентест и находите более старую версию Windows 10, вы знаете, что делать!
Вы можете скачать код из репозитории github здесь (https://github.com/Wra7h/SharpGhosting).
Вы можете скомпилировать этот исходный код, используя следующую команду:
C:\Windows\Microsoft.NET\Framework64\v3.5\csc.exe /out:SharpGhost.exe /unsafe C:\ProcessGhosting\SharpGhosting-main\*.cs
Не стесняйтесь менять путь по своему усмотрению. Кроме того, вам понадобится .NET framework v3.5, чтобы скомпилировать его самостоятельно.
Чтобы упростить задачу и избавить вас от необходимости компиляции, я форкнул репозиторий и создал для вас EXE-файл, который можно скачать здесь. После того, как вы загрузили файл, мы можем продолжить нашу демонстрацию. Как видите, защитник у нас активен и работает.
Теперь мы можем запустить наш призрачный процесс с помощью следующей команды:
.\SharpGhost.exe -real <path>\name.exe
Здесь я запускаю экземпляр mimikatz, который определяется как вредоносное ПО любым мыслимым антивирусным решением. Цель состоит в том, чтобы обойти антивирусное обнаружение во время выполнения.
.\SharpGhost.exe -real C:\ProcessGhosting\mimikatz.exe
И эта команда запустит mimikatz как процесс-призрак. Вы можете открыть диспетчер задач и перейти к деталям, чтобы увидеть запущенный призрачный процесс. У этого процесса нет имени, поскольку связанный с ним EXE-файл не существует.
Как видите, во время работы защитник не определил mimikatz как вредоносное ПО. Это связано с тем, что при вызове обратных вызовов AV файл блокируется, как только создается поток для выполнения вредоносного ПО. Поскольку поток создается после удаления файла, антивирусные коллбэки никогда не будут вызываться.
Вывод
В статье было представлено простое для понимания теоретическое объяснение мельчайших деталей и различных функций, используемых при запуске атак внедрения PE с помощью Process Ghosting. Вскоре после того, как эта техника была выпущена, Microsoft выпустила патч для устранения этой проблемы. Эта техника больше не работает в последних версиях Windows 10 и Windows 11, однако более старые версии Windows 10 все еще используются в организациях и домашних системах, и умный злоумышленник может этим воспользоваться.
Следовательно, нужно всегда обновлять свои системы и устанавливать последние исправления в своих системах. Надеюсь, вам понравилась статья. Подпишитесь на Яшу
Переведено специально для xss.pro
Автор перевода: yashechka
Источник: https://www.hackingarticles.in/process-ghosting-attack/