Mustang Panda et PlugX : Une plongée approfondie dans les opérations de téléchargement menées par hameçonnage
Detection stack
- AIDR
- Alert
- ETL
- Query
Résumé
Le rapport décrit une intrusion en plusieurs étapes attribuée au groupe Mustang Panda ayant des liens avec la Chine. La chaîne commence par un raccourci Windows (LNK) armé qui lance un chargeur PowerShell. Ce chargeur dépose une archive ZIP leurre, extrait une DLL chiffrée, puis déploie finalement le trojan d’accès à distance PlugX en utilisant le chargement réflexif et l’injection du thread-pool. Le trafic de commande et de contrôle est envoyé via HTTPS à une infrastructure associée à coastallasercompany.com. L’implant met également en œuvre des techniques d’évasion telles que le hachage des API, le parcours du PEB, et une forte obfuscation de chaînes pour réduire la détection statique.
Enquête
Les analystes ont reconstruit le chemin d’exécution de bout en bout : activation initiale du LNK, mise en scène PowerShell, chargement latéral de DLL, déchiffrement en mémoire, et exécution finale de PlugX. L’outillage utilise un hachage API de type DJB2 et un hachage ROL-13 pour la résolution des importations, ainsi qu’un blob de configuration chiffré en RC4. La persistance a été observée par la modification de la clé de registre HKCU Run. L’enquête a extrait des indicateurs préparés pour la détection, y compris des noms de fichiers, des hachages, et le domaine C2 utilisé pour le beaconing HTTPS.
Atténuation
Bloquer ou mettre en quarantaine les fichiers .lnk non fiables et restreindre l’exécution de PowerShell, en particulier les scripts qui lisent ou écrivent depuis des emplacements accessibles en écriture par l’utilisateur. Surveiller la création de fichiers suspects sous %LocalAppData%, notamment les noms de type GUID générés aléatoirement, et renforcer le comportement de l’ordre de recherche de DLL pour réduire les opportunités de chargement latéral. Appliquer des contrôles DNS/proxy pour refuser l’accès au domaine C2 identifié et utiliser l’inspection TLS là où c’est approprié pour détecter les modèles de beaconing HTTPS anomaux.
Réponse
En cas de détection d’activité suspecte, isoler l’hôte, capturer la mémoire volatile, et conserver la configuration chiffrée pour une analyse plus approfondie. Balayer l’environnement pour les IOCs extraits, supprimer les artefacts déposés, et supprimer l’entrée de persistance malveillante HKCU Run. Faire tourner les identifiants au sein de la portée et rechercher des signes de mouvement latéral cohérents avec les techniques de l’opérateur PlugX.
"graph TB %% Définitions de classe classDef technique fill:#ffcc99 classDef artifact fill:#ccffcc classDef process fill:#ccccff classDef registry fill:#ffe599 %% Accès initial initial_zip["<b>Artefact</b> – Archive ZIP malveillante contenant .lnk"] class initial_zip artifact lnk_shortcut["<b>Artefact</b> – Raccourci (.lnk) avec icône masquée"] class lnk_shortcut artifact tech_lnk_smack["<b>Technique</b> – T1027.012 Détournement d’icône LNK<br/><b>Description</b> : Utiliser l’icône LNK pour masquer la charge utile malveillante"] class tech_lnk_smack technique tech_user_exec["<b>Technique</b> – T1204.002 Exécution par l’utilisateur : Fichier malveillant<br/><b>Description</b> : La victime ouvre le fichier malveillant"] class tech_user_exec technique %% Exécution psh_stage["<b>Processus</b> – Étape PowerShell exécutée par .lnk"] class psh_stage process tech_psh["<b>Technique</b> – T1059.001 PowerShell<br/><b>Description</b> : Interpréteur de commande et de script"] class tech_psh technique tech_archive_custom["<b>Technique</b> – T1560.003 Archivage par méthode personnalisée<br/><b>Description</b> : Lit le ZIP en octets bruts"] class tech_archive_custom technique extracted_exe["<b>Artefact</b> – Exécutable à apparence légitime extrait"] class extracted_exe artifact malicious_dll["<b>Artefact</b> – Eraser.dll (malveillant)"] class malicious_dll artifact encrypted_dat["<b>Artefact</b> – Charge utile .dat chiffrée"] class encrypted_dat artifact %% Persistance run_key["<b>Registre</b> – Entrée HKCUSoftwareMicrosoftWindowsCurrentVersionRun"] class run_key registry tech_run_key["<b>Technique</b> – T1037.001 Script de logon (Scripts d’initialisation de démarrage ou de logon)<br/><b>Description</b> : Persistance par clé de registre"] class tech_run_key technique shortcut_mod["<b>Technique</b> – T1547.009 Modification de raccourci<br/><b>Description</b> : Modifie les raccourcis pour démarrage automatique"] class shortcut_mod technique active_setup["<b>Technique</b> – T1547.014 Configuration active<br/><b>Description</b> : Entrée de registre pour démarrage automatique via Configuration active"] class active_setup technique psh_profile["<b>Technique</b> – T1546.013 Profile PowerShell<br/><b>Description</b> : Accroche le profil PowerShell pour l’exécution"] class psh_profile technique %% Évasion de défense tech_compress["<b>Technique</b> – T1027.015 Compression<br/><b>Description</b> : Compresse la charge utile dans un ZIP"] class tech_compress technique tech_dynamic_api["<b>Technique</b> – T1027.007 Résolution dynamique d’API<br/><b>Description</b> : Résout les API à l’exécution en utilisant un hachage"] class tech_dynamic_api technique tech_embedded["<b>Technique</b> – T1027.009 Charges utiles intégrées<br/><b>Description</b> : Intègre des charges utiles chiffrées"] class tech_embedded technique tech_deobfuscate["<b>Technique</b> – T1140 Déobfuscation/Décoder des fichiers ou informations<br/><b>Description</b> : Décryptage RC4/XOR à l’exécution"] class tech_deobfuscate technique tech_masquerade["<b>Technique</b> – T1036.008 Usurpation : Type de fichier en trompe-l’œil<br/><b>Description</b> : Superposition d’un faux PDF"] class tech_masquerade technique %% Élévation de privilège / Exécution tech_reflective["<b>Technique</b> – T1620 Chargement de code réflexif<br/><b>Description</b> : Charge une DLL en mémoire sans toucher le disque"] class tech_reflective technique tech_injection["<b>Technique</b> – T1055.001 Injection de processus : Injection DLL<br/><b>Description</b> : Injecte une DLL via le parcours du PEB et des rappels de pool de threads"] class tech_injection technique %% Commande et contrôle c2_https["<b>Processus</b> – Communication HTTPS C2 (port 443)"] class c2_https process tech_nonstd_port["<b>Technique</b> – T1571 Port non standard<br/><b>Description</b> : Utilise un port commun pour mélanger le trafic"] class tech_nonstd_port technique tech_dead_drop["<b>Technique</b> – T1102.001 Résolveur Dead Drop<br/><b>Description</b> : Récupère l’adresse du serveur depuis le service web"] class tech_dead_drop technique tech_proxy["<b>Technique</b> – T1090.002 Proxy : Proxy externe<br/><b>Description</b> : Route le trafic via un proxy externe"] class tech_proxy technique %% Connexions initial_zip –>|contient| lnk_shortcut lnk_shortcut –>|utilise| tech_lnk_smack lnk_shortcut –>|déclenche| tech_user_exec tech_user_exec –>|mène à| psh_stage psh_stage –>|exécute| tech_psh psh_stage –>|lit| tech_archive_custom tech_archive_custom –>|extrait| extracted_exe tech_archive_custom –>|extrait| malicious_dll tech_archive_custom –>|extrait| encrypted_dat psh_stage –>|écrit| run_key run_key –>|implémente| tech_run_key psh_stage –>|crée| shortcut_mod psh_stage –>|crée| active_setup psh_stage –>|accroche| psh_profile psh_stage –>|applique| tech_compress psh_stage –>|applique| tech_dynamic_api psh_stage –>|applique| tech_embedded psh_stage –>|applique| tech_deobfuscate psh_stage –>|applique| tech_masquerade malicious_dll –>|agit en tant que| tech_reflective malicious_dll –>|effectue| tech_injection tech_injection –>|active| c2_https c2_https –>|utilise| tech_nonstd_port c2_https –>|utilise| tech_dead_drop c2_https –>|peut être routé via| tech_proxy %% Assignations de classe class initial_zip,lnk_shortcut,extracted_exe,malicious_dll,encrypted_dat artifact class psh_stage,c2_https process class run_key registry class tech_lnk_smack,tech_user_exec,tech_psh,tech_archive_custom,tech_run_key,shortcut_mod,active_setup,psh_profile,tech_compress,tech_dynamic_api,tech_embedded,tech_deobfuscate,tech_masquerade,tech_reflective,tech_injection,tech_nonstd_port,tech_dead_drop,tech_proxy technique "
Flux d’attaque
Détections
Tentative probable de chargement latéral de Dll Eraser (via image_load)
Voir
Possibilité d’exécution par lignes de commande PowerShell cachées (via cmdline)
Voir
Appeler des méthodes .NET suspectes depuis PowerShell (via powershell)
Voir
Appeler des classes/méthodes .NET suspectes depuis PowerShell CommandLine (via process_creation)
Voir
IOCs (HashSha256) pour détecter : PlugX : Mustang Panda APT Inside Mustang Panda : Des chaînes d’hameçonnage vers PlugX — Une plongée approfondie dans l’infrastructure de chargeurs
Voir
IOCs (HashSha1) pour détecter : PlugX : Mustang Panda APT Inside Mustang Panda : Des chaînes d’hameçonnage vers PlugX — Une plongée approfondie dans l’infrastructure de chargeurs
Voir
IOCs (HashMd5) pour détecter : PlugX : Mustang Panda APT Inside Mustang Panda : Des chaînes d’hameçonnage vers PlugX — Une plongée approfondie dans l’infrastructure de chargeurs
Voir
Exécution de fenêtre PowerShell cachée et déballage d’archive de leurre [Windows Powershell]
Voir
Détection de chargement latéral de DLL malveillant par ErsChk.exe [Création de processus Windows]
Voir
Exécution de la simulation
Condition préalable : la vérification pré-vol du télémétrie et de la base de référence 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 reflètent directement les TTPs identifiés et visent à générer la télémétrie exacte attendue par la logique de détection.
-
Récit et commandes d’attaque :
Un attaquant a obtenu un point d’appui sur un poste de travail compromis et veut mettre en scène des charges utiles malveillantes tout en restant invisible pour l’utilisateur. Il lance PowerShell en mode caché (-w hidden) pour éviter les fenêtres contextuelles de l’interface utilisateur. Dans la même session PowerShell, ils utilisent l’utilitaire intégré (disponible sur les versions modernes de Windows) pour extraire une archive leurre contenant les charges utiles de la prochaine étape directement danstarutility (available on modern Windows builds) to extract a decoy archive that contains the next stage payloads directly into%LocalAppData%, un emplacement accessible en écriture souvent ignoré par les défenses.Étapes :
- Créer une petite archive tar (
payloads.tar) contenant un fichier factice bénin (simulant la charge utile malveillante). - Stocker l’archive dans un emplacement temporaire (
C:Temp). - Exécuter PowerShell en fenêtre cachée qui exécute la commande d’extraction ciblant
tarScript de test de régression :%LocalAppData%.
- Créer une petite archive tar (
-
# ——————————————————— # Étape 1 – Préparer une archive tar d’échantillon (simule des charges utiles) # ——————————————————— $tempDir = « C:Temp » $archive = « $tempDirpayloads.tar » $payload = « $tempDirdummy.txt » $destDir = « $Env:LocalAppDataStagedPayloads » # S’assurer que le dossier temporaire existe New-Item -ItemType Directory -Path $tempDir -Force | Out-Null # Créer un fichier factice à archiver « Ceci est un fichier de charge utile factice. » | Set-Content -Path $payload -Encoding UTF8 # Créer l’archive tar (requiert tar Windows) tar -cf $archive -C $tempDir dummy.txt # ——————————————————— # Étape 2 – Exécuter PowerShell caché qui extrait l’archive # ——————————————————— $extractCmd = « tar -xvf ` »$archive` » -C ` »$Env:LocalAppData` » » $psArgs = « -NoProfile -WindowStyle Hidden -Command `$extractCmd » Start-Process -FilePath « powershell.exe » -ArgumentList $psArgs -WindowStyle Hidden # ——————————————————— # Étape 3 – Optionnel : Vérifier l’extraction (pour validation manuelle) # ——————————————————— Write-Host « Extraction complète. Les fichiers devraient exister maintenant dans $Env:LocalAppData »
# --------------------------------------------------------- # Step 1 – Prepare a sample tar archive (simulates payloads) # --------------------------------------------------------- $tempDir = "C:Temp" $archive = "$tempDirpayloads.tar" $payload = "$tempDirdummy.txt" $destDir = "$Env:LocalAppDataStagedPayloads" # Ensure temp folder exists New-Item -ItemType Directory -Path $tempDir -Force | Out-Null # Create a dummy file to archive "This is a dummy payload file." | Set-Content -Path $payload -Encoding UTF8 # Create the tar archive (requires Windows tar) tar -cf $archive -C $tempDir dummy.txt # --------------------------------------------------------- # Step 2 – Execute hidden PowerShell that extracts the archive # --------------------------------------------------------- $extractCmd = "tar -xvf `"$archive`" -C `"$Env:LocalAppData`"" $psArgs = "-NoProfile -WindowStyle Hidden -Command `$extractCmd" Start-Process -FilePath "powershell.exe" -ArgumentList $psArgs -WindowStyle Hidden # --------------------------------------------------------- # Step 3 – Optional: Verify extraction (for manual validation) # --------------------------------------------------------- Write-Host "Extraction complete. Files should now exist in $Env:LocalAppData" -
Commandes de nettoyage :
# Supprimer les fichiers temporaires et les charges utiles mises en place Remove-Item -Path "C:Temppayloads.tar" -Force -ErrorAction SilentlyContinue Remove-Item -Path "C:Tempdummy.txt" -Force -ErrorAction SilentlyContinue Remove-Item -Path "$Env:LocalAppDatadummy.txt" -Force -ErrorAction SilentlyContinue # Supprimer éventuellement l'ensemble du dossier de mise en scène si créé Remove-Item -Path "$Env:LocalAppDataStagedPayloads" -Recurse -Force -ErrorAction SilentlyContinue