• XSS.stack #1 – первый литературный журнал от юзеров форума

PEB-Walking в PowerShell

MaFio

(L2) cache
Пользователь
Регистрация
23.02.2021
Сообщения
324
Реакции
321
Гарант сделки
2
1.png


В нашем постоянном стремлении к минимизации артефактов и обходу средств защиты, fileless-техники занимают особое место. Недавний анализ PowerShell-загрузчика, развертывающего Remcos RAT, вновь демонстрирует изящество и эффективность таких подходов. Посмотрим на механику этого загрузчика и его место в ландшафте современных угроз.

Все начинается с обфусцированного PowerShell-скрипта. Его задача - реконструкция двух бинарных блоков из закодированных (часто Base64) данных. Нередко применяется кастомная логика строковых операций для усложнения статического анализа перед непосредственным декодированием.

Получив байтовые массивы, скрипт задействует стандартные Win32 API
  1. VirtualAlloc для резервирования памяти под первый блок – шеллкод-загрузчик.
  2. Marshal.Copy (или аналоги) для переноса шеллкода в выделенную область.
  3. CallWindowProcW (или CreateThread, или иной механизм вызова функции по указателю) для инициации выполнения шеллкода.

Наиболее примечательная черта этого загрузчика - динамическое разрешение адресов необходимых API-функций через Process Environment Block (PEB). Это позволяет избежать явного импорта функций, что критично для обхода обнаружения по таблице импортов и затрудняет статический анализ.

Процесс выглядит следующим образом:
  1. Локализация PEB: Шеллкод получает доступ к структуре PEB (например, через FS:[0x30] для x86 или GS:[0x60] для x64).
  2. Доступ к PEB_LDR_DATA: Через поле Ldr в PEB извлекается указатель на PEB_LDR_DATA.
  3. Обход Списка Модулей: Итерация по списку загруженных модулей (например, InMemoryOrderModuleList) для поиска базовых библиотек (часто ntdll.dll или kernel32.dll).
  4. Получение Таблицы Экспорта (EAT): После нахождения базового адреса нужного модуля, парсится его PE-заголовок для обнаружения EAT.
  5. Разрешение Адресов Функций: Проходя по EAT, загрузчик ищет требуемые функции (например, LdrLoadDll, LdrGetProcedureAddress из ntdll.dll), сравнивая их имена (или хеши имен) с эталонными. Получив эти фундаментальные API, он может загрузить любую библиотеку и разрешить любую функцию.

Вооружившись адресами ключевых API, шеллкод-загрузчик приступает ко второму этапу:
  1. Выделяет память под второй бинарный блок (собственно, PE-файл, в данном случае Remcos RAT).
  2. Копирует PE-файл в эту область.
  3. Выполняет релокацию адресов (если PE не является позиционно-независимым).
  4. Корректно устанавливает права доступа к секциям памяти.
  5. Передает управление на точку входа (AddressOfEntryPoint) PE-файла, обеспечивая его выполнение целиком из памяти.

Описанный PowerShell-загрузчик - яркий пример, но не исключение. Подобные fileless-атаки с использованием Remcos RAT фиксировались и ранее. Это подчеркивает общую тенденцию: хакеры активно совершенствуют методы доставки и исполнения в памяти для уклонения от детектирования.

Так, заслуживают внимания и другие развивающиеся подходы к загрузке, например, многоступенчатые .NET-загрузчики. В некоторых их вариантах для сокрытия последующих стадий используются нетривиальные методы, такие как встраивание зашифрованных данных в ресурсы изображений (например, bitmap), что является формой стеганографии. Первая стадия извлекает, расшифровывает эти данные и запускает следующую ступень в памяти.

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


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх