5 сентября специалистами F.A.C.C.T. было зафиксировано несколько рассылок группы PhantomCore, нацеленных в адрес:
российской ИТ-компании, являющейся разработчиком ПО и онлайн-касс;
компании, занимающейся организацией командировок;
конструкторского бюро;
производителя систем и высокотехнологичного оборудования беспроводной связи.
Разобрали новые рассылки PhantomCore ведущий специалист по анализу вредоносного кода компании F.A.C.C.T. Артем Грищенко и аналитик группы исследования сложных угроз F.A.C.C.T. Алена Шандер.
Напомним, что PhantomCore – группа кибершпионов, действующая с начала 2024 года против российских организаций, была впервые раскрыта и описана в отчете исследователями компании F.A.C.C.T. Группировка получила своё название по имени их уникального трояна удаленного доступа PhantomRAT. Весной и летом этого года киберешпионы атаковали российские организации в различных отраслях, но большинство целей было обнаружено среди промышленных компаний. Отличительной особенностью злоумышленников является то, что они предварительно компрометируют сторонние организации и используют их для проведения атак через фишинговые письма.
Содержимое писем из недавних рассылок было идентично, пример одного из них представлен на рисунке 1.
Письмо с вложением «Договор_на_поставку_обр_00694723_от_04_09_2024.rar» было отправлено с, вероятно, скомпрометированного адреса, принадлежащего компании, специализирующейся на строительстве и автоматизации объектов электроэнергетики и транспорта. Тема письма совпадает с названием вложения: “Договор на поставку обр №00694723 от 04.09.2024”. Такой формат вложений и тем злоумышленники часто применяют в своей деятельности, маскируя письмо под различные значимые документы, такие как договоры, заявления, счет-фактуры и т.д.
Вложение представляет собой защищенный паролем архив. Отметим, что злоумышленники усложнили пароль на архив, в старых атаках в качестве пароля использовался год, даты рассылок, легкие цифровые комбинации: «11112222», «2024», «1007», и другие, в то время как в текущей рассылке использовался пароль: «He@k43M24v». Архив включает в себя исполняемый файл и легитимный PDF-файл, являющийся документом-приманкой с таким же именем. Содержимое архива представлено на рисунке 2.
Злоумышленники по-прежнему эксплуатируют уязвимость CVE-2023-38831, которая заключается в том, что если пользователь с версией WinRAR меньшей 6.23 запустит PDF-файл, будет запущен исполняемый файл, содержащийся в одноименной директории архива.
Содержимое документа-приманки, поставляемого злоумышленниками в заблюренном виде, представлено на рисунке ниже.
Исполняемый файл «Договор_на_поставку_обр_00694723_от_04_09_2024.pdf .exe» представляет собой вредоносную программу, классифицируемую нами как PhantomCore.KscDL_trim. В качестве C2 использует ip: 185[.]130[.]251[.]55:80.
PhantomCore.KscDL_trim - урезанная версия загрузчика PhantomCore.KscDL, написанная на языке программирования C++ и упакованная инструментом UPX . Загрузчик имеет следующие возможности: загрузка и запуск файлов с C2-адреса; выполнение произвольных команд в интерпретаторе команд Windows. PhantomCore.KscDL_trim использует HTTP-протокол для взаимодействия с сервером и библиотеку Boost.Beast.
После прохождения проверки будет установлена кодировка 866 и локаль "ru_RU.UTF-8". Далее будет запущена функция для подключения к серверу. Запрос будет выполнятся на gateway /connect. В случае неудачного подключения в лог будет добавлена строка: "[-] Retry in 5 seconds...", и после 5 секундного ожидания будет выполнена повторная попытка подключения. В случае удачного подключения в лог будет добавлена строка: "[+] Connected to server: {C2} successfully!", и процесс исполнения перейдет к задаче для получения и выполнения команд от C2. Также в ходе выполнения подключения к серверу по результату выполнения запроса в лог будет добавляться строка: "[+] Response from server: ".
В PhantomCore.KscDL_trim существует задача runRequester, которая выполняет следующую последовательность действий:
создание JSON-объекта с данными о системе и их отправка с помощью POST-запроса на gateway /init;
выполнение запроса /check и переход к получению и обработке команд от сервера (задача requesterThread).
При первом запуске и в случае, если объект инициализации не был отправлен, процесс исполнения перейдет в сбор объекта и его отправку. Объект содержит следующий шаблон:
{
"BuildName": "5",
"Domain": "{domain}",
"Hostname": "{hostname}",
"Interval": 15,
"LocalIp": "{local_ip}",
"Os": "{os_version}",
"Username": "{computername}\{username}",
"Uuid": "{uuid}"
}
Uuid - случайно сгенерированное значение по шаблону %08x-%04x-%04x-%04x-%012llx;
BuildName - содержится внутри файла (в исследуемом файле - "5");
Domain - извлекается с помощью WQL-запроса SELECT Domain FROM Win32_ComputerSystem к WMI-объекту Win32_ComputerSystem;
Hostname - извлекается с помощью WQL-запроса SELECT DNSHostName FROM Win32_ComputerSystem к WMI-объекту Win32_ComputerSystem;
Username - извлекается с помощью WQL-запроса SELECT RegisteredUser FROM Win32_OperatingSystem к WMI-объекту Win32_OperatingSystem;
LocalIp - локальный IP адрес, который будет получен с использованием функции boost::asio::ip::host_name();
Os - версия системы, которая будет получена в результате конкатенации двух WQL-запросов SELECT Version FROM Win32_OperatingSystem и SELECT Caption FROM Win32_OperatingSystem к WMI-объекту Win32_OperatingSystem;
Interval - содержится внутри файла и отвечает за промежуток времени между итерациями цикла в функции runRequester() (в исследуемом файле - 15).
Данный JSON-объект будет отправлен с помощью POST-запроса на gateway /init. Важно отметить, что данный объект и ответ от сервера будут добавлены в лог.
В случае успешной отправки данных процесс исполнения перейдет в цикличную отправку запроса /check и создание задачи requesterThread для получения и обработки команды от сервера. Для получения команды в контексте задачи циклично выполняется POST-запрос с gateway /command. В ответ на данный запрос будет получен JSON-объект вида:
{
"Done": {done},
"OperatorId": "{operator_id}",
"Response": "{response}",
"Command": "{command}",
"AgentId": "{agent_id}",
"Uuid": "{uuid}"
}
Данный объект содержит поле "Command", в котором расположена команда. После ее выполнения результат команды будет добавлен в поле "Response", а в поле "Done" будет установлено значение true. Также мы полагаем, что поле "OperatorId" содержит уникальный идентификатор злоумышленника, определяющий оператора ВПО, от которого была отправлена команда. Поле "AgentId" содержит сгенерированный UUID, обозначающий уникальный идентификатор агента, который расположен на зараженной системе (данный UUID будет отправлен на C2-сервер в контексте POST-запроса /init). А поле "Uuid" в контексте текущего запроса содержит уникальный идентификатор конкретной команды.
Поддерживаемые загрузчиком команды:
up {URL} - загрузить файл на зараженную систему. Команда содержит URL-адрес, к которой будет выполнен запрос для загрузки файла. Файл будет сохранен в текущую директорию процесса.
-
ex {cmd} – выполнить смену текущих директорий, а также произвольные команды в интерпретаторе команд Windows. Существует три варианта обработки команды:
если была получена команда "cd .." текущей директорией будет установлена родительская директория;
если шаблон строки "cd {filepath}", то выполнится проверка существования в системе файлового пути {filepath}. Если путь существует, он будет установлен как текущая директория;
если команда не соответствует шаблонам из пунктов 1 и 2, будет выполнена команда "cmd.exe /C {cmd}", результат команды будет отправлен на C2-сервер.
st {filepath} - выполнить запуск файла с помощью команды "cmd.exe {filepath}".
Важно отметить, что после выполнения каждой команды будет выполнен POST-запрос на C2-сервер с gateway /out, который будет содержать такой же шаблон JSON-объекта, который был получен от сервера при получении команды. Однако в поле "Response" будет добавлен результат команды, а в поле "Done", будет установлено значение 1.
Если полученная команда не совпадает с обрабатываемыми командами, на сервер будет отправлена ошибка: "ERROR: Input command incorrect!".
Во время анализа нам удалось получить несколько команд от управляющего сервера, что позволило установить, что атакующие предварительно профилируют жертву и решают, интересна ли она для развития атаки:
"ex dir";
"ex dir C:\\Users\\{USER}\\Desktop";
"ex arp -a";
"ex shutdown /t 0".
Индикаторы
Договор_на_поставку_обр_00694723_от_04_09_2024.rar
MD5: 0daf3c16f6941ced4ec87d2728c35579
SHA1: b007c49e0eaea34bffcaf3407b538d3127d2655e
SHA256: 76375264335bdc71e1b5273e56978f60ff27ad528eae16a0137d41a35f1ba052
Договор_на_поставку_обр_00694723_от_04_09_2024.pdf .exe
MD5: 4eed2d03a238df4b52182484cf4e6d9a
SHA1: e13bc13a628e44229faf7ee3bfa21da942e3a242
SHA256: dca85252d885882fb5eb38d21d48c44012f769a631114ea0c4bfc0f423d82c60
Договор_на_поставку_обр_00694723_от_04_09_2024.pdf - приманка
MD5: 679be90c870d468c8be97174c3150dc3
SHA1: 43e3011ccde9f6f3bfb6ce1dba70630c371c28ca
SHA256: 8687c337fdf5212fbcd6de6ade47a063a5cc9668db8acd95669d396e7b327198
hXXp://185.130.251[.]55/init
hXXp://185.130.251[.]55/command
hXXp://185.130.251[.]55/check
hXXp://185.130.251[.]55/connect
hXXp://185.130.251[.]55/out
hXXp://185.130.251[.]55/error
185.130.251[.]55