Jia Yu Chan

Perseguindo Redemoinhos: Novo InfoStealer baseado em Rust usado em campanhas de CAPTCHA

O Elastic Security Labs analisa o EDDIESTEALER, um infostealer leve e usado em campanhas emergentes baseadas em CAPTCHA.

45 minutos de leituraAnálise de malware
Perseguindo Eddies: Novo InfoStealer baseado em Rust usado em campanhas de CAPTCHA

Preâmbulo

O Elastic Security Labs descobriu um novo infostealer baseado em Rust distribuído por meio de campanhas de CAPTCHA falso. Este malware está hospedado em várias propriedades da web controladas pelo adversário. Esta campanha utiliza páginas enganosas de verificação de CAPTCHA que induzem os usuários a executar um script malicioso do PowerShell, que, por fim, implanta o infostealer, coletando dados confidenciais, como credenciais, informações do navegador e detalhes da carteira de criptomoedas. Estamos chamando esse malware de EDDIESTEALER.

Essa adoção do Rust no desenvolvimento de malware reflete uma tendência crescente entre agentes de ameaças que buscam aproveitar recursos de linguagem modernos para maior furtividade, estabilidade e resiliência contra fluxos de trabalho de análise tradicionais e mecanismos de detecção de ameaças. Um infostealer aparentemente simples escrito em Rust geralmente requer esforços de análise mais dedicados em comparação ao seu equivalente em C/C++, devido a fatores como abstrações de custo zero, sistema de tipos do Rust, otimizações do compilador e dificuldades inerentes na análise de binários seguros para memória.

Principais conclusões

  • Campanha CAPTCHA falsa carrega EDDIESTEALER
  • EDDIESTEALER é um infostealer Rust recentemente descoberto que tem como alvo hosts Windows
  • EDDIESTEALER recebe uma lista de tarefas do servidor C2 identificando dados para o alvo

Acesso inicial

Visão geral

CAPTCHAs falsos são construções maliciosas que replicam a aparência e a funcionalidade de sistemas CAPTCHA legítimos, usados para distinguir entre usuários humanos e bots automatizados. Diferentemente de seus equivalentes legítimos, os CAPTCHAs falsos servem como portas de entrada para malware, aproveitando a engenharia social para enganar os usuários. Eles geralmente aparecem como avisos como "Verifique se você é um humano" ou "Não sou um robô", combinando perfeitamente com sites comprometidos ou campanhas de phishing. Também encontramos uma campanha semelhante distribuindo GHOSTPULSE no final de 2024.

Da nossa análise de telemetria até a entrega do EDDIESTEALER, o vetor inicial foi um site comprometido implantando um payload JavaScript ofuscado baseado em React que exibe uma tela de verificação falsa "Não sou um robô".

Imitando a interface de verificação reCAPTCHA do Google, o malware usa o método document.execCommand("copy") para copiar um comando do PowerShell para a área de transferência do usuário. Em seguida, ele instrui o usuário a pressionar Windows + R (para abrir a caixa de diálogo Executar do Windows), depois Ctrl + V para colar o conteúdo da área de transferência e, finalmente, Enter para executar o comando malicioso do PowerShell.

Este comando baixa silenciosamente uma carga útil de segundo estágio (gverify.js) do domínio controlado pelo invasor hxxps://llll.fit/version/ e a salva na pasta Downloads do usuário.

Por fim, o malware executa gverify.js usando cscript em uma janela oculta.

gverify.js é outra carga útil JavaScript ofuscada que pode ser desofuscada usando ferramentas de código aberto. Sua funcionalidade é bastante simples: buscar um executável (EDDIESTEALER) de hxxps://llll.fit/io e salvar o arquivo na pasta Downloads do usuário com um nome de arquivo pseudoaleatório de 12 caracteres.

EDDIESTEALER

Visão geral

EDDIESTEALER é um novo infostealer de commodities baseado em Rust. A maioria das sequências de caracteres que revelam sua intenção maliciosa são criptografadas. O malware não possui proteções robustas anti-sandbox/VM contra impressão digital comportamental. No entanto, variantes mais recentes sugerem que as verificações anti-sandbox/VM podem estar ocorrendo no lado do servidor. Com recursos relativamente simples, ele recebe uma lista de tarefas do servidor C2 como parte de sua configuração para direcionar dados específicos e pode se autoexcluir após a execução, se especificado.

Símbolos Despojados

Os exemplos do EDDIESTEALER continham símbolos de função simplificados, provavelmente usando a opção de compilação padrão do Rust, exigindo restauração de símbolos antes da análise estática. Usamos rustbinsign, que gera assinaturas para bibliotecas padrão do Rust e cria com base em versões específicas do Rust/compilador/dependência. Embora rustbinsign tenha detectado apenas hashbrown e rustc-demangle, sugerindo que poucas caixas externas foram usadas, ele não conseguiu identificar caixas como tinyjson e tungstenite em variantes mais recentes. Isso ocorreu devido à falta de artefatos de cordas claros. Ainda é possível identificar manualmente as caixas encontrando sequências de caracteres exclusivas e pesquisando o repositório no GitHub, depois baixar, compilar e criar assinaturas para elas usando o modo download_sign . É um pouco complicado se não sabemos a versão exata da caixa que está sendo usada. No entanto, restaurar a biblioteca padrão e os símbolos de tempo de execução é suficiente para avançar o processo de análise estática.

Ofuscação de Strings

EDDIESTEALER criptografa a maioria das strings por meio de uma cifra XOR simples. A descriptografia envolve duas etapas: primeiro, a chave XOR é derivada chamando uma das diversas funções de derivação de chaves; depois, a descriptografia é executada em linha dentro da função que usa a string.

O exemplo a seguir ilustra isso, onde sub_140020fd0 é a função de derivação da chave e data_14005ada8 é o endereço do blob criptografado.

Cada rotina de descriptografia utiliza sua própria função distinta de derivação de chave. Essas funções aceitam consistentemente dois argumentos: um endereço dentro do binário e um valor constante de 4 bytes. Algumas operações básicas são então executadas nesses argumentos para calcular o endereço onde a chave XOR reside.

O Binary Ninja tem um recurso útil chamado User-Informed Data Flow (UIDF), que podemos usar para definir as variáveis com valores conhecidos para acionar uma análise de propagação constante e simplificar as expressões. Caso contrário, um emulador de CPU como o Unicorn emparelhado com uma ferramenta de análise binária programável também pode ser útil para análise em lote.

Há um padrão geral para inicialização lenta e segura de recursos compartilhados, como strings criptografadas para nomes de módulos, domínio e porta C2, o identificador exclusivo da amostra — que são descriptografados apenas uma vez, mas referenciados muitas vezes durante o tempo de execução. Cada função getter específica verifica um sinalizador de status para seu recurso; se não inicializada, ela chama uma função de sincronização compartilhada de baixo nível. Esta rotina de sincronização usa operações atômicas e primitivas de espera do sistema operacional (WaitOnAddress/WakeByAddressAll) para garantir que apenas um thread execute a lógica de inicialização real, que é invocada indiretamente por meio de um ponteiro de função na vtable de um objeto dyn Trait .

Ofuscação de API

O EDDIESTEALER utiliza um mecanismo de pesquisa WinAPI personalizado para a maioria das chamadas de API. Ele começa descriptografando os nomes do módulo e da função de destino. Antes de tentar a resolução, ele verifica uma tabela de hash mantida localmente para ver se o nome e o endereço da função já foram resolvidos. Se não for encontrado, ele carrega dinamicamente o módulo necessário usando um wrapper LoadLibrary personalizado no espaço de endereço do processo e invoca uma implementação bem conhecida de GetProcAddress para recuperar o endereço da função exportada. O nome e o endereço da API são então inseridos na tabela de hash, otimizando pesquisas futuras.

Criação de Mutex

O EDDIESTEALER começa criando um mutex para garantir que apenas uma instância do malware seja executada a qualquer momento. O nome do mutex é uma string UUID descriptografada 431e2e0e-c87b-45ac-9fdb-26b7e24f0d39 (única por amostra), que é posteriormente referenciada mais uma vez durante seu contato inicial com o servidor C2.

Detecção de Sandbox

EDDIESTEALER realiza uma verificação rápida para avaliar se a quantidade total de memória física está acima de ~4,0 GB como um mecanismo fraco de detecção de sandbox. Se a verificação falhar, ele será excluído do disco.

Autoexclusão

Com base em uma técnica de autoexclusão semelhante observada no LATRODECTUS, o EDDIESTEALER é capaz de se autoexcluir por meio da renomeação de NTFS Alternate Data Streams, para ignorar bloqueios de arquivos.

O malware usa GetModuleFileName para obter o caminho completo do seu executável e CreateFileW (envolvido em jy::ds::OpenHandle) para abrir um identificador para seu arquivo executável com os direitos de acesso apropriados. Em seguida, uma estrutura FILE_RENAME_INFO com um novo nome de fluxo é passada para SetFileInformationByHandle para renomear o fluxo padrão $DATA para :metadata. O identificador do arquivo é fechado e reaberto, desta vez usando SetFileInformationByHandle no identificador com o sinalizador FILE_DISPOSITION_INFO.DeleteFile definido como TRUE para habilitar um sinalizador "excluir ao fechar o identificador".

Solicitação de configuração adicional

Os dados de configuração inicial são armazenados como strings criptografadas dentro do binário. Uma vez descriptografados, esses dados são usados para construir uma solicitação seguindo o padrão URI: <C2_ip_or_domain>/<resource_path>/<UUID>. O resource_path é especificado como api/handler. O UUID, utilizado anteriormente para criar um mutex, é usado como um identificador exclusivo para rastreamento de compilação.

O EDDIESTEALER então se comunica com seu servidor C2 enviando uma solicitação HTTP GET com o URI construído para recuperar uma configuração de segundo estágio contendo uma lista de tarefas para o malware executar.

Os dados de configuração do segundo estágio são criptografados em AES CBC e codificados em Base64. O IV codificado em Base64 é adicionado na mensagem antes dos dois pontos (:).

Base64(IV):Base64(AESEncrypt(data))

A chave AES para descriptografar a mensagem do servidor para o cliente é armazenada sem criptografia na codificação UTF-8, na seção .rdata . Ele é recuperado por meio de uma função getter.

A configuração descriptografada para este exemplo contém o seguinte no formato JSON:

  • ID da sessão
  • Lista de tarefas (dados a serem segmentados)
  • Chave AES para criptografia de mensagens cliente-servidor
  • Sinalizador de autoexclusão
{
    "session": "<unique_session_id>",
    "tasks": [
        {
            "id": "<unique_task_id>",
            "prepare": [],
            "pattern": {
                "path": "<file_system_path>",
                "recursive": <true/false>,
                "filters": [
                    {
                        "path_filter": <null/string>,
                        "name": "<file_or_directory_name_pattern>",
                        "entry_type": "<FILE/DIR>"
                    },
                    ...
                ]
            },
            "additional": [
                {
                    "command": "<optional_command>",
                    "payload": {
                        "<command_specific_config>": <value>
                    }
                },
                ...
            ]
        },
        ...
    ],
    "network": {
        "encryption_key": "<AES_encryption_key>"
    },
    "self_delete": <true/false>
}

Para este exemplo específico e com base nas tarefas recebidas do servidor durante nossa análise, aqui está a lista de alvos de exfiltração baseados em sistema de arquivos:

  • Carteiras de criptomoedas
  • Navegadores
  • Gerenciadores de senhas
  • Clientes FTP
  • Aplicativos de mensagens
Carteira de criptomoedasFiltro de caminho de destino
Arsenal%appdata%\\Armory\\*.wallet
Bitcoin%appdata%\\Bitcoin\\wallets\\*
Carteira Wasabi%appdata%\\WalletWasabi\\Client\\Wallets\\*
Rede principal Daedalus%appdata%\\Daedalus Mainnet\\wallets\\*
Coinomi%localappdata%\\Coinomi\\Coinomi\\wallets\\*
Eletro%appdata%\\Electrum\\wallets\\*
Exodus%appdata%\\Exodus\\exodus.wallet\\*
DashCore%appdata%\\DashCore\\wallets\\*
ElectronCash%appdata%\\ElectronCash\\wallets\\*
Electrum-DASH%appdata%\\Electrum-DASH\\wallets\\*
Guarda%appdata%\\Guarda\\IndexedDB
Atômico%appdata%\\atomic\\Local Storage
NavegadorFiltro de caminho de destino
Microsoft Edge%localappdata%\\Microsoft\\Edge\\User Data\\
[Web Data,History,Bookmarks,Local Extension Settings\\...]
Corajoso%localappdata%\\BraveSoftware\\Brave-Browser\\User Data\\
[Web Data,History,Bookmarks,Local Extension Settings\\...]
Google Chrome%localappdata%\\Google\\Chrome\\User Data\\
[Web Data,History,Bookmarks,Local Extension Settings\\...]
Mozilla Firefox%appdata%\\Mozilla\\Firefox\\Profiles\\
[key4.db,places.sqlite,logins.json,cookies.sqlite,formhistory.sqlite,webappsstore.sqlite,*+++*]
Gerenciador de senhasFiltro de caminho de destino
Bitwarden%appdata%\\Bitwarden\\data.json
1Password%localappdata%\\1Password\\
[1password.sqlite,1password_resources.sqlite]
KeePass%userprofile%\\Documents\\*.kdbx
Cliente FTPFiltro de caminho de destino
FileZilla%appdata%\\FileZilla\\recentservers.xml
Gerenciador de FTP Lite%localappdata%\\DeskShare Data\\FTP Manager Lite\\2.0\\FTPManagerLiteSettings.db
Caixa FTP%appdata%\\FTPbox\\profiles.conf
FTP Commander Deluxe%ProgramFiles(x86)%\\FTP Commander Deluxe\\FTPLIST.TXT
Gerenciador de FTP automático%localappdata%\\DeskShare Data\\Auto FTP Manager\\AutoFTPManagerSettings.db
3D-FTP%programdata%\\SiteDesigner\\3D-FTP\\sites.ini
FTPGetter%appdata%\\FTPGetter\\servers.xml
Comandante Total%appdata%\\GHISLER\\wcx_ftp.ini
Aplicativo de mensagensFiltro de caminho de destino
Telegram Desktop%appdata%\\Telegram Desktop\\tdata\\*

Uma lista de extensões de navegador direcionadas pode ser encontrada aqui.

Essas metas estão sujeitas a alterações, pois são configuráveis pelo operador C2.

O EDDIESTEALER então lê os arquivos de destino usando funções kernel32.dll padrão como CreateFileW, GetFileSizeEx, ReadFile e CloseHandle.

Tráfego C2 subsequente

Após recuperar as tarefas com sucesso, o EDDIESTEALER executa a criação de perfil do sistema para coletar algumas informações sobre o sistema infectado:

  • Localização do executável (GetModuleFileNameW)
  • ID de localidade (GetUserDefaultLangID)
  • Nome de usuário (GetUserNameW)
  • Quantidade total de memória física (GlobalMemoryStatusEx)
  • Versão do sistema operacional (RtlGetVersion)

Seguindo o mesmo formato de dados (Base64(IV):Base64(AESEncrypt(data))) para mensagens de cliente para servidor, as informações iniciais do host são criptografadas em AES usando a chave recuperada da configuração adicional e enviada por meio de uma solicitação HTTP POST para <C2_ip_or_domain>/<resource_path>/info/<session_id>. Posteriormente, para cada tarefa concluída, os dados coletados também são criptografados e transmitidos em solicitações POST separadas para <C2_ip_or_domain>/<resource_path><session_id>/<task_id>, logo após a conclusão de cada tarefa. Essa metodologia gera um padrão distinto de tráfego C2 caracterizado por múltiplas solicitações POST específicas de tarefas. Esse padrão é particularmente fácil de identificar porque essa família de malware depende principalmente de HTTP em vez de HTTPS para sua comunicação C2.

Nossa análise revelou strings criptografadas que descriptografam para strings de metadados de pânico, revelando caminhos de arquivos de origem internos do Rust, como:

  • apps\bin\src\services\chromium_hound.rs
  • apps\bin\src\services\system.rs
  • apps\bin\src\structs\search_pattern.rs
  • apps\bin\src\structs\search_entry.rs

Descobrimos que as mensagens de erro enviadas ao servidor C2 contêm essas sequências de caracteres, incluindo o arquivo de origem exato, o número da linha e o número da coluna onde o erro se originou, permitindo que o desenvolvedor do malware tenha feedback de depuração integrado.

Capacidades específicas do Chromium

Desde a introdução da criptografia vinculada a aplicativos, os desenvolvedores de malware se adaptaram a métodos alternativos para contornar essa proteção e obter acesso a dados confidenciais não criptografados, como cookies. O ChromeKatz é uma das soluções de código aberto mais bem recebidas que vimos malware implementar. EDDIESTEALER não é exceção — os desenvolvedores de malware o reimplementaram em Rust.

Abaixo está um trecho da lógica de verificação da versão do navegador semelhante ao COOKIEKATZ, após recuperar informações de versão de %localappdata%\<browser_specific_path>\\User Data\\Last Version.

Padrão de assinatura COOKIEKATZ para detectar instâncias de COOKIEMONSTER:

Padrão de assinatura CredentialKatz para detectar instâncias do CookieMonster:

Aqui está um exemplo da lógica exata de copiar e colar do FindPattern do COOKIEKATZ, onde PatchBaseAddress é embutido.

Os desenvolvedores introduziram uma modificação para lidar com casos em que o navegador Chromium alvo não está em execução. Se inativo, EDDIESTEALER gera uma nova instância do navegador usando os argumentos de linha de comando --window-position=-3000,-3000 https://google.com. Isso efetivamente posiciona a nova janela bem longe da tela, tornando-a invisível para o usuário. O objetivo é garantir que o malware ainda possa ler a memória (ReadProcessMemory) do processo filho necessário - o processo de serviço de rede identificado pelo sinalizador --utility-sub-type=network.mojom.NetworkService . Para uma explicação mais detalhada dessa interação do processo do navegador, consulte nossa pesquisa anterior sobre infostealers MaaS.

Diferenças com variantes

Após a análise, amostras mais recentes foram identificadas com capacidades adicionais.

As informações coletadas nas máquinas das vítimas agora incluem:

  • Running processes
  • Informações da GPU
  • Número de núcleos de CPU
  • Nome da CPU
  • Fornecedor de CPU

O padrão de comunicação C2 foi ligeiramente alterado. O malware agora envia preventivamente informações do sistema host para o servidor antes de solicitar sua configuração descriptografada. Em alguns casos em que a máquina vítima conseguiu acessar o servidor C2, mas recebeu uma lista de tarefas vazia, o ajuste sugere uma tática de evasão: os desenvolvedores provavelmente introduziram verificações no lado do servidor para criar o perfil do ambiente do cliente e reter a configuração principal se um sandbox ou sistema de análise for detectado.

A chave de criptografia para comunicação cliente-servidor não é mais recebida dinamicamente do servidor C2; em vez disso, ela agora é codificada no binário. A chave usada pelo cliente para descriptografar mensagens do servidor para o cliente também permanece codificada.

Amostras compiladas mais recentes exibem uso extensivo de expansão de função em linha, onde muitas funções — tanto definidas pelo usuário quanto de bibliotecas e caixas padrão — foram incorporadas diretamente em seus chamadores com mais frequência, resultando em funções maiores e dificultando o isolamento do código do usuário. Esse comportamento provavelmente é resultado do uso do inliner do LLVM. Embora algumas funções permaneçam não incorporadas, a incorporação generalizada complica ainda mais a análise.

Para obter todas as entradas do Gerenciador de Senhas do Chrome, o EDDIESTEALER inicia sua rotina de roubo de credenciais gerando um novo processo do Chrome com o sinalizador --remote-debugging-port=<port_num> , habilitando o Protocolo DevTools do Chrome em uma interface WebSocket local. Isso permite que o malware interaja com o navegador de forma autônoma, sem exigir nenhuma interação visível do usuário.

Após iniciar o Chrome, o malware consulta http://localhost:<port>/json/version para recuperar o webSocketDebuggerUrl, que fornece o ponto de extremidade para interagir com a instância do navegador via WebSocket.

Usando essa conexão, ele emite um comando Target.createTarget com o parâmetro chrome://password-manager/passwords, instruindo o Chrome a abrir seu gerenciador de senhas interno em uma nova guia. Embora esta página interna não exponha seu conteúdo diretamente ao DOM ou ao DevTools, abri-la faz com que o Chrome descriptografe e carregue as credenciais armazenadas na memória. Esse comportamento é explorado pelo EDDIESTEALER em etapas subsequentes por meio do código semelhante ao CredentialKatz, onde ele verifica a memória do processo do Chrome para extrair credenciais de texto simples depois que elas são carregadas pelo navegador.

Com base nas strings descriptografadas os_crypt, encrypted_key, CryptUnprotectData, local_state_pattern e login_data_pattern, as variantes do EDDIESTEALER parecem ser compatíveis com versões anteriores, suportando versões do Chrome que ainda utilizam criptografia DPAPI.

Identificamos 15 amostras adicionais de EDDIESTEALER por meio de similaridades de código e infraestrutura no VirusTotal. A tabela de observações incluirá as amostras descobertas, endereços IP/domínios C2 associados e uma lista de infraestrutura que hospeda o EDDIESTEALER.

Algumas dicas de análise

Rastreio

Para entender melhor o fluxo de controle e identificar os destinos exatos de saltos indiretos ou chamadas em grandes blocos de código, podemos aproveitar técnicas de rastreamento binário. Ferramentas como TinyTracer podem capturar um rastreamento de API e gerar um arquivo .tag , que mapeia quaisquer chamadas de API selecionadas a serem gravadas na linha de execução no assembly. As funções da biblioteca padrão do Rust chamam WinAPIs internamente, e isso também captura qualquer código que chama funções WinAPI diretamente, ignorando a abstração da biblioteca padrão. O arquivo de tags pode então ser importado para ferramentas de descompilação para marcar automaticamente os blocos de código usando plugins como IFL.

Metadados de pânico para segmentação de código

Metadados de pânico - os caminhos de arquivo de origem incorporados (arquivos .rs), números de linha e números de coluna associados aos locais de pânico - oferecem pistas valiosas para segmentar e entender diferentes partes do binário. No entanto, isso só acontece se esses metadados não tiverem sido removidos do binário. Caminhos como apps\bin\src\services\chromium.rs, apps\bin\src\structs\additional_task.rs ou qualquer caminho que pareça parte de um projeto personalizado normalmente apontam para a lógica exclusiva do aplicativo. Caminhos que começam com library<core/alloc/std>\src\ indicam código da biblioteca padrão Rust. Caminhos contendo nome e versão da caixa, como hashbrown-0.15.2\src\raw\mod.rs , apontam para bibliotecas externas.

Se o projeto de malware tiver uma base de código um tanto organizada, os caminhos de arquivo nas strings de pânico podem ser mapeados diretamente para módulos lógicos. Por exemplo, a string descriptografada apps\bin\src\utils\json.rs:48:39 é referenciada em sub_140011b4c.

Ao examinar a árvore de chamadas para chamadas recebidas para a função, muitas delas retornam para sub_14002699d. Esta função (sub_14002699d) é chamada dentro de uma rotina de comunicação C2 conhecida (jy::C2::RetrieveAndDecryptConfig), logo após descriptografar dados de configuração adicionais conhecidos por serem formatados em JSON.

Com base no caminho json.rs e seu contexto de chamada, um palpite bem fundamentado seria que sub_14002699d é responsável por analisar dados JSON. Podemos verificar isso passando por cima da chamada de função. Com certeza, ao inspecionar a estrutura de pilha que é passada como referência para a chamada de função, ela agora aponta para um endereço de heap preenchido com campos de configuração analisados.

Para caixas de biblioteca padrão e de terceiros de código aberto, o caminho do arquivo, o número da linha e (se disponível) o hash de confirmação do rustc ou a versão da caixa permitem que você pesquise o código-fonte exato online.

Reutilização de Slot de Pilha

Um dos recursos de otimização envolve a reutilização de slots de pilha para variáveis/estruturas de pilha que não têm linhas de tempo sobrepostas. Variáveis que não estão “ativas” ao mesmo tempo podem compartilhar o mesmo local de memória da pilha, reduzindo o tamanho geral do quadro da pilha. Essencialmente, uma variável está ativa desde o momento em que lhe é atribuído um valor até o último ponto em que esse valor pode ser acessado. Isso torna a saída descompilada confusa, pois o mesmo deslocamento de memória pode conter tipos ou valores diferentes em pontos diferentes.

Para lidar com isso, podemos definir uniões abrangendo todos os tipos possíveis que compartilham o mesmo deslocamento de memória dentro da função.

Tratamento de erros de ferrugem e enumerações

As enumerações Rust são uniões marcadas que definem tipos com diversas variantes, cada uma contendo dados opcionalmente, ideais para modelar estados como sucesso ou falha. As variantes são identificadas por um discriminante (tag).

O código de tratamento de erros pode ser visto em todo o binário, constituindo uma parte significativa do código descompilado. O mecanismo principal do Rust para tratamento de erros é a enumeração genérica Result<T, E> . Ele tem duas variantes: Ok(T), indicando sucesso e contendo um valor do tipo T, e Err(E), indicando falha e contendo um valor de erro do tipo E.

No snippet de exemplo abaixo, um valor discriminante de 0x8000000000000000 é usado para diferenciar os resultados da resolução da API CreateFileW . Se CreateFileW for resolvido com sucesso, o tipo de variável reuse conterá o ponteiro de função da API e a ramificação else será executada. Caso contrário, a ramificação if é executada, atribuindo uma sequência de informações de erro de reuse a arg1.

Para mais informações sobre como outros tipos comuns de Rust podem aparecer na memória, confira esta folha de dicas e esta palestra incrível de Cindy Xiao!

Malware e MITRE ATT&CK

A Elastic usa a estrutura MITRE ATT&CK para documentar táticas, técnicas e procedimentos comuns que as ameaças usam contra redes corporativas.

Táticas

Técnicas

Técnicas representam como um adversário atinge um objetivo tático executando uma ação.

Detecções

YARA

A Elastic Security criou as seguintes regras YARA relacionadas a esta pesquisa:

Regras de prevenção comportamental

Observações

Os seguintes observáveis foram discutidos nesta pesquisa.

ObservávelTipoNomeReferência
47409e09afa05fcc9c9eff2c08baca3084d923c8d82159005dbae2029e1959d0SHA-256MvUlUwagHeZd.exeEDDIESTEALER
162a8521f6156070b9a97b488ee902ac0c395714aba970a688d54305cb3e163fSHA-256:metadata (copy)EDDIESTEALER
f8b4e2ca107c4a91e180a17a845e1d7daac388bd1bb4708c222cda0eff793e7aSHA-256AegZs85U6COc.exeEDDIESTEALER
53f803179304e4fa957146507c9f936b38da21c2a3af4f9ea002a7f35f5bc23dSHA-256:metadata (copy)EDDIESTEALER
20eeae4222ff11e306fded294bebea7d3e5c5c2d8c5724792abf56997f30aaf9SHA-256PETt3Wz4DXEL.exeEDDIESTEALER
1bdc2455f32d740502e001fce51dbf2494c00f4dcadd772ea551ed231c35b9a2SHA-256Tk7n1al5m9Qc.exeEDDIESTEALER
d905ceb30816788de5ad6fa4fe108a202182dd579075c6c95b0fb26ed5520daaSHA-256YykbZ173Ysnd.exeEDDIESTEALER
b8b379ba5aff7e4ef2838517930bf20d83a1cfec5f7b284f9ee783518cb989a7SHA-2562025-04-03_20745dc4d048f67e0b62aca33be80283_akira_cobalt-strike_satacomEDDIESTEALER
f6536045ab63849c57859bbff9e6615180055c268b89c613dfed2db1f1a370f2SHA-2562025-03-23_6cc654225172ef70a189788746cbb445_akira_cobalt-strikeEDDIESTEALER
d318a70d7f4158e3fe5f38f23a241787359c55d352cb4b26a4bd007fd44d5b80SHA-2562025-03-22_c8c3e658881593d798da07a1b80f250c_akira_cobalt-strikeEDDIESTEALER
73b9259fecc2a4d0eeb0afef4f542642c26af46aa8f0ce2552241ee5507ec37fSHA-2562025-03-22_4776ff459c881a5b876da396f7324c64_akira_cobalt-strikeEDDIESTEALER
2bef71355b37c4d9cd976e0c6450bfed5f62d8ab2cf096a4f3b77f6c0cb77a3bSHA-256TWO[1].fileEDDIESTEALER
218ec38e8d749ae7a6d53e0d4d58e3acf459687c7a34f5697908aec6a2d7274dSHA-256EDDIESTEALER
5330cf6a8f4f297b9726f37f47cffac38070560cbac37a8e561e00c19e995f42SHA-256verifcheck.exeEDDIESTEALER
acae8a4d92d24b7e7cb20c0c13fd07c8ab6ed8c5f9969504a905287df1af179bSHA-2563zeG4jGjFkOy.exeEDDIESTEALER
0f5717b98e2b44964c4a5dfec4126fc35f5504f7f8dec386c0e0b0229e3482e7SHA-256verification.exeEDDIESTEALER
e8942805238f1ead8304cfdcf3d6076fa0cdf57533a5fae36380074a90d642e4SHA-256g_verify.jsCarregador EDDIESTEALER
7930d6469461af84d3c47c8e40b3d6d33f169283df42d2f58206f43d42d4c9f4SHA-256verif.jsCarregador EDDIESTEALER
45.144.53[.]145endereço-ipv4EDDIESTEALER C2
84.200.154[.]47endereço-ipv4EDDIESTEALER C2
shiglimugli[.]xyznome de domínioEDDIESTEALER C2
xxxivi[.]comnome de domínioEDDIESTEALER C2 e infraestrutura intermediária
llll[.]fitnome de domínioInfraestrutura intermediária EDDIESTEALER
plasetplastik[.]comnome de domínioInfraestrutura intermediária EDDIESTEALER
militrex[.]wikinome de domínioInfraestrutura intermediária EDDIESTEALER

Referências

Os seguintes itens foram referenciados ao longo da pesquisa acima:

Compartilhe este artigo