É 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.

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.

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.

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.

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](https://web-assets.esetstatic.com/wls/2025/02-25/deceptivedevelopment/figure-5.png)
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.

Tanto BeaverTail quanto InvisibleFerret foram documentados anteriormente por Unit 42, Group-IB e Objective-See. Zscaler . 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.


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.

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.

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.

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. |

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.

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).

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.

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.

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.

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.

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.

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 |
48E75D6E2BDB2B00ECBF |
FCCCall.exe | Win64/DeceptiveDevelopment.A | Trojanized conferencing app – native BeaverTail. |
EC8B6A0A7A7407CA3CD1 |
pay.py | Python/DeceptiveDevelopment.B | InvisibleFerret payload module. |
3F8EF8649E6B9162CFB0 |
bow.py | Python/DeceptiveDevelopment.C | InvisibleFerret browser module. |
F6517B68F8317504FDCD |
pay_u2GgOA8.py | Python/DeceptiveDevelopment.B | InvisibleFerret new payload module. |
01C0D61BFB4C8269CA56 |
setupTest.js | JS/Spy.DeceptiveDevelopment.A | BeaverTail. |
2E3E1B95E22E4A8F4C75 |
tailwind.config |
JS/Spy.DeceptiveDevelopment.A | BeaverTail. |
7C8724B75BF7A9B8F27F |
conf.ps1 | PowerShell/DeceptiveDevelopment.A | AnyDesk configuration PowerShell script. |
5F5D3A86437082FA512B |
adc.py | Python/DeceptiveDevelopment.A | InvisibleFerret AnyDesk module. |
7C5B2CAFAEABBCEB9765 |
bow.py | Python/DeceptiveDevelopment.A | InvisibleFerret browser module. |
BA1A54F4FFA42765232B |
pay.py | Python/DeceptiveDevelopment.A | InvisibleFerret payload module. |
6F049D8A0723DF10144C |
.npl | Python/DeceptiveDevelopment.A | InvisibleFerret loader module. |
8FECA3F5143D15437025 |
admin.model.js | JS/Spy.DeceptiveDevelopment.A | BeaverTail. |
380BD7EDA453487CF115 |
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 |