Четыре вредоносные программы в одной атаке: разбор многоуровневой цепочки заражения

Четыре вредоносные программы в одной атаке: разбор многоуровневой цепочки заражения

Одна атака оставила после себя сразу четыре разных инструмента. Каждый решал свою задачу: скрытно закрепиться на компьютере, подменить программу удалённого администрирования, сойти за обновление набора разработчика, сымитировать безобидный агент мониторинга. Началась история с отравления поисковой выдачи. Закончилась полным контролем над рабочим местом сотрудника.

Описание

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

Совместное расследование Threat Hunting Labs и Malbear Labs показало, что самым сложным вышел загрузчик на C++. Внутри его главной функции больше восьмидесяти тысяч инструкций, и почти все вычисления ведут к одному результату. Полезная нагрузка спрятана не в теле программы, а внутри самих машинных команд. Прочитать её напрямую нельзя: нужные байты разбросаны по их служебным полям, а вокруг выстроены тысячи ложных арифметических построений. Каждое выглядит осмысленным, но лишь запутывает анализ. Отдельная таблица из сорока восьми числовых меток указывает, какие системные функции программа вызовет. Имена этих функций нигде не записаны в открытом виде.

Загрузчик трижды проверяет, не работает ли он под отладчиком. Потом сверяет имя учётной записи с набором типовых имён, которые используют аналитики и тестовые стенды. После этого изучает видеокарту, объём памяти и размер диска. На виртуальной машине или в изолированной среде он просто выключается. Отдельная проверка касается часов. Программа замеряет, сколько времени прошло с запуска, и отказывается продолжать, если прошло меньше половины секунды. На настоящем компьютере пауза возникает сама собой. В эмуляторе время не движется, и работа останавливается.

Если проверки пройдены, загрузчик внедряется в чужой процесс. Он берёт первую доступную программу из списка: сначала системный компонент Windows, затем браузеры Chrome, Edge, Brave, Vivaldi, Yandex, Opera и Firefox. Процесс запускается приостановленным. До первой исполненной инструкции в его память записывается вредоносный код. Приём оставляет меньше следов, чем классическое опустошение процесса, поскольку исходный образ программы остаётся на месте. Управление передаётся либо через очередь отложенных вызовов, либо через правку сохранённого состояния потока.

Второй образец - самописная программа удалённого доступа на C++, замаскированная под агент RMM. RMM (Remote Monitoring and Management) - программное обеспечение для удалённого мониторинга и управления. Снаружи всё выглядит как у серьёзного корпоративного продукта: установка службы, файл конфигурации, токен доступа, защищённое хранилище учётных данных, проверка целостности загружаемых пакетов. Но каждая функция обслуживает атаку. Агент собирает сведения о машине: имя, домен, версию системы, модель процессора, объём памяти, список дисков и сетевых адресов. Затем он принимает задачи от сервера и умеет запускать сторонние файлы. Все строки внутри зашифрованы, поэтому разобрать файл без запуска почти невозможно. Среди задач встречается и удалённое завершение работы самого агента - на случай, если оператор захочет замести следы.

Третий инструмент - установщик, который выдаёт себя за приложение для обмена сообщениями. Внутри архива лежат распаковщик и зашифрованный файл. После распаковки запускается среда Python с одним скриптом. Строки в нём собраны по отдельным символам, а ключ шифрования рядом не хранится. Программа подбирает его перебором, сверяя результат с известным заголовком исполняемого файла Python. Подбор занимает чуть больше ста тысяч попыток и завершается меньше чем за секунду. Найденное значение сохраняется в отдельный файл, чтобы при следующем запуске не считать всё заново.

Дальше скрипт повышает права через системную службу, которая штатно запускает программы с повышенными привилегиями. Диалог подтверждения при этом не появляется. Затем он прописывает задачу в планировщике, добавляет установочную папку в исключения встроенного защитника и запускает загрузчик Cobalt Strike - платформы для управления атакой, изначально созданной для тестирования на проникновение. Основной модуль получает команды с одного адреса и ждёт новых указаний. Перед запуском он проходит три проверки: считает файлы во временной папке, число записей в списке установленных программ и наличие у них названий. На свежем стенде или в чистой виртуальной среде условия не выполняются, и полезная нагрузка не запускается.

Четвёртый образец устроен проще остальных. Это набор скриптов Python, упакованный в один исполняемый файл. Он регистрируется на сервере, раз в десять секунд запрашивает команды и выполняет их через PowerShell. Логика видна целиком: принять задачу, запустить её, вернуть результат. Никакой маскировки в нём нет, поэтому разобрать его удалось полностью.

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

Индикаторы компрометации

YARA

Комментарии: 0