É amplamente reconhecido que os cibercriminosos frequentemente se aproximam de suas vítimas fingindo ser recrutadores de empresas, oferecendo vagas de emprego falsas. Afinal, qual momento seria mais propício para um ataque do que quando a vítima potencial está distraída com a esperança de conquistar uma oportunidade profissional? Desde o início de 2024, pesquisadores da ESET identificaram uma série de atividades maliciosas associadas à Coreia do Norte, nas quais os cibercriminosos, disfarçados de caçadores de talentos, enviam aos alvos projetos de software que ocultam malware projetado para roubo de informações. Denominamos esse conjunto de atividades de DeceptiveDevelopment.

Como parte de um falso processo de entrevista de emprego, os operadores do DeceptiveDevelopment pedem aos seus alvos que realizem um teste de codificação, como adicionar uma função a um projeto existente, com os arquivos necessários para a tarefa geralmente hospedados em repositórios privados no GitHub ou outras plataformas similares. Infelizmente para o candidato, esses arquivos estão trojanizados: uma vez baixado e executado o projeto, o computador da vítima é comprometido com o malware de primeira fase da operação, BeaverTail.

O DeceptiveDevelopment foi descrito publicamente pela primeira vez pela Phylum e Unit 42 em 2023, e já foi parcialmente documentado sob os nomes Contagious Interview e DEV#POPPER. Realizamos uma análise mais detalhada desse grupo de atividades e dos métodos de acesso inicial, infraestrutura de rede e o conjunto de ferramentas de seu operador, incluindo novas versões das duas famílias de malware usadas pelo DeceptiveDevelopment: InvisibleFerret e a mencionada BeaverTail.

Pontos principais deste post:

  • O DeceptiveDevelopment visa desenvolvedores de software freelancers por meio de spearphishing em sites de busca de emprego e plataformas de freelancing, com o objetivo de roubar carteiras de criptomoedas e informações de login de navegadores e gerenciadores de senhas.
  • Ativa desde pelo menos novembro de 2023, essa operação utiliza principalmente duas famílias de malware: BeaverTail (infostealer, downloader) e InvisibleFerret (infostealer, RAT).
  • As táticas, técnicas e procedimentos (TTP) do DeceptiveDevelopment são semelhantes aos de outras operações conhecidas alinhadas com a Coreia do Norte.

Observamos pela primeira vez essa campanha do DeceptiveDevelopment no início de 2024, quando descobrimos projetos trojanizados hospedados no GitHub com código malicioso oculto no final de longos comentários, o que deslocava o código para fora da tela. Esses projetos continham os programas maliciosos BeaverTail e InvisibleFerret. Além de analisar as duas famílias de malware, também começamos a investigar a infraestrutura de C&C por trás da campanha. Desde então, temos acompanhado esse cluster e seus avanços na estratégia e nas ferramentas utilizadas nesses ataques em andamento. Este post descreve as TTP dessa campanha, assim como o malware que utiliza.

Perfil do DeceptiveDevelopment

O DeceptiveDevelopment é um grupo de atividades alinhado com a Coreia do Norte que atualmente não atribuirmos a cibercriminosos conhecidos. Os operadores por trás do DeceptiveDevelopment visam desenvolvedores de software em Windows, Linux e macOS. O principal objetivo é roubar criptomoedas para obter benefícios econômicos, com um possível objetivo secundário de ciberespionagem.

Para se aproximar de seus alvos, esses operadores utilizam perfis de recrutadores falsos em redes sociais, assim como o grupo Lazarus na Operação DreamJob. No entanto, enquanto a Operação DreamJob se dirigia a engenheiros de defesa e aeroespaciais, o DeceptiveDevelopment visa desenvolvedores de software autônomos, muitas vezes envolvidos em projetos de criptomoedas. Para comprometer os computadores de suas vítimas, o DeceptiveDevelopment fornece bases de código trojanizadas que implantam backdoors como parte de um falso processo de entrevista de emprego.

Victimologia

Os principais alvos dessa campanha do DeceptiveDevelopment são desenvolvedores de software, principalmente aqueles envolvidos em projetos de criptomoeda e finanças descentralizadas. Os cibercriminosos não fazem distinção geográfica e seu objetivo é comprometer o maior número possível de vítimas para aumentar a probabilidade de extrair com sucesso fundos e informações.

Observamos centenas de vítimas diferentes em todo o mundo, usando os três principais sistemas operacionais: Windows, Linux e macOS. Entre elas, havia desde desenvolvedores iniciantes até profissionais altamente experientes. Observamos apenas conversas entre cibercriminosos e vítimas em inglês, mas não podemos afirmar com certeza que os atacantes não utilizem ferramentas de tradução para se comunicar com vítimas que não falam o idioma. A Figura 1 mostra um mapa com a distribuição global das vítimas.

Figure 1. Heatmap different victims of DeceptiveDevelopment
Figura 1. Mapa das vítimas do DeceptiveDevelopment.

Atribuição

Consideramos, com alta confiança, que o DeceptiveDevelopment é um cluster de atividade alinhado à Coreia do Norte, com base em diversos elementos:

  • Observamos conexões entre contas do GitHub controladas pelos cibercriminosos e contas que contêm CVs falsos usados por trabalhadores de TI norte-coreanos. Essas pessoas solicitam empregos em empresas estrangeiras com identidades falsas para receber salários e ajudar a financiar o regime. As conexões observadas eram seguidores mútuos entre perfis de GitHub, onde uma parte estava associada ao DeceptiveDevelopment e a outra continha CVs falsos e outros materiais relacionados à atividade de trabalhadores norte-coreanos. A Unit42 também observou conexões semelhantes. Infelizmente, as páginas do GitHub foram fechadas antes que pudéssemos registrar todas as provas.
  • As TTP (uso de recrutadores falsos, desafios de emprego trojanizados e software utilizado durante as entrevistas) são semelhantes a outras atividades alinhadas com a Coreia do Norte (Moonstone Sleet e as campanhas DreamJob e DangerousPassword do Lazarus).

Além das conexões entre perfis do GitHub, o malware usado no DeceptiveDevelopment é bastante simples. Isso coincide com os relatórios da Mandiant, que afirmam que o trabalho dos cibercriminosos geralmente é de baixa qualidade.

Enquanto monitorávamos a atividade do DeceptiveDevelopment, vimos vários casos que demonstravam falta de atenção aos detalhes por parte dos cibercriminosos. Em alguns casos, os operadores da ameaça não eliminaram notas de desenvolvimento nem comentaram os endereços IP locais usados para desenvolvimento e testes. Também vimos amostras nas quais parecia que se esqueceram de ofuscar o endereço de C&C após alterá-lo; isso pode ser visto na Figura 2. Além disso, o malware utiliza ferramentas de ofuscação de código aberto, às vezes com links nos comentários do código.

Figure 2. Examples of comments and obfuscation forgotten in the code
Figura 2. Exemplos de comentários e ofuscação esquecidos no código.

Análise Técnica

Acesso inicial

Para se passar por recrutadores, os cibercriminosos copiam perfis de pessoas existentes ou até criam novos personagens. Eles então se dirigem diretamente a suas vítimas potenciais em plataformas de busca de emprego e de trabalho freelancer ou publicam ofertas de emprego falsas nelas. No início, os criminosos usavam perfis novos e se limitavam a enviar links para projetos maliciosos no GitHub através do LinkedIn para seus alvos. Logo depois, começaram a usar perfis que pareciam estabelecidos, com muitos seguidores e conexões, para parecer mais confiáveis, e se expandiram para mais sites de busca de emprego e hospedagem de código. Enquanto alguns desses perfis são criados pelos próprios cibercriminosos, outros são perfis potencialmente comprometidos de pessoas reais na plataforma, modificados pelos atacantes.

Algumas das plataformas nas quais essas interações acontecem são sites genéricos de busca de emprego, enquanto outras se concentram principalmente em projetos de criptomoeda e blockchain, mais alinhados com os objetivos dos cibercriminosos. As plataformas incluem:

  • LinkedIn;
  • Upwork;
  • Freelancer.com;
  • We Work Remotely;
  • Moonlight;
  • Crypto Jobs List.

O vetor de comprometimento mais comumente observado consiste no falso recrutador fornecer à vítima um projeto trojanizado sob o pretexto de um desafio de contratação ou de ajudar o "recrutador" a corrigir um erro em troca de uma recompensa econômica.

As vítimas recebem os arquivos do projeto diretamente por meio de transferência de arquivos no site ou por meio de um link para um repositório como GitHub, GitLab ou Bitbucket. É pedido que baixem os arquivos, adicionem funções ou corrijam erros e informem ao recrutador. Além disso, é solicitado que criem e executem o projeto para testá-lo, o que resulta no comprometimento inicial. Os repositórios usados são geralmente privados, por isso é solicitado que a vítima forneça seu ID de conta ou endereço de e-mail para poder acessá-los, muito provavelmente para esconder a atividade maliciosa dos pesquisadores.

Apesar disso, observamos muitos casos em que esses repositórios estavam disponíveis publicamente, mas percebemos que pertenciam principalmente a vítimas que, após concluir suas tarefas, os carregaram em seus próprios repositórios. A Figura 3 mostra um exemplo de projeto trojanizado hospedado no GitHub. Já informamos todos os códigos maliciosos observados aos serviços afetados.

Figure 3. README of a trojanized GitHub project
Figura 3. README de um projeto trojanizado no GitHub.

Os projetos trojanizados pertencem a uma dessas quatro categorias:

  • Desafios de contratação;
  • Projetos de criptomoeda;
  • Jogos (normalmente com funcionalidade blockchain);
  • Jogos de azar com funcionalidades de blockchain/criptomoeda.

Estes repositórios são frequentemente duplicações de projetos de código aberto ou demonstrações existentes, com poucas ou nenhuma alteração além de adicionar o código malicioso e modificar o arquivo README. Alguns dos nomes de projetos maliciosos e os nomes das contas controladas por cibercriminosos que os operam (onde conseguimos avaliá-los) estão listados na Tabela 1.

Tabela 1. Nomes de projetos observados e autores de repositórios/commits.

Project Author Project Author
Website-Test Hiring-Main-Support casino-template-paid bmstore
guru-challenge Chiliz-Guru casino-demo casinogamedev
baseswap_ver_4 artemreinv point freebling-v3
metaverse-backend metaverse-ritech Blockchain-game N/A
lisk-parknetwork MariaMar1809 3DWorld-tectera-beta N/A

Também observamos que os atacantes se faziam passar por projetos e empresas existentes, utilizando nomes semelhantes ou adicionando LLC, Ag ou Inc (abreviações de tipos de empresas legais) aos nomes, como mostrado na Tabela 2.

Tabela 2. Nomes de projetos e repositórios/empresas observados com suplantação de projetos legítimos.

Project Author
Lumanagi-Dex LUMANAGI-LLC
DARKROOM-NFT DarkRoomAg
DarkRoom WonderKiln-Inc

Os cibercriminosos costumam usar um truque engenhoso para ocultar seu código malicioso: eles o colocam em um componente do projeto que, de outra forma, é benigno, normalmente dentro do código de backend não relacionado à tarefa atribuída ao desenvolvedor, onde o adicionam como uma única linha após um longo comentário. Dessa forma, ele é deslocado para fora da tela e permanece oculto, a menos que a vítima role até ele ou tenha ativada a função de ajuste de palavras no editor de código. Curiosamente, o próprio editor de código do GitHub não permite o ajuste de palavras, de modo que o código malicioso é fácil de passar despercebido, mesmo ao visualizar o código no repositório, como mostrado na Figura 4.

Figure 4. Malicious code
Figura 4. Código malicioso adicionado após um comentário longo que o empurra para fora da tela no editor de código do GitHub (acima) e o código fonte da página com apenas a linha #1 visualizada em um editor de código com o ajuste de palavras ativado (abaixo).

Outro vetor de comprometimento que observamos envolvia um falso recrutador convidando a vítima para uma entrevista de emprego usando uma plataforma de conferência on-line e fornecendo um link para um site de onde era possível baixar o software necessário para a conferência. O site costuma ser um clone do site de uma plataforma de conferência existente, como mostrado na Figura 5, e o software baixado contém a primeira fase do malware.

Figure 5. Malicious website at mirotalk[.]net
Figura 5. Site malicioso em mirotalk[.]net, uma cópia do site legítimo de MiroTalk (sfu.mirotalk.com), que distribui malware disfarçado de software de conferência ao clicar no botão "Join Room" (Entrar na sala).

Conjunto de Ferramentas

O DeceptiveDevelopment utiliza principalmente duas famílias de malware como parte de suas atividades, distribuídas em duas etapas. A primeira etapa, BeaverTail, possui uma variante em JavaScript e outra nativa (escrita em C++ usando a plataforma Qt), sendo entregue à vítima disfarçada como parte de um projeto no qual se pede para trabalhar, um desafio de contratação ou dentro de um software de conferência remota infectado, como MiroTalk ou FreeConference.

O BeaverTail atua como um simples ladrão de credenciais, extraindo os bancos de dados de navegadores que contêm credenciais salvas, e como um downloader para a segunda etapa, o InvisibleFerret. Este é um malware modular baseado em Python que inclui spyware e componentes de backdoor, e também é capaz de baixar o software legítimo de gerenciamento e monitoramento remoto AnyDesk para atividades pós-ataque. A Figura 6 mostra a cadeia de comprometimento completa, desde o comprometimento inicial, passando pela exfiltração de dados, até a implantação do AnyDesk.

Figure 6. DeceptiveDevelopment compromise chain
Figura 6. Cadeia de comprometimento do DeceptiveDevelopment.

Tanto BeaverTail quanto InvisibleFerret foram documentados anteriormente por Unit 42Group-IB e Objective-SeeZscaler . A Zscaler também publicou uma pesquisa paralela, cujos resultados podemos confirmar de forma independente. Nossa análise contém detalhes que não haviam sido comunicados publicamente anteriormente e apresenta uma visão global da atividade maliciosa.

BeaverTail

BeaverTail é o nome do malware infostealer e downloader usado pelo DeceptiveDevelopment. Existem duas versões diferentes: uma escrita em JavaScript e colocada diretamente nos projetos infectados com uma simples ofuscação, e versões nativas, construídas usando a plataforma Qt, que se disfarçam de software de conferências e foram inicialmente descritas pela Objective-See. Ambas as versões apresentam grandes semelhanças em suas funcionalidades.

Este malware visa sistemas Windows, Linux e macOS, com o objetivo de coletar informações de login salvas e dados de carteiras de criptomoedas.

A ameaça começa obtendo o endereço IP e a porta do C&C. Embora os endereços IP variem, as portas utilizadas geralmente são 1224 ou 1244, o que torna a atividade maliciosa na rede facilmente identificável. Na versão JavaScript, o endereço IP e a porta são ofuscados usando codificação base64, divididos em três partes e trocados para evitar a decodificação automática. Outras strings também são codificadas com base64, frequentemente com um caractere fictício adicionado à string resultante para dificultar os esforços de decodificação. A versão nativa tem o IP, a porta e outras strings armazenadas em texto simples. O código JavaScript ofuscado pode ser visto na Figura 7, e o código desofuscado na Figura 8.

Figure 7. Obfuscated BeaverTail code
Figura 7. Código ofuscado do BeaverTail.
Figure 8. Deobfuscated BeaverTail code
Figura 8. Código desofuscado do BeaverTail.

A seguir, BeaverTail procura as extensões instaladas nos navegadores Google Chrome, Microsoft Edge, Opera e Brave e verifica se alguma delas corresponde aos nomes de extensões de uma lista codificada da Chrome Web Store ou Microsoft Edge Add-ons, que é exibida abaixo. O navegador que aparece entre parênteses é a fonte da extensão; note que tanto Opera quanto Brave também utilizam extensões da Chrome Web Store, pois são baseados no Chromium.

  • nkbihfbeogaeaoehlefnkodbefgpgknn - MetaMask (Chrome)
  • ejbalbakoplchlghecdalmeeeajnimhm - MetaMask (Edge)
  • fhbohimaelbohpjbbldcngcnapndodjp - Cartera con cadena BNB (Cromo)
  • hnfanknocfeofbddgcijnmhnfnkdnaad - Monedero Coinbase (Chrome)
  • ibnejdfjmmkpcnlpebklmnkoeoihofec - TronLink (Cromo)
  • bfnaelmomeimhlpmgjnjophhpkkoljpa - Phantom (Cromo)
  • fnjhmkhhmkbjkkabndcnnogagogbneec - Ronin Wallet (Cromo)
  • aeachknmefphepccionboohckonoeemg - Monedero Coin98 (Cromo)
  • hifafgmccdpekplomjjkcfgodnhcellj - Crypto.com Wallet (Cromo)

Se forem encontradas, todos os arquivos .ldb e .log dos diretórios das extensões são coletados e exfiltrados.

Além desses arquivos, o malware também visa um arquivo que contém as chaves Solana armazenadas no diretório pessoal do usuário em .config/solana/id.json. Em seguida, BeaverTail procura pelas informações de login salvas em /Library/Keychains/login.keychain (para macOS) ou /.local/share/keyrings/ (para Linux). Se existirem, os bancos de dados de login do Firefox key3.db, key4.db e logins.json de /.mozilla/firefox/ também são filtrados nesse momento.

Cada amostra do BeaverTail contém um ID de vítima utilizado para identificação. Esses IDs são usados ao longo de toda a cadeia de comprometimento como identificadores em todos os downloads e uploads. Suspeitamos que esses IDs sejam exclusivos para cada vítima e sejam usados para conectar as informações roubadas ao perfil público da vítima.

Os dados coletados, juntamente com o nome do host do computador e o carimbo de data e hora atual, são carregados no ponto final da API /uploads do servidor de C&C. A seguir, um ambiente Python independente é baixado em um arquivo chamado p2.zip, hospedado no servidor de C&C, para permitir a execução da próxima etapa. Por fim, a próxima etapa é baixada do servidor de C&C (ponto final da API /client/<campaign_ID>) para o diretório pessoal do usuário com o nome .npl e executada usando o ambiente Python baixado.

Em agosto de 2024, observamos uma nova versão do BeaverTail em JavaScript, onde o código colocado no projeto infectado atuava apenas como carregador e baixava e executava o código da carga útil real a partir de um servidor remoto. Essa versão também utilizava uma técnica de ofuscação diferente e adicionava quatro novas extensões de carteiras de criptomoedas à lista de alvos:

  • jblndlipeogpafnldhgmapagcccfchpi - Monedero Kaia (Chrome)
  • acmacodkjbdgmoleebolmdjonilkdbch - Monedero Rabby (Chrome)
  • dlcobpjiigpikoobohmabehhmhfoodbb - Argent X - Starknet Wallet (Cromo)
  • aholpfdialjgjfhomihkjbmgjidlcdno - Exodus Web3 Wallet (Cromo)

Ao investigar o site ipcheck[.]cloud, observamos que a página inicial é uma réplica do site malicioso mirotalk[.]net, que distribui malware nativo BeaverTail disfarçado de software de conferência remota, o que indica uma conexão direta entre o novo JavaScript e as versões nativas do BeaverTail.

InvisibleFerret

O InvisibleFerret é um malware Python modular com capacidades de roubo de informações e controle remoto pelos cibercriminosos. Ele é composto por quatro módulos: principal (o arquivo .npl), carga útil (pay), navegador (bow) e AnyDesk (adc). O malware não possui nenhum mecanismo de persistência além do cliente AnyDesk implantado no final da cadeia de comprometimento. Após obter persistência por meio do AnyDesk, os atacantes podem executar o InvisibleFerret à vontade.

Curiosamente, a maior parte da funcionalidade de backdoor exige um operador (ou comportamento de script) do outro lado enviando comandos, decidindo quais dados exfiltrar e como propagar o ataque. Em todas as versões do InvisibleFerret que observamos, os componentes do backdoor são ativados por ordem do operador. A única funcionalidade que não é executada pelo operador é o footprint inicial, que é realizado automaticamente.

Módulo principal

O módulo principal, originalmente chamado de main, é o arquivo .npl que o BeaverTail baixou do servidor C&C e salvou no diretório home. Ele é responsável por baixar e executar os módulos individuais de carga útil. Todos os módulos contêm uma carga útil criptografada com XOR e codificada em base64, precedida por quatro bytes representando a chave XOR, seguidos de código para descriptografá-la e executá-la por meio de exec, como mostrado na Figura 9. Cada módulo também contém a variável sType, que contém o ID da vítima atual. Esse ID é uma cópia do ID especificado na solicitação de download. Quando é feita uma solicitação para baixar o arquivo de script, a API do servidor de C&C coloca o ID fornecido como valor sType no arquivo final do script.

Figure 9. Decrypting and executing the InvisibleFerret payload
Figura 9. Descriptografando e executando o payload do InvisibleFerret.

Este módulo contém um endereço C&C codificado em base64 e dividido em duas metades, que foram trocadas para dificultar a decodificação. Na maioria dos casos que observamos, esse endereço era idêntico ao usado na amostra anterior do BeaverTail. O módulo principal baixa o módulo payload de /payload/<campaign_ID> para .n2/pay no diretório home do usuário e o executa. Em seguida, se for executado no macOS (determinando se uma chamada à função platform.system retorna Darwin), ele sai. Em outros sistemas operacionais, também baixa o módulo do navegador de /brow/<campaign_ID> para .n2/bow no diretório pessoal do usuário e o executa em uma instância Python independente.

Módulo payload

O módulo de payload é composto por duas partes: uma que coleta informações e outra que funciona como um backdoor. A primeira parte contém uma URL de C&C hardcodeada, normalmente semelhante às utilizadas anteriormente, e coleta o seguinte:

  • UUID do usuário;
  • tipo de SO;
  • nome do PC;
  • nome de usuário;
  • versão do sistema (release);
  • endereço IP local;
  • endereço IP público e informações de geolocalização (nome da região, país, cidade, código postal, ISP, latitude e longitude) extraídas de http://ip-api.com/json.

Essas informações, ilustradas na Figura 10, são carregadas no endpoint da API /keys através de uma requisição HTTP POST.

Figure 10. System information submitted by the payload module to the C&C server
Figura 10. Informações do sistema enviadas pelo módulo payload para o servidor C&C.

A segunda parte atua como um backdoor TCP, estabelecendo um shell reverso que aceita comandos remotos do servidor C&C e se comunica por meio de uma conexão socket. Embora utilize predominantemente a porta 1245, também foram observadas as portas 80, 2245, 3001 e 5000. Vale destacar que o endereço IP do C&C codificado nessa fase, em alguns casos, diferia dos anteriores — provavelmente para isolar a atividade de rede final mais suspeita do processo de implantação inicial.

O segundo payload verifica se está sendo executado no Windows — se sim, habilita um keylogger implementado usando pyWinHook e um ladrão de área de transferência utilizando pyperclip, mostrados na Figura 11. Estes coletam e armazenam qualquer pressionamento de tecla e alteração na área de transferência em um buffer global e são executados em uma thread dedicada enquanto o script está em execução.

Figure 11. Clipboard stealer and keylogger code
Figura 11. Código do ladrão de área de transferência e keylogger.

Depois, executa a funcionalidade do backdoor, que consiste em oito comandos, descritos na Tabela 3.

Tabela 3. Comandos implementados no InvisibleFerret.

ID Command Function Description
1 ssh_cmd Removes the compromise · Only supports the delete argument.
· Terminates operation and removes the compromise.
2 ssh_obj Executes shell commands · Executes the given argument[s] using the system shell via Python’s subprocess module and returns any output generated by the command.
3 ssh_clip Exfiltrates keylogger and clipboard stealer data · Sends the contents of the keylogger and clipboard stealer buffer to the C&C server and clears the buffer.
· On operating systems other than Windows, an empty response is sent, as the keylogging functionality is not enabled.
4 ssh_run Installs the browser module · Downloads the browser module to .n2/bow in the user’s home directory and executes it in a new Python instance (with the CREATE_NO_WINDOW and CREATE_NEW_PROCESS_GROUP flags set on Windows)
· Replies to the server with the OS name and get browse.
5 ssh_upload Exfiltrates files or directories, using FTP · Uploads files to a given FTP server with server address and credentials specified in arguments.
· Has six subcommands: · sdira, sdir, sfile, sfinda, sfindr, and sfind.

· sdira – uploads everything in a directory specified in args, skipping directories matching the first five elements in the ex_dirs array (listed below). Sends >> upload all start: followed by the directory name to the server when the upload starts, ‑counts: followed by the number of files selected for upload when directory traversal finishes, and uploaded success once everything is uploaded.

· sdir – similar to sdira, but exfiltrates only files smaller than 104,857,600 bytes (100 MB) with extensions not excluded by ex_files and directories not excluded by ex_dirs. The initial message to the server is >> upload start: followed by the directory name.

· sfile – similar to sdir, but exfiltrates only a single file. If the extension is .zip, .rar, .pdf, or is in the ex_files list (in this case not being used to exclude files for upload, but from encryption), it gets directly uploaded. Otherwise the file is encrypted using XOR with the hardcoded key G01d*8@( before uploading.

· sfinda – searches the given directory and all its subdirectories (excluding those in the ex_dirs list) for files matching a provided pattern, and uploads those not matching items in the ex_files list. When starting, sends >> ufind start: followed by the starting directory to the server, followed by ufind success after it finishes.

· sfindr – similar to sfinda, but without the recursive search. Searches only the specified directory.

· sfind – similar to sfinda, but starts the search in the current directory.

6 ssh_kill Terminates the Chrome and Brave browsers · Termination is done via the taskkill command on Windows or killall on other systems, as shown in Figure 12.
· Replies to the server with Chrome & Browser are terminated.
7 ssh_any Installs the AnyDesk module · This works identically to the ssh_run command, downloading the AnyDesk module to and executing it from the .n2 folder in the user’s home directory.
· Replies to the server with the OS name and get anydesk.
8 ssh_env Uploads data from the user’s home directory and mounted drives, using FTP · Sends --- uenv start to the server.
· Establishes an FTP connection using the server address and credentials provided in the arguments.
· On Windows, uploads the directory structure and contents of the Documents and Downloads folders, as well as the contents of drives D to I.
· On other systems, uploads the entirety of the user’s home directory and the /Volumes directory containing all mounted drives.
· Only uploads files smaller than 20,971,520 bytes (20 MB) and excludes directories matching the ex_dir list and files matching the ex_files, ex_files1, and ex_files2 lists described in Figure 13.
· Finishes by sending --- uenv success to the server.

Figure 12. Implementation of the ssh_kill command
Figura 12. Implementação do comando ssh_kill.

Cada comando é nomeado com o prefixo ssh_ e recebe um valor numérico que será utilizado na comunicação com o servidor. Para cada comando recebido, é criada uma nova thread para executá-lo e o cliente começa imediatamente a ouvir o próximo comando. As respostas aos comandos são enviadas de forma assíncrona à medida que os comandos terminam de ser executados. A comunicação bidirecional é realizada via sockets, em formato JSON, com dois campos:

  • command - que denota o ID numérico do comando.
    args - que contém qualquer dado adicional enviado entre o servidor e o cliente.

O script também contém listas de nomes de arquivos e diretórios excluídos (como cache e diretórios temporários de projetos e repositórios de software) que devem ser omitidos ao exfiltrar dados, além de uma lista de padrões de nomes interessantes para exfiltração (arquivos de ambiente e configuração; documentos, planilhas e outros arquivos que contenham palavras como secret, wallet, private, password, etc.).

Módulo do navegador

O módulo do navegador é responsável por roubar dados de login, dados de autocompletar e informações de pagamento salvas pelos navegadores web. Os navegadores alvo são Chrome, Brave, Opera, Yandex e Edge, todos baseados em Chromium, com várias versões listadas para cada um dos três principais sistemas operacionais (Windows, Linux, macOS), como mostrado na Figura 13.

Figure 13. Targeted browsers and their versions
Figura 13. Navegadores alvo e suas versões.

Busca nas pastas de armazenamento local do navegador (um exemplo é mostrado na Figura 14) e copia os bancos de dados que contêm informações de login e pagamento para a pasta %Temp% no Windows ou para a pasta /tmp em outros sistemas, em dois arquivos:

LoginData.db, que contém as informações de login dos usuários, e
webdata.db, que contém as informações de pagamento salvas (cartões de crédito).

Figure 14. Hardcoded local browser paths on Windows
Figura 14. Caminhos locais de navegação codificados no Windows.

Como as senhas e números de cartões de crédito salvos são armazenados em um formato criptografado com AES, é necessário descriptografá-los antes da exfiltração. As chaves de criptografia utilizadas para isso são obtidas conforme o sistema operacional utilizado. No Windows, elas são extraídas do arquivo Local State do navegador, no Linux, são obtidas através do pacote secretstorage, e no macOS, são obtidas através da ferramenta de segurança, como ilustrado na Figura 15.

Figure 15. Extracting the encryption keys for browser databases on Windows, Linux, and macOS
Figura 15. Extração das chaves de criptografia das bases de dados do navegador no Windows, Linux e macOS.

As informações coletadas (ver Figura 16) são então enviadas ao servidor C&C através de uma requisição HTTP POST ao endpoint API /keys.

Figure 16. Information submitted by the browser module to the C&C server
Figura 16. Informações enviadas pelo módulo do navegador ao servidor C&C.

Módulo AnyDesk

O módulo adc é o único mecanismo de persistência encontrado nesta cadeia de comprometimento, configurando o acesso AnyDesk ao computador da vítima usando um arquivo de configuração que contém credenciais de login codificadas.

No Windows, verifica se o arquivo C:/Program Files (x86)/AnyDesk/AnyDesk.exe existe. Caso não exista, baixa o anydesk.exe do servidor C&C (http://<C&C_IP>:<C&C_port>/anydesk.exe) para o diretório pessoal do usuário.

Em seguida, tenta configurar o AnyDesk para o acesso do cibercriminoso, inserindo valores hash de senha, salt de senha e salt de token codificados nos arquivos de configuração. Se os arquivos de configuração não existirem ou não contiverem um determinado valor de salt de senha especificado pelo cibercriminoso, o módulo tenta modificá-los para adicionar a informação de login codificada. Caso isso falhe, cria um script PowerShell no diretório pessoal do usuário chamado conf.ps1, que contém código para modificar os arquivos de configuração (mostrado na Figura 17) e tenta executá-lo.

Figure 17. PowerShell script to modify AnyDesk configuration
Figura 17. Script PowerShell para modificar a configuração do AnyDesk, adicionando hash e salt de senha codificados e sal de token.

Após essas ações, o processo AnyDesk é fechado e reiniciado para carregar a nova configuração. Por fim, o módulo adc tenta se apagar chamando a função os.remove.

Atualização do InvisibleFerret

Posteriormente, descobrimos uma versão atualizada do InvisibleFerret com mudanças significativas, utilizada pelo menos desde agosto de 2024. Agora, ele não está mais separado em módulos individuais, mas existe como um único arquivo de script de grande porte (mas ainda mantém os comandos de backdoor para instalar seletivamente os módulos do navegador e AnyDesk). Também há modificações de código para maior compatibilidade com o macOS, como, por exemplo, coletar o nome de usuário junto com o nome do host do computador.
Outra modificação observada foi a adição de um identificador chamado gType, além de sType. Ele funciona como um identificador secundário de vítima/campanha além do sType ao baixar módulos do servidor C&C (por exemplo, <C&C_IP>:<port>/<module>/<sType>/<gType>). Não observamos que ele seja utilizado para etiquetar os dados exfiltrados.

Essa nova versão do InvisibleFerret também implementou um comando backdoor adicional, o ssh_zcp, capaz de exfiltrar dados de extensões de navegador e gerenciadores de senhas via Telegram e FTP.

Com o novo comando, o InvisibleFerret primeiro busca e, se presentes, coleta dados de 88 extensões de navegador para os navegadores Chrome, Brave e Edge e depois os coloca em uma pasta de armazenamento no diretório temporário do sistema. A lista completa de extensões pode ser encontrada no Apêndice (logo abaixo), e o código para coletar os dados é mostrado na Figura 18.

Figure 18. Collection of data from browser extensions in the new version of InvisibleFerret
Figura 18. Coleta de dados das extensões do navegador na nova versão do InvisibleFerret.

Além dos dados das extensões, o comando também pode extrair informações dos carteiras de criptomoedas Atomic e Exodus em todos os sistemas, além de 1Password, Electrum, WinAuth, Proxifier4 e Dashlane no Windows. Isso é ilustrado na Figura 19.

Figure 19. Collection of data from various applications in the new version of InvisibleFerret
Figura 19. Coleta de dados de vários aplicativos na nova versão do InvisibleFerret.

Em seguida, os dados são arquivados e enviados para um chat do Telegram utilizando a API do Telegram com um token de bot, bem como para um servidor FTP. Após o upload, o InvisibleFerret apaga tanto a pasta de armazenamento quanto o arquivo.

Módulo de roubo de área de transferência

Em dezembro de 2024, descobrimos outra versão do InvisibleFerret, que continha um módulo adicional chamado mlip, baixado do endpoint de C&C /mclip/<campaign_ID> para .n2/mlip. Este módulo contém a funcionalidade de keylogging e roubo de área de transferência, que foi separada do resto do módulo de payload.
Como um avanço nas capacidades técnicas dos operadores, a funcionalidade de keylogging e roubo de área de transferência deste módulo foi limitada apenas a dois processos, chrome.exe e brave.exe, enquanto as versões anteriores do InvisibleFerret registravam todas as teclas pressionadas. Os dados coletados são enviados para um novo endpoint da API, /api/clip.

Infraestrutura de rede

A infraestrutura de rede do DeceptiveDevelopment é composta por servidores dedicados hospedados por provedores de hospedagem comerciais, sendo os três provedores mais utilizados RouterHosting (agora conhecido como Cloudzy), Stark Industries Solutions e Pier7ASN. A API do servidor está escrita em Node.js e consiste em nove endpoints, listados na Tabela 4.

Tabela 4. Endpoints da API de C&C do DeceptiveDevelopment.

API endpoint Description
/pdown Downloading the Python environment.
/uploads BeaverTail data upload.
/client/<campaign_ID> InvisibleFerret loader.
/payload/<campaign_ID> InvisibleFerret payload module.
/brow/<campaign_ID> InvisibleFerret browser module.
/adc/<campaign_ID> InvisibleFerret AnyDesk module.
/mclip/<campaign_ID> InvisibleFerret keylogger module.
/keys InvisibleFerret data upload.
/api/clip InvisibleFerret keylogger module data upload.

A maior parte da comunicação de C&C observada ocorria através das portas 1224 ou 1244 (ocasionalmente 80 ou 3000) para a comunicação de C&C via HTTP, e 1245 (ocasionalmente 80, 2245, 3001, 5000 ou 5001) para a comunicação de C&C de backdoor via sockets TCP. Toda comunicação do cliente com o servidor de C&C, exceto o download do ambiente Python, contém o ID da campanha. Para downloads do InvisibleFerret, o ID é adicionado ao final da URL na requisição GET. Para exfiltração de dados, o ID é enviado como parte da requisição POST no campo de tipo. Isso é útil para identificar o tráfego de rede e determinar a que amostra e campanha específica ele pertence.

Os IDs de campanha (valores sType e gType) observados são alfanuméricos e não parecem ter nenhuma relação direta com a campanha. Antes da introdução de gType, alguns dos valores sType eram cadeias base64 que continham variantes da palavra team e números, como 5Team9 e 7tEaM;. Após a introdução de gType, a maioria dos valores observados para ambos os valores era puramente numérica, sem o uso de base64.

Conclusão

O clúster DeceptiveDevelopment se junta à já extensa coleção de esquemas de obtenção de dinheiro utilizados por cibercriminosos alinhados com a Coreia do Norte e segue uma tendência crescente de migração do dinheiro tradicional para as criptomoedas. Durante nossa pesquisa, observamos uma evolução das ferramentas e técnicas primitivas para malwares mais avançados e capazes, além de técnicas mais refinadas para atrair as vítimas e distribuir o malware. Qualquer plataforma on-line de busca de emprego e trabalho freelance pode ser alvo de ataques por falsos recrutadores para a distribuição de malware. Continuamos observando atividade significativa relacionada a essa campanha e esperamos que o DeceptiveDevelopment continue inovando e buscando novas formas de atacar usuários de criptomoedas.

Para dúvidas ou informações sobre nossa pesquisa publicada no WeLiveSecurity, entre em contato pelo e-mail: threatintel@eset.com.

IoCs

Você pode encontrar uma lista completa de indicadores de compromisso (IoCs) e amostras em nosso repositório GitHub.

Arquivos

SHA-1 Filename Detection Description
48E75D6E2BDB2B00ECBF4801A98F96732E397858 FCCCall.exe Win64/DeceptiveDevelopment.A Trojanized conferencing app – native BeaverTail.
EC8B6A0A7A7407CA3CD18DE5F93489166996116C pay.py Python/DeceptiveDevelopment.B InvisibleFerret payload module.
3F8EF8649E6B9162CFB0C739F01043A19E9538E7 bow.py Python/DeceptiveDevelopment.C InvisibleFerret browser module.
F6517B68F8317504FDCD415653CF46530E19D94A pay_u2GgOA8.py Python/DeceptiveDevelopment.B InvisibleFerret new payload module.
01C0D61BFB4C8269CA56E0F1F666CBF36ABE69AD setupTest.js JS/Spy.DeceptiveDevelopment.A BeaverTail.
2E3E1B95E22E4A8F4C75334BA5FC30D6A54C34C1 tailwind.config.js JS/Spy.DeceptiveDevelopment.A BeaverTail.
7C8724B75BF7A9B8F27F5E86AAC9445AAFCCB6AC conf.ps1 PowerShell/DeceptiveDevelopment.A AnyDesk configuration PowerShell script.
5F5D3A86437082FA512B5C93A6B4E39397E1ADC8 adc.py Python/DeceptiveDevelopment.A InvisibleFerret AnyDesk module.
7C5B2CAFAEABBCEB9765D20C6A323A07FA928624 bow.py Python/DeceptiveDevelopment.A InvisibleFerret browser module.
BA1A54F4FFA42765232BA094AAAFAEE5D3BB2B8C pay.py Python/DeceptiveDevelopment.A InvisibleFerret payload module.
6F049D8A0723DF10144CB51A43CE15147634FAFE .npl Python/DeceptiveDevelopment.A InvisibleFerret loader module.
8FECA3F5143D15437025777285D8E2E3AA9D6CAA admin.model.js JS/Spy.DeceptiveDevelopment.A BeaverTail.
380BD7EDA453487CF11509D548EF5E5A666ACD95 run.js JS/Spy.DeceptiveDevelopment.A BeaverTail.

Rede

IP Domain Hosting provider First seen Details
95.164.17[.]24 N/A STARK INDUSTRIES SOLUTIONS LTD 2024‑06‑06 BeaverTail/InvisibleFerret C&C and staging server.
185.235.241[.]208 N/A STARK INDUSTRIES SOLUTIONS LTD 2021‑04‑12 BeaverTail/InvisibleFerret C&C and staging server.
147.124.214[.]129 N/A Majestic Hosting Solutions, LLC 2024‑03‑22 BeaverTail/InvisibleFerret C&C and staging server.
23.106.253[.]194 N/A LEASEWEB SINGAPORE PTE. LTD. 2024‑05‑28 BeaverTail/InvisibleFerret C&C and staging server.
147.124.214[.]237 N/A Majestic Hosting Solutions, LLC 2023‑01‑28 BeaverTail/InvisibleFerret C&C and staging server.
67.203.7[.]171 N/A Amaze Internet Services 2024‑02‑14 BeaverTail/InvisibleFerret C&C and staging server.
45.61.131[.]218 N/A RouterHosting LLC 2024‑01‑22 BeaverTail/InvisibleFerret C&C and staging server.
135.125.248[.]56 N/A OVH SAS 2023‑06‑30 BeaverTail/InvisibleFerret C&C and staging server.

Técnicas ATT&CK do MITRE

Esta tabela foi elaborada utilizando a versão 16 do framework MITRE ATT&CK.

Tactic ID Name Description
Resource Development T1583.003 Acquire Infrastructure: Virtual Private Server The attackers rent out infrastructure for C&C and staging servers.
T1587.001 Develop Capabilities: Malware The attackers develop the BeaverTail and InvisibleFerret malware.
T1585.001 Establish Accounts: Social Media Accounts The attackers create fake social media accounts, pretending to be recruiters.
T1608.001 Stage Capabilities: Upload Malware InvisibleFerret modules are uploaded to staging servers, from where they are downloaded to victimized systems.
Initial Access T1566.003 Phishing: Spearphishing via Service Spearphishing via job-hunting and freelancing platforms.
Execution T1059.006 Command-Line Interface: Python InvisibleFerret is written in Python.
T1059.007 Command-Line Interface: JavaScript/JScript BeaverTail has a variant written in JavaScript.
T1204.002 User Execution: Malicious File Initial compromise is triggered by the victim executing a trojanized project containing the BeaverTail malware.
T1059.003 Command-Line Interface: Windows Command Shell InvisibleFerret’s remote shell functionality allows access to the Windows Command Shell.
Persistence T1133 External Remote Services Persistence is achieved by installing and configuring the AnyDesk remote access tool.
Defense Evasion T1140 Deobfuscate/Decode Files or Information The JavaScript variant of BeaverTail uses code obfuscation. C&C server addresses and other configuration data are also encrypted/encoded.
T1564.001 Hide Artifacts: Hidden Files and Directories InvisibleFerret files are dropped to disk with the hidden attribute.
T1564.003 Hide Artifacts: Hidden Window InvisibleFerret creates new processes with their windows hidden.
T1027.013 Obfuscated Files or Information: Encrypted/Encoded File InvisibleFerret payloads are encrypted and have to be decrypted before execution.
Credential Access T1555.001 Credentials from Password Stores: Keychain Keychain data is exfiltrated by both BeaverTail and InvisibleFerret.
T1555.003 Credentials from Password Stores: Credentials from Web Browsers Credentials stored in web browsers are exfiltrated by InvisibleFerret.
T1552.001 Unsecured Credentials: Credentials In Files Plaintext credentials/keys in certain files are exfiltrated by both BeaverTail and InvisibleFerret.
Discovery T1010 Application Window Discovery The InvisibleFerret keylogger collects the name of the currently active window.
T1217 Browser Bookmark Discovery Credentials and other data stored by browsers are exfiltrated by InvisibleFerret.
T1083 File and Directory Discovery The InvisibleFerret backdoor can browse the filesystem and exfiltrate files.
T1082 System Information Discovery System information is collected by both BeaverTail and InvisibleFerret.
T1614 System Location Discovery InvisibleFerret geolocates the campaign by querying the IP address location.
T1016 System Network Configuration Discovery InvisibleFerret collects network information, such as private and public IP addresses.
T1124 System Time Discovery InvisibleFerret collects the system time.
Lateral Movement T1021.001 Remote Services: Remote Desktop Protocol AnyDesk is used by InvisibleFerret to achieve persistence and allow remote attacker access.
Collection T1056.001 Input Capture: Keylogging InvisibleFerret contains keylogger functionality.
T1560.002 Archive Collected Data: Archive via Library Data exfiltrated using InvisibleFerret can be archived using the py7zr and pyzipper Python packages.
T1119 Automated Collection Both BeaverTail and InvisibleFerret exfiltrate some data automatically.
T1005 Data from Local System Both BeaverTail and InvisibleFerret exfiltrate data from the local system.
T1025 Data from Removable Media InvisibleFerret scans removable media for files to exfiltrate.
T1074.001 Data Staged: Local Data Staging InvisibleFerret copies browser databases to the temp folder prior to credential extraction. When exfiltrating via a ZIP/7z archive, the file is created locally before being uploaded.
T1115 Clipboard Data InvisibleFerret contains clipboard stealer functionality.
Command and Control T1071.001 Standard Application Layer Protocol: Web Protocols C&C communication is done over HTTP.
T1071.002 Standard Application Layer Protocol: File Transfer Protocols Files are exfiltrated over FTP by InvisibleFerret.
T1571 Non-Standard Port Nonstandard ports 1224, 1244, and 1245 are used by BeaverTail and InvisibleFerret.
T1219 Remote Access Tools InvisibleFerret can install AnyDesk as a persistence mechanism.
T1095 Non-Application Layer Protocol TCP is used for command and control communication.
Exfiltration T1030 Data Transfer Size Limits In some cases, InvisibleFerret exfiltrates only files below a certain file size.
T1041 Exfiltration Over Command and Control Channel Some data is exfiltrated to the C&C server over HTTP.
T1567.004 Exfiltration Over Web Service: Exfiltration Over Webhook Exfiltrating ZIP/7z files can be done over a Telegram webhook (InvisibleFerret’s ssh_zcp command).
Impact T1657 Financial Theft This campaign’s goal is cryptocurrency theft and InvisibleFerret has also been seen exfiltrating saved credit card information.

Apêndice

ArgentX
Aurox
Backpack
Binance
Bitget
Blade
Block
Braavos
ByBit
Casper
Cirus
Coin98
CoinBase
Compass-Sei
Core-Crypto
Cosmostation
Crypto.com
Dashalane
Enkrypt
Eternl
Exodus
Fewcha-Move
Fluent
Frontier
GoogleAuth
Hashpack
HAVAH
HBAR
Initia
Keplr
Koala
LastPass
LeapCosmos
Leather
Libonomy
MagicEden
Manta
Martian
Math
MetaMask
MetaMask-Edge
MOBOX
Moso
MyTon
Nami
OKX
OneKey
OpenMask
Orange
OrdPay
OsmWallet
Paragon
PetraAptos
Phantom
Pontem
Rabby
Rainbow
Ramper
Rise
Ronin
Safepal
Sender
SenSui
Shell
Solflare
Stargazer
Station
Sub-Polkadot
Sui
Suiet
Suku
Taho
Talisman
Termux
Tomo
Ton
Tonkeeper
TronLink
Trust
Twetch
UniSat
Virgo
Wigwam
Wombat
XDEFI
Xverse
Zapit
Zerion