Descrições de malware

Maverick: Novo Trojan bancário distribuído via WhatsApp

Uma campanha recente de malware foi detectada no Brasil, distribuindo um arquivo LNK malicioso usando o WhatsApp. Ela tem como alvo principalmente brasileiros e utiliza URLs nomeadas em português. Cada download é verificado na C2 para garantir que seja originado do script ou executável malicioso, tornando a aquisição do payload uma tarefa difícil.

Toda a cadeia de infecção é complexa e totalmente sem arquivos (fileless), e, ao final, ela entregará um novo trojan bancário chamado “Maverick”, que contém muito código compartilhado de uma outra ameaça brasileira descoberta por nossa equipe, chamada Coyote. Nesta análise, detalharemos toda a cadeia de infecção, o algoritmo de criptografia e seus alvos, além de discutir as semelhanças com ameaças conhecidas.

Principais descobertas:

  • Campanha massiva disseminada pelo WhatsApp web distribuiu o novo trojan bancário brasileiro chamado Maverick, através de arquivos ZIP contendo um arquivo LNK malicioso, que não é bloqueado na plataforma de mensagens.
  • Ao se instalar, o trojan usa o projeto de código aberto WPPConnect para automatizar o envio de mensagem em contas sequestradas via WhatsApp Web, aproveitando o acesso para enviar a mensagem maliciosa para os contatos.
  • O novo trojan usa código compartilhado de outro trojan bancário brasileiro chamado Coyote, porém consideramos o Maverick como uma nova ameaça.
  • O trojan Maverick verifica fuso-horário, idioma, região e formato de data e hora nas máquinas infectadas, para se certificar de que a vítima esteja no Brasil; caso contrário, a infecção não se instalará.
  • O trojan bancário poderá controlar totalmente o computador infectado, tirando screenshots, monitorando os navegadores e sites abertos, instalando um keylogger, controlando o mouse, bloqueando a tela ao acessar algum site de banco, terminando processos e abrindo páginas de phishing em overlay, visando capturar credenciais bancárias.
  • Uma vez ativo, o novo trojan monitorará nas vítimas o acesso a 26 sites de bancos brasileiros, 6 sites de exchanges de criptomoedas e 1 plataforma de pagamentos.
  • Todas as infecções são modulares e realizadas na memória, com mínima atividade em disco, usando PowerShell, .NET e shellcode criptografado usando Donut.
  • O novo trojan usa IA no processo de escrita de código, especialmente na descriptografia de certificados e no desenvolvimento geral do código.
  • Bloqueamos no Brasil mais de 62 mil tentativas de infecção usando LNK maliciosos como esse do Maverick no mês de Outubro.

Vetor inicial de infecção

A cadeia de infecção funciona de acordo com o diagrama abaixo:

A infecção começa quando a vítima recebe um arquivo .LNK malicioso dentro de um arquivo ZIP por meio de uma mensagem do WhatsApp. O nome do arquivo pode ser genérico ou pode fingir ser de um banco:

O LNK é codificado para executar o cmd.exe com os seguintes argumentos:

Os comandos decodificados apontam para a execução de um script PowerShell:

O comando entrará em contato com o C2 para baixar outro script do PowerShell. É importante observar que o C2 também valida o “User-Agent” da requisição HTTP para garantir que ela esteja vindo do comando do PowerShell. É por isso que, sem o “User-Agent” correto, o C2 retorna o código HTTP 401.

O script de entrada é usado para decodificar um arquivo .NET incorporado a ele, e tudo isso ocorre somente na memória. O arquivo .NET é decodificado dividindo cada byte por um valor específico; no script acima, o valor é “174”. O arquivo PE é decodificado e é então carregado como um assembly .NET dentro do processo do PowerShell, tornando toda a infecção fileless, ou seja, sem arquivos em disco.

Loader inicial em .NET

O loader .NET inicial é fortemente ofuscado usando o Control Flow Flattening e chamadas indiretas de função, armazenando-as em um grande vetor de funções e chamando-as a partir daí. Além da ofuscação, ele também utiliza nomes aleatórios de métodos e variáveis ​​para dificultar a análise. Mesmo assim, após nossa análise, conseguimos reconstruir (até certo ponto) seu fluxo principal, que consiste em baixar e descriptografar dois payloads.

A ofuscação não permite ocultar os nomes das variáveis ​​do método, o que significa que é possível reconstruir a função facilmente, se a mesma função for reutilizada em outro lugar. A maioria das funções usadas neste estágio inicial são as mesmas usadas no estágio final do trojan bancário, que não é ofuscado. O único propósito deste estágio é baixar dois shellcodes criptografados do C2. Para solicitá-los, será usada uma API que o C2 expõe nas rotas “/api/v1/”. A URL solicitada é a seguinte:

  • “hxxps://sorvetenopote[.]com/api/v1/3d045ada0df942c983635e”

Para se comunicar com sua API, ele envia a chave de API no campo “X-Request-Headers” do cliente HTTP. A chave de API utilizada é calculada localmente usando o seguinte algoritmo:

  • “Base64(HMAC256(Key))”

O HMAC é usado para assinar mensagens com uma chave específica; neste caso, o agente da ameaça o utiliza para gerar a “Chave API” usando a chave HMAC “MaverickZapBot2025SecretKey12345”. Os dados assinados enviados para o C2 são “3d045ada0df942c983635e|1759847631|MaverickBot”, onde cada segmento é separado por “|”. O primeiro segmento refere-se ao recurso específico solicitado (o primeiro shellcode criptografado), o segundo é o registro de data e hora da infecção e o último, “MaverickBot”, indica que este protocolo C2 pode ser usado em campanhas futuras com diferentes variantes desta ameaça. Isso garante que ferramentas como wget ou downloaders HTTP não consigam baixar esta etapa, apenas o malware.

Após a resposta, o shellcode criptografado é um carregador usando Donut. Neste ponto, o carregador inicial será iniciado e se seguirá em dois caminhos diferentes de execução: outro carregador para seu infectador do WhatsApp é o payload final, que chamamos de “MaverickBanker”. Cada shellcode Donut incorpora um executável .NET. A shellcode é encriptada usando uma implementação do XOR, onde a chave é armazenada nos últimos bytes do binário retornado pelo C2. O algoritmo para descriptografar o shellcode é o seguinte:

  • Extraia os últimos 4 bytes (int32) do arquivo binário; isso indica o tamanho da chave de criptografia.
  • Caminhe para trás até chegar ao início da chave de criptografia (tamanho do arquivo – 4 – tamanho_chave).
  • Obtenha a chave XOR.
  • Aplique o XOR a todo o arquivo usando a chave obtida.

Módulo infector do WhatsApp

Após o segundo shellcode do Donut ser descriptografado e iniciado, ele carregará outro downloader usando o mesmo método de ofuscação do anterior. Ele se comporta de forma semelhante, mas desta vez baixará um arquivo PE em vez de um shellcode do Donut. Este arquivo PE é outro assembly .NET que será carregado no processo como um módulo.

Um dos namespaces usados ​​por este executável .NET é chamado “Maverick.StageOne”, que é considerado pelo invasor como o primeiro a ser carregado. Este estágio de download é usado exclusivamente para baixar o infector do WhatsApp da mesma forma que o estágio anterior. A principal diferença é que, desta vez, não se trata de um shellcode Donut criptografado, mas de outro executável .NET, o infector do WhatsApp, que será usado para sequestrar a conta da vítima e usá-la para enviar spam para seus contatos, a fim de se disseminar.

Este módulo, que também é ofuscado, é o infector do WhatsApp e representa o payload  final na cadeia de infecção. Ele inclui um script do WPPConnect, um projeto de automação do WhatsApp, de código aberto, além do executável do navegador Selenium, usado para automação web.

O nome do namespace executável é “ZAP”, uma palavra muito comum no Brasil para se referir ao “WhatsApp”. Esses arquivos usam quase as mesmas técnicas de ofuscação dos exemplos anteriores, mas os nomes das variáveis ​​do método permanecem no código-fonte. O principal comportamento dessa etapa é localizar a janela do WhatsApp no ​​navegador e usar o WPPConnect para instrumentá-la, fazendo com que a vítima infectada envie mensagens para seus contatos e, assim, se espalhe novamente. O arquivo enviado depende do executável “MaverickBot”, que será discutido na próxima seção.

Trojan bancário Maverick

O Maverick Banker vem de um ramo de execução diferente do infector do WhatsApp; é o resultado do segundo shellcode do Donut. Não há etapas adicionais do download para executá-lo. Este é o principal payload desta campanha e está incorporado dentro de outro executável criptografado chamado “Maverick Agent”, que realiza atividades estendidas na máquina, como contatar o C2 e registrar chaves. Ele é descrito na próxima seção.

No carregamento inicial do Maverick Banker, ele tentará registrar a persistência usando a pasta de inicialização. Nesse ponto, se a persistência não existir, pela verificação da existência de um arquivo .bat no diretório “Startup”, ele não apenas verificará a existência do arquivo, mas também executará uma correspondência de padrões para verificar se a string “for %%” está presente, o que faz parte do processo de carregamento inicial. Se tal arquivo não existir, ele gerará um novo “GUID” e removerá os 6 primeiros caracteres. O script em lote de persistência será então armazenado como:

  • “C:\Users\<user>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\” + “HealthApp-” + GUID + “.bat”.

Em seguida, ele gerará o comando bat usando a URL codificada, que neste caso é “hxxps://sorvetenopote[.]com“. A URL final será semelhante a:

  • hxxps://sorvetenopote[.]com” + “/api/itbi/startup/” + NEW_GUID.

Na função de geração do comando, é possível ver a criação de um PowerShell ofuscado inteiramente novo.

Primeiro, ele criará uma variável chamada “$URL” e atribuirá a ela o conteúdo passado por parâmetro, criará um objeto “Net.WebClient” e chamará a função “DownloadString.Invoke($URL)”. Imediatamente após criar esses pequenos comandos, ele os codificará em base64. Em geral, o script criará uma ofuscação completa usando funções para gerar blocos de forma automática e aleatória no PowerShell. O script de persistência remonta o arquivo LNK inicial usado para inicializar a infecção.

Este mecanismo de persistência parece um pouco estranho à primeira vista, já que sempre depende do C2 estar online. No entanto, é de fato inteligente, já que o malware não funcionaria sem o C2. Assim, salvar somente o arquivo .bat do bootstrap garante que toda a infecção permaneça na memória. Se a persistência for alcançada, ele iniciará sua verdadeira função, sendo principalmente monitorar os navegadores para verificar se abrem páginas bancárias.

Os navegadores em execução na máquina são então verificados em busca de possíveis domínios acessados ​​na máquina da vítima para verificar a página web visitada pela vítima. O programa usará a janela em primeiro plano atual (janela em foco) e seu PID; com o PID, extrairá o nome do processo. O monitoramento só continuará se a vítima estiver usando um dos seguintes navegadores:

  • Chrome
  • Firefox
  • MS Edge
  • Brave
  • Internet Explorer
  • Navegador de banco

Se qualquer navegador da lista acima estiver em execução, ele usará a Automação de Interface do Usuário para extrair o título da guia aberta no momento e usar essa informação com uma lista predefinida de sites de internet banking de destino para determinar se deve executar alguma ação neles. A lista de bancos de destino é compactada com gzip, criptografada usando AES-256 e armazenada como uma string em base64. O vetor de inicialização (IV) do AES é armazenado nos primeiros 16 bytes dos dados em base64 decodificados, e a chave é armazenada nos 32 bytes seguintes. Os dados criptografados reais começam no deslocamento 48.

Este mecanismo de criptografia é o mesmo usado pelo Coyote, um trojan bancário também escrito em .NET e documentado por nós no início de 2024.

Se algum desses bancos for encontrado, o programa descriptografar outro arquivo PE usando o mesmo algoritmo descrito na seção Loader inicial em .NET deste relatório e o carregará como um assembly, chamando seu ponto de entrada com o nome do banco aberto como argumento. Esse novo PE é chamado de “Maverick.Agent” e contém a maior parte da lógica do banco para contatar o C2 e extrair dados com ele.

Maverick Agent

O agente é o binário que fará a maior parte do trabalho do banqueiro; ele primeiro verificará se está sendo executado em uma máquina localizada no Brasil. Para isso, ele verificará as seguintes restrições:

O que cada um deles faz é:

  • IsValidBrazilianTimezone()
    Verificar se o fuso horário atual está dentro do intervalo de fuso horário brasileiro. O Brasil possui fusos horários entre UTC-5 (-300 min) e UTC-2 (-120 min). Se o fuso horário atual estiver dentro desse intervalo, retorna “true”.
  • IsBrazilianLocale()
    Verificar se o idioma ou local atual da thread está definido como português do Brasil. Por exemplo, “pt-BR”, “pt_br” ou qualquer string que contenha “portuguese” e “brazil”. Retorna “true” se a condição for atendida.
  • IsBrazilianRegion()
    Verificar se a região configurada do sistema é o Brasil. Compara códigos de região como “BR”, “BRA” ou verifica se o nome da região contém “brazil”. Retorna “true” se a região estiver definida como Brasil.
  • IsBrazilianDateFormat()
    Verificar se o formato de data abreviada segue o padrão brasileiro. O formato brasileiro é dd/MM/aaaa. A função verifica se o padrão começa com “dd/” e contém “/MM/” ou “dd/MM”.

Logo após a verificação, ele ativará o suporte a DPI apropriado para o sistema operacional e o tipo de monitor, garantindo que as imagens sejam nítidas, se ajustem à escala correta (zoom da tela) e funcionem bem em vários monitores com resoluções diferentes. Em seguida, ele verificará se há alguma persistência em execução, criada anteriormente em “C:\Users\<user>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\”. Se mais de um arquivo for encontrado, ele excluirá os outros com base em “GetCreationTime” e manterá apenas o criado mais recentemente.

Comunicação com C2

A comunicação utiliza a biblioteca WatsonTCP com túneis SSL. Ela utiliza um certificado X509 local criptografado para proteger a comunicação, o que é outra semelhança com o malware Coyote. A conexão é feita com o host “casadecampoamazonas.com” na porta 443. O certificado é exportado como criptografado e a senha usada para descriptografá-lo é “Maverick2025!”. Após a descriptografia do certificado, o cliente se conectará ao servidor.


Para o C2 funcionar, é necessário que uma senha específica seja enviada durante o primeiro contato. A senha usada pelo agente é “101593a51d9c40fc8ec162d67504e221”. O uso dessa senha durante a primeira conexão autenticará o agente com sucesso no C2, e ele estará pronto para receber comandos do operador. Os comandos importantes são:

Comando Descrição
INFOCLIENT Retorna as informações do agente, que são usadas para identificá-lo no C2. As informações utilizadas são descritas na próxima seção
RECONNECT Desconecta, espera por alguns segundos e reconecte novamente ao C2
REBOOT Reinicia o computador
KILLAPPLICATION Mata o processo do malware
SCREENSHOT Tira um printscreen e envia para o C2, comprimido em formato gzip
KEYLOGGER Ativa o keylogger, captura os dados localmente e somente os envia quando o servidor especificado solicita pelos logs
MOUSECLICK Dá um clique com o mouse, usado para conexões remotas
KEYBOARDONECHAR Digita determinado caractere, usado nas conexões remotas
KEYBOARDMULTIPLESCHARS Enviar múltiplos caracteres, usados ​​para conexão remota
TOOGLEDESKTOP Habilita conexão remota e enviar várias capturas de tela para a máquina quando elas forem alteradas (ele calcula um hash de cada captura de tela para garantir que não seja a mesma imagem)
TOOGLEINTERN Obtenha uma captura de tela de uma janela específica
GENERATEWINDOWLOCKED Bloqueia a tela usando o site dos bancos.
LISTALLHANDLESOPENEDS Enviar para o servidor todos os identificadores abertos
KILLPROCESS Mata alguns processos a partir do handle
CLOSEHANDLE Fecha um handle
MINIMIZEHANDLE Minimiza uma janela usando um handle
MAXIMIZEHANDLE Maximiza uma janela usando um handle
GENERATEWINDOWREQUEST Gera uma janela com um site de phishing, pedindo credenciais de acesso

Agent profile info

No comando “INFOCLIENT”, as informações enviadas ao C2 são as seguintes:

  • ID do Agente: um hash SHA256 de todos os endereços MAC primários usados ​​por todas as interfaces
  • Nome de usuário
  • Nome do host
  • Versão do sistema operacional
  • Versão do cliente (sem valor)
  • Número de monitores
  • Página inicial (home): home indica qual tela inicial do banco deve ser usada sendo enviada antes da descriptografia do Agente pela rotina de monitoramento do aplicativo bancário.
  • Resolução da tela

Conclusão

De acordo com nossa telemetria, todas as vítimas estavam no Brasil, mas o trojan tem potencial para se espalhar para outros países, já que uma vítima infectada pode enviá-lo para outro local. Mesmo assim, o malware foi projetado para atingir somente brasileiros no momento.

É evidente que essa ameaça é muito sofisticada e complexa; toda a cadeia de execução é relativamente nova, mas o payload final apresenta muitas sobreposições de código e semelhanças com o trojan bancário Coyote, documentado por nós em 2024. No entanto, algumas das técnicas são exclusivas do Coyote e foram observadas em outros trojans bancários de baixo perfil, escritos em .NET. A estrutura do agente também é diferente de como o Coyote operava; ele não utilizava essa arquitetura antes.

É muito provável que o Maverick seja um novo trojan bancário, usando código compartilhado do Coyote, o que pode indicar que os desenvolvedores do Coyote reformularam completamente e reescreveram grande parte de seus componentes.

Esta é uma das cadeias mais complexas que já detectamos quando o objetivo é carregar um trojan bancário. Ele infectou muitas pessoas no Brasil e sua natureza semelhante a um worm permite que se espalhe exponencialmente, explorando um mensageiro instantâneo muito popular. O impacto é enorme.

Além disso, demonstra o uso de IA no processo de escrita de código, especialmente na descriptografia de certificados, o que também pode indicar o envolvimento da IA ​​no desenvolvimento geral do código. O Maverick funciona como qualquer outro trojan bancário, mas os aspectos preocupantes são seu método de entrega e seu grande impacto.

Detectamos toda a cadeia de infecção desde o primeiro dia, prevenindo a infecção da vítima a partir do primeiro LNK. Os produtos da Kaspersky detectam essa ameaça com os vereditos HEUR:Trojan.Multi.Powenot.a e HEUR:Trojan-Banker.MSIL.Maverick.gen

IoCs de referencia

Dominio IP ASN
casadecampoamazonas[.]com 181.41.201.184 212238
sorvetenopote[.]com 77.111.101.169 396356

Maverick: Novo Trojan bancário distribuído via WhatsApp

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

 

Relatórios

Maverick: Novo Trojan bancário distribuído via WhatsApp

Uma campanha recente de malware foi detectada no Brasil, distribuindo um arquivo LNK malicioso usando o WhatsApp. Toda a cadeia de infecção é complexa e fileless, e ela entregará um novo trojan bancário chamado “Maverick”, que contém muito código compartilhado de Coyote.