ESET Recherche GopherWhisper : Un terrier plein de logiciels malveillants
Detection stack
- AIDR
- Alert
- ETL
- Query
Résumé
ESET a identifié un groupe APT aligné avec la Chine précédemment inconnu, suivi sous le nom de GopherWhisper, ciblant une organisation gouvernementale en Mongolie. L’acteur de la menace utilise un écosystème de malware personnalisé construit autour de portes dérobées Go et C++, de chargeurs et d’injecteurs, tout en abusant fortement des plateformes cloud légitimes pour les activités de commande et de contrôle. Son ensemble d’outils, comprenant LaxGopher, RatGopher et BoxOfFriends, communique via des services tels que Discord, Slack, Microsoft Outlook et file.io. Les chercheurs ont d’abord observé la campagne en janvier 2025.
Enquête
L’analyse d’ESET a révélé l’ensemble des outils du groupe, documenté ses méthodes d’injection et identifié les jetons API de Slack et Discord utilisés dans l’opération. Les chercheurs ont également extrait des milliers de messages de commande et de contrôle et de courriels Outlook brouillons liés à la campagne. Leur enquête a cartographié l’infrastructure de soutien et montré comment les attaquants comptaient sur des services en ligne fiables pour dissimuler les communications et exfiltrer des données.
Atténuation
Les défenseurs devraient surveiller l’activité API non autorisée de Slack, Discord et Outlook, bloquer les téléversements suspects vers file.io, et appliquer des contrôles stricts sur le comportement de chargement de DLL. Les équipes de sécurité devraient également détecter les activités d’injection svchost.exe anormales et enquêter sur les binaires inconnus basés sur Go dans l’environnement.
Réponse
Si une activité GopherWhisper est détectée, isolez immédiatement le système affecté, terminez les processus malveillants, retirez les DLL injectées, réinitialisez les comptes de service compromis et révoquez tous les jetons API exposés. Une enquête médico-légale complète devrait suivre, ainsi qu’une chasse aux menaces sur le réseau pour identifier les artefacts connexes ou d’autres hôtes compromis.
"graph TB %% Class definitions classDef malware fill:#ffcccc classDef process fill:#c2f0c2 classDef file fill:#ffd9b3 classDef technique fill:#e6e6ff classDef service fill:#ffffcc classDef network fill:#d9d9d9 %% Nodes node_initial_loader["<b>Malware</b> – <b>JabGopher Loader</b><br/><b>Action</b>: Create svchost.exe and inject LaxGopher backdoor"] class node_initial_loader malware node_svc_host["<b>Process</b> – svchost.exe"] class node_svc_host process node_laxgopher["<b>Malware</b> – <b>LaxGopher</b> backdoor (DLL)"] class node_laxgopher malware node_whisper_dll["<b>File</b> – whisper.dll (masquerading)"] class node_whisper_dll file node_process_injection["<b>Technique</b> – T1055 Process Injection<br/><b>Description</b>: Inject malicious code into a running process"] class node_process_injection technique node_reflective_loading["<b>Technique</b> – T1620 Reflective Code Loading<br/><b>Description</b>: Load code in memory without using the standard OS loader"] class node_reflective_loading technique node_masquerading["<b>Technique</b> – T1036 Masquerading<br/><b>Description</b>: Rename files to appear legitimate"] class node_masquerading technique node_frienddelivery["<b>Malware</b> – <b>FriendDelivery DLL</b>"] class node_frienddelivery malware node_boxoffriends["<b>Malware</b> – <b>BoxOfFriends</b> backdoor"] class node_boxoffriends malware node_go_backdoor["<b>Malware</b> – Go based backdoors (RatGopher, LaxGopher)"] class node_go_backdoor malware node_c2_slack["<b>Service</b> – Slack (Web Service)"] class node_c2_slack service node_c2_discord["<b>Service</b> – Discord (Web Service)"] class node_c2_discord service node_c2_outlook["<b>Service</b> – Microsoft 365 Outlook Mail REST API"] class node_c2_outlook service node_tech_c2_web["<b>Technique</b> – T1102.002 Web Service Bidirectional Communication<br/><b>Description</b>: Use legitimate web services for C2"] class node_tech_c2_web technique node_tech_mail["<b>Technique</b> – T1071.003 Mail Protocols<br/><b>Description</b>: Use mail protocols for C2"] class node_tech_mail technique node_remote_access["<b>Technique</b> – T1219 Remote Access Tools<br/><b>Description</b>: Provide remote command execution"] class node_remote_access technique node_compactgopher["<b>Malware</b> – CompactGopher"] class node_compactgopher malware node_archive["<b>Technique</b> – T1560.001 Archive Collected Data via Utility<br/><b>Description</b>: Compress data before exfiltration"] class node_archive technique node_data_limit["<b>Technique</b> – T1030 Data Transfer Size Limits<br/><b>Description</b>: Handle size limits by compressing or splitting data"] class node_data_limit technique node_exfil_fileio["<b>Service</b> – file.io cloud storage"] class node_exfil_fileio service node_exfil_tech["<b>Technique</b> – T1567.002 Exfiltration Over Web Service to Cloud Storage<br/><b>Description</b>: Use cloud storage as exfiltration channel"] class node_exfil_tech technique node_transfer_to_cloud["<b>Technique</b> – T1537 Transfer Data to Cloud Account<br/><b>Description</b>: Move data to attackeru2011controlled cloud account"] class node_transfer_to_cloud technique node_sslordoor["<b>Malware</b> – SSLORDoor"] class node_sslordoor malware node_raw_socket["<b>Technique</b> – Raw Socket Communication"] class node_raw_socket technique node_port_443["<b>Network</b> – Port 443"] class node_port_443 network %% Connections node_initial_loader –>|creates| node_svc_host node_initial_loader –>|injects| node_laxgopher node_laxgopher –>|uses| node_process_injection node_laxgopher –>|uses| node_reflective_loading node_laxgopher –>|file name| node_whisper_dll node_whisper_dll –>|masquerades as| node_masquerading node_frienddelivery –>|loads| node_boxoffriends node_boxoffriends –>|uses| node_process_injection node_boxoffriends –>|uses| node_reflective_loading node_laxgopher –>|C2 via| node_c2_slack node_go_backdoor –>|C2 via| node_c2_discord node_go_backdoor –>|C2 via| node_c2_slack node_c2_slack –>|uses technique| node_tech_c2_web node_c2_discord –>|uses technique| node_tech_c2_web node_boxoffriends –>|creates drafts via| node_c2_outlook node_c2_outlook –>|uses technique| node_tech_mail node_go_backdoor –>|provides| node_remote_access node_sslordoor –>|provides| node_remote_access node_compactgopher –>|compresses data with| node_archive node_compactgopher –>|handles size limits via| node_data_limit node_archive –>|uploaded to| node_exfil_fileio node_exfil_fileio –>|uses technique| node_exfil_tech node_exfil_fileio –>|uses technique| node_transfer_to_cloud node_sslordoor –>|uses raw sockets on| node_port_443 node_sslordoor –>|uses| node_raw_socket "
Flux d’attaque
Détections
Nom de fichier court (via cmdline)
Voir
Désactiver la surveillance en temps réel de Windows Defender et autres modifications de préférences (via cmdline)
Voir
Utilisation possible de WebBrowserPassView (via cmdline)
Voir
Possible infiltration / exfiltration de données / C2 via des services tiers / outils (via proxy)
Voir
Détection de C&C de GopherWhisper via Slack, Discord et Microsoft Graph API [Connexion réseau Windows]
Voir
Injection de processus suspecte par GopherWhisper [Création de processus Windows]
Voir
Exécution de simulation
Prérequis : La vérification pré-lancement de la télémétrie & 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 DOIVENT refléter directement les TTP identifiés et viser à générer la télémétrie exacte attendue par la logique de détection.
-
Récit et commandes de l’attaque :
L’attaquant lance d’abord unsvchost.exenouveau processus (l’hôte choisi pour l’injection). À l’aide d’un injecteur de DLL réflexif, la charge utileLaxGopher.dllest chargée en mémoire de ce processus, réalisant une injection de bibliothèque de liens dynamiques (T1055.001). Une fois la porte dérobée en place, elle ouvre uncmd.execaché pour exécuter les commandes reçues de son serveur C2, satisfaisant Shell de commande Windows (T1059.003). Cette chaîne reflète le comportement décrit dans la recherche GopherWhisper et génère les deux événements de création de processus que la règle Sigma recherche. -
Script de test de régression :
# ------------------------------------------------------------- # Simulation d'injection de processus de style GopherWhisper # ------------------------------------------------------------- $svcHost = "$env:SystemRootSystem32svchost.exe" $dllPath = "C:TempLaxGopher.dll" # Supposons qu'une DLL de test bénigne existe ici $cmdPath = "$env:SystemRootSystem32cmd.exe" # 1. Démarrez une nouvelle instance de svchost.exe (suspendue) pour être la cible de l'injection $svchost = Start-Process -FilePath $svcHost -ArgumentList "-k", "netsvcs" ` -PassThru -WindowStyle Hidden # 2. Effectuez une injection réflexive simpliste (placeholdeur) # Dans un vrai test, vous appelleriez un injecteur approprié ; ici nous enregistrons juste l'intention. Write-Host "[*] Injecting $dllPath into PID $($svchost.Id) (simulated)" # Commande d'injection simulée : # .Invoke-ReflectiveDLLInjection.ps1 -Pid $svchost.Id -Path $dllPath # 3. Lancez cmd.exe à partir du contexte du processus injecté (simulé) Write-Host "[*] Launching cmd.exe from injected svchost (simulated)" Start-Process -FilePath $cmdPath -ArgumentList "/c echo Compromised > C:Temppwned.txt" ` -WindowStyle Hidden # 4. Attendez brièvement pour permettre à Sysmon d'enregistrer les événements Start-Sleep -Seconds 5 -
Commandes de nettoyage :
# Terminez les processus simulés svchost.exe et cmd.exe Get-Process -Name svchost -ErrorAction SilentlyContinue | Stop-Process -Force Get-Process -Name cmd -ErrorAction SilentlyContinue | Stop-Process -Force # Supprimez la DLL de test (optionnel) Remove-Item -Path "C:TempLaxGopher.dll" -Force -ErrorAction SilentlyContinue