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

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

Это довольно типичная ситуация, бороться с которой можно разными способами, которые не касаются темы моей статьи. Однако для злоумышленников есть довольно важная задача: Как избежать обнаружения САВЗ, чтобы на славу поработать в системе и не быть замеченным? Именно об этом пойдет речь. Рассмотрим такие методы, как

  • Process Hollowing

  • Process Doppelganging и способы их обнаружения при последующей технической экспертизе.

Process Hollowing (внедрение в пустой процесс)

Основная суть техники Process Hollowing заключается в создании легитимного процесса в приостановленном состоянии (SUSPEND) и перезаписи его адресного пространства вредоносным кодом, который может быть загружен по сети или с диска в обфусцированном виде (для избежания алертов при статическом анализе средствами АВЗ) и впоследствии удален в процессе выполнения.
Ключевое отличие данной техники от методов с внедрением DLL или PE файла в процесс заключается в полной перезаписи кода легитимного процесса, который в своем изначальном виде перестает функционировать, оставляя от себя только строчку в Process Explorer с неприметным названием.

Кстати говоря, при использовании Process Hollowing затирается только адресное пространство, включающее в себя исполняемый код, а структуры PEB (блок окружения процесса) остаются нетронутыми.

Итак, какие этапы проходят начиная от запуска легитимного процесса до старта исполнения вредоносного кода?

  1. С помощью функции CreateProcess WinAPI запускается легитимный процесс с флагом SUSPEND (процесс создастся с приостановленным основным потоком).

  2. Очищаем адресное пространство целевого процесса от родного кода.

  3. Выделяем новый адресуемый участок памяти с битами защиты PAGE_EXECUTE_READWRITE.

  4. Загружаем в подготовленный участок памяти вредоносный код с помощью WriteProcessMemory.

  5. Изменяем точку входа приостановленного потока на адрес внедренного кода.

  6. Модифицируем PEB, чтобы он указывал на базовый адрес замененного образа в приостановленном процессе.

  7. Возобновляем приостановленный поток процесса. ResumeThread(pi.hThread);

Вот некоторые инструменты, позволяющие реализовать данный метод:

  1. https://github.com/EmreOvunc/Process-Injection-Process-Hollowing-T1055.012

  2. https://github.com/m0n0ph1/Process-Hollowing

Теперь, когда сам механизм реализации такой атаки понятен, можно приступить к разбору методов обнаружения. Весь процесс буду показывать на примере одной из лабороторных malwarecookbook.

Нестандартные отношения родительский - дочерний процесс

Чаще всего злоумышленники пытаются замаскировать вредоносный процесс под что-то максимально неприметное, например, lsass.exe, svchost.exe и другие исполняемые файлы с цифровой подписью Microsoft. Для таких процессов как lsass.exe стоит обращать внимание на их количество, так как некоторые из сервисов, включая вышеупомянутый обычно запускаются в системе в единственном экземпляре и уже потом используются другими приложениями и компонентами системы. Рассмотрим наш пример.
Определим исследуемую систему и посмотрим дерево процессов.

Обратим внимание на то, что мы имеем целых 3 процесса lsass.exe, 2 из которых (PID 868, 1928) являются дочерними от services.exe, что совсем нестандартно для Windows XP, где lsass всегда был дочерним процессом winlogon.exe. Этот факт уже наводит на мысли об использовании Process Hollowing.

Нестандартные биты защиты

Инъекцию в пустой процесс можно также обнаружить, сканируя страницы памяти процессов на предмет нестандартных битов защиты PAGE_EXECUTE_READWRITE. Это говорит о том, что код, исполняемый в контексте этого процесса был записан в адресное пространство принудительно. (При легитимном запуске биты защиты чаще всего имеют значение PAGE_EXECUTE_READCOPY).

В данном случае видим, что страница памяти с адресом 0x1000000 как раз подходит под этот признак, а её адрес совпадает с базовым адресом процесса lsass.exe (PID 868), что указывает, на то, что исполняемый код процесса подменен.

Несогласованность PEB и VAD

VAD - Virtual Address Descriptor используется менеджером памяти Windows для описания диапазонов памяти, используемых процессом, по мере их выделения. Когда процесс выделяет память с помощью VirtualAlloc, менеджер памяти создает запись в VAD.

Этот метод обнаружения основан на сравнении структур PEB и VAD, а конкретно указателя на расположение исполняемого файла на диске.
Проверим указанные структуры на несогласованность для уже подозреваемого процесса с PID 868.

Видим, что информация взятая из немодифицированного PEB указывает на исполняемый файл lsass.exe на диске
C:\WINDOWS\system32\lsass.exe.
Проверим структуру VAD.

Сразу же бросается в глаза отсутствие этого пути на диске при анализе VAD. Вот и несоответствие! Также можно заметить, что изначальный код процесса так и не был запущен, так как процесс был создан с флагом SUSPEND. Об этом говорит False в столбце InInit.
Проверим наше предположение о вредоносности данного процесса, извлечем исполняемую нагрузку из памяти и отправим на VirusTotal

Видим, что мы успешно обнаружили использование Process Hollowing.

Данный метод скрытия ВПО в системе постепенно теряет свою популярность из-за появления более продвинутых техник, однако в определенный момент времени он широко применялся злоумышленниками. Например, такие вредоносы как TrickBot, Kovter, Dridex, Poweliks использовали этот метод для скрытия от антивирусов. На данный момент техника уже глубоко изучена и редко применяется в компьютерных атаках.

Process Doppelganging (процесс-двойник)

Данная техника появилась в 2017 году и впервые была показана на конференции Black Hat Europe 2017. Она является следующим этапом развития уже рассмотренной Process Hollowing и основана на использовании механизма транзакций NTFS (TxF).

TxF - технология, появившаяся в Windows Vista и поддерживающаяся последующими версиями Windows , позволяющая производить файловые операции при помощи транзакций, обеспечивая поддержку атомарности, согласованности, изолированности и надёжности. Технология позволяет производить атомарные операции над файлом или несколькими файлами.

Идея этого метода заключается в создании транзакции NTFS с пустым транзакционным файлом, загрузки в него вредоносного кода и отображения его содержимого в память и последующего отката транзакции. Таким образом, получается, что из-за отката транзакции изменения на диск внесены не были, а отображенный в память код остается спрятанным под видом хорошего процесса.
Рассмотрим механизм осуществления атаки подробнее:

  1. Создаем транзакцию с помощью CreateTransaction.

  2. Открываем чистый транзакционный файл, используя CreateFileTransactedA.

  3. Перезаписываем полученный файл вредоносным кодом.

  4. Создаем секцию памяти, на которую отображается транзакционный файл с вредоносным кодом м помощью NtCreateSection.

  5. Создаем сущности процесса и его главного потока с начальным адресом, равным точке входа вредоносного кода.

  6. Изменить параметры процесса в его адресном пространстве.

  7. Запустить основной поток процесса с помощью ResumeThread.

Вот пример утилиты, реализующей данную технику:

Использование данной техники довольно сложно обнаружить, исследуя дамп памяти методами цифровой криминалистики, однако у нее есть недостаток, который заключается в использовании достаточно редких функций WinAPI. Сразу после доклада на конференции в 2017 вендоры антивирусного ПО обратили на это внимание и добавили отлов этих функций в перечень механизмов защиты. Таким образом, любые процессы, вызывающие функции Windows API для работы с TxF автоматически попадают под подозрение.

Кстати говоря, данная техника вовсю использовалась такими вредоносами, как SynAck, Osiris, Bazar Loader, LokiBot, SmokeLoader, AZORult и другие.

Обнаружение средствами АВЗ

Антивирусы отслеживают вызовы функций Windows API, используя различные методы и техники:

  1. Hooking: Антивирус может установить специальные хуки для функций Windows API, чтобы перехватывать вызовы этих функций. При вызове функции, хук перехватывает управление и позволяет антивирусу выполнить дополнительные проверки или блокировку, если обнаружены подозрительные действия.

  2. Эвристический анализ: Антивирусные программы могут использовать эвристический анализ для обнаружения подозрительных вызовов функций Windows API. Это основано на заранее определенных правилах и алгоритмах, которые помогают идентифицировать потенциально вредоносное поведение.

  3. Поведенческий анализ: Антивирус может следить за поведением программы и анализировать вызовы функций Windows API в контексте других действий программы. Если обнаружено подозрительное поведение или необычные вызовы API, антивирус может принять меры для блокировки или удаления программы.

Все эти методы и техники используются вместе для максимальной эффективности обнаружения и блокировки вредоносных программ, основанных на вызовах функций Windows API.

Анализ структуры _EPROCESS

На системах с версией Windows ниже 10 версии обнаружение факта применения данной техники было довольно сложным. Единственным вариантом хотя бы как-то проанализировать процесс-двойник на предмет его вредоносности являлась проверка структуры FileObject. Однако, после появления Windows 10, в _EPROCESS были добавлены новые сущности. Для нас интересно одно конкретное поле - ImageFilePointer, а конкретно смещение этого указателя и его значение.
Разберем данный метод обнаружения на примере одной из старых лабороторных с ресурса CyberDefenders.

Для анализа процессов будем пользоваться volshell.

python3 volshell.py -f lab.vmem -w
// -w указывает на то, что исследуемая система - Windows

Далее из volatility необходимо взять базовый адрес этого процесса в памяти.
Для того чтобы прыгнуть в адресное пространство процесса, а конкретно в структуру _EPROCESS, вводим
dt('_EPROCESS', <baseOffset>)

На изображении видим указатель ImageFilePointer и его значение. Это обычный ничем не приметный процесс, а именно notepad.exe.

Теперь проверим подозреваемый процесс.

Видим, что значение указателя равно нулю, что указывает на использование Process Doppelganging. При использовании volatility 2, результат будет выглядеть немого иначе, а именно значение смещения ImageFilePointer будет равно NULL. Это связано с небольшими отличиями в механизмах их работы.

Заключение

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

Process Doppelganging и его старший брат Process Hollowing уже уходят со сцены, уступая место Process Ghosting и Process Herpaderping, механизмы которых гораздо сложнее. Но в любом случае необходимо знать с чего начиналась эпоха бесфайловых угроз и иметь в своем арсенале знания по их обнаружению.

Комментарии (2)


  1. uhahatbl_tv
    17.08.2023 19:36

    Подскажите, пожалуйста, по вопросу: вы, когда проверили предположение о вредоносности процесса, извлекли исполняемую нагрузку из памяти. Как именно вы достали полезную нагрузку и как она выглядит?


  1. vilgeforce
    17.08.2023 19:36
    +1

    Вот вы пишете что инжект (будем называть вещи своими именами) в легитимный процесс - способ сокрытия ВПО. Вы экспериментально пробовали этого утверждение проверять? Например, пишете программу которая будет описанным образом стартовать легитимный notepad.exe и дальше инжектить в него какой-то код, не обязательно вредоносный. Потом ставите на систему антивирус со стандартными настройками и пробуете вашу тестовую программу запустить. Инжект - это не просто подозрительное поведение, такие штуки надо блокировать для всех, кто не в белом списке, так-то...