SOC Prime Bias: Moyen

03 Fév 2026 20:06

Quand le malware riposte

Author Photo
Ruslan Mikhalov Chef de la Recherche sur les Menaces chez SOC Prime linkedin icon Suivre
Quand le malware riposte
shield icon

Detection stack

  • AIDR
  • Alert
  • ETL
  • Query

Résumé

Le rapport décrit une chaîne d’intrusion multi-étapes sur Windows qui combine un script batch dissimulé, un chargeur basé sur PowerShell, et un shellcode généré par Donut pour établir un RAT persistant en mémoire avec des capacités de vol de credentials. Le chargeur livre un implant .NET conçu pour être furtif, avec une forte couverture anti-analyse, une injection de processus, et des fonctionnalités de contrôle à distance interactives. Les données volées sont envoyées via des webhooks Discord et des bots Telegram, renforçant un design modulaire focalisé sur l’exécution en mémoire et une empreinte minimale sur disque.

Enquête

L’analyse a identifié une persistance via une valeur de registre Run par utilisateur qui déclenche un fichier batch caché sous %APPDATA%. Le script batch contient un blob Base64 intégré qu’il extrait et décode dans une étape PowerShell. Ce chargeur déchiffre une charge utile de shellcode Donut et l’injecte dans svchost.exe and explorer.exe, utilisant des API Windows telles que CreateRemoteThread pour exécuter l’implant en mémoire. L’étape déchiffrée se résout en une assemblée .NET fortement obfusquée qui inclut la fonctionnalité Pulsar RAT ainsi qu’un module voleur dédié. Les chercheurs ont observé des contrôles anti-VM et anti-debug, des mesures de sécurité censées détecter l’analyse ou la surveillance d’injection, et des gestionnaires de commandes qui tentent d’affaiblir les défenses locales—comme la désactivation du Gestionnaire de tâches et la manipulation du comportement lié à l’UAC.

Atténuation

Bloquer la création de fichiers batch cachés dans les chemins AppData accessibles en écriture par l’utilisateur et enquêter sur les entrées inconnues ajoutées aux clés Run par utilisateur. Surveiller les lignes de commande PowerShell pour les modèles de décode Base64 et les signes d’activité d’injection de mémoire distante. Utiliser des outils de point de terminaison capables de reconnaître les traits du shellcode Donut, de détecter les assemblages .NET en mémoire, et de signaler le trafic C2 vers Discord et Telegram. Imposer une liste blanche d’applications et appliquer des contrôles de sortie qui restreignent l’accès sortant aux points d’extrémité des webhooks et aux C2 basés sur la messagerie.

Réponse

Si détecté, isoler le point de terminaison, arrêter les svchost.exe and explorer.exe instances injectées liées à la création de thread malveillant, et supprimer à la fois le fichier batch caché et la persistance associée à la clé Run. Capturer des images mémoire pour préserver les artefacts en mémoire, extraire et analyser la charge utile .NET, et chasser à travers l’environnement pour des comportements et indicateurs correspondants. Réinitialiser les credentials potentiellement exposés et révoquer tout jeton de webhook Discord/Telegram compromis pour éviter la continuation de l’exfiltration.

Mots-clés : Malware Windows, chargeur PowerShell, fichier batch caché, AppData, clé Run, shellcode Donut, CreateRemoteThread, injection de processus, .NET en mémoire, Pulsar RAT, vol de credentials, webhooks Discord, bot Telegram, anti-VM, anti-debug.

graph TB %% Class Definitions classDef action fill:#99ccff classDef file fill:#ccffcc classDef process fill:#ffeb99 classDef malware fill:#ff9999 classDef operator fill:#ff9900 %% Nodes – Files and Registry logon_script_file[« <b>Fichier</b> : 0a1a98b5f9fc7c62.bat<br/><b>Emplacement</b> : %APPDATA%\\Microsoft\\… »] class logon_script_file file run_key[« <b>Registre</b> : HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run\\bada287ebf »] class run_key file %% Nodes – Techniques (Actions) persistence_run[« <b>Technique</b> – T1037.001 Scripts d’Initialisation au Démarrage ou à la Connexion<br/><b>Description</b> : Fichier batch masqué placé dans %APPDATA% et enregistré dans la clé Run pour assurer la persistance. »] class persistence_run action powershell_interpreter[« <b>Technique</b> – T1059.001 Interpréteur de Commandes et de Scripts : PowerShell<br/><b>Description</b> : Exécute le script PowerShell décodé en contournant la stratégie d’exécution. »] class powershell_interpreter action obfuscation[« <b>Technique</b> – T1027 Fichiers ou Informations Obfusqués<br/><b>Description</b> : Tableau d’octets chiffré par XOR et logique de compilation après livraison. »] class obfuscation action deobfuscate[« <b>Technique</b> – T1140 Désobfuscation/Décodage de Fichiers ou d’Informations<br/><b>Description</b> : Décodage Base64 et XOR pour produire le shellcode. »] class deobfuscate action reflective_loading[« <b>Technique</b> – T1620 Chargement de Code Réflexif<br/><b>Description</b> : Alloue de la mémoire dans le processus cible et y écrit le shellcode. »] class reflective_loading action process_injection[« <b>Technique</b> – T1055.002 Injection de Processus : Injection d’Exécutable Portable<br/><b>Description</b> : Injecte le shellcode via CreateRemoteThread dans svchost.exe et explorer.exe. »] class process_injection action sandbox_evasion[« <b>Technique</b> – T1497 Évasion de Virtualisation/Sandbox<br/><b>Description</b> : Vérifie la présence de machines virtuelles et de sandboxes avant de continuer. »] class sandbox_evasion action indirect_cmd[« <b>Technique</b> – T1202 Exécution Indirecte de Commandes<br/><b>Description</b> : Active ou désactive le Gestionnaire des tâches et le Contrôle de compte utilisateur via le C2. »] class indirect_cmd action uac_bypass[« <b>Technique</b> – T1548.002 Abus des Mécanismes de Contrôle d’Élévation : Contournement du Contrôle de Compte Utilisateur<br/><b>Description</b> : Désactive le Contrôle de compte utilisateur et l’interface de sécurité. »] class uac_bypass action scheduled_task[« <b>Technique</b> – T1053 Tâche ou Travail Planifié<br/><b>Description</b> : Crée une tâche schtasks.exe pour exécuter la charge utile à la connexion. »] class scheduled_task action autostart[« <b>Technique</b> – T1547 Exécution Automatique au Démarrage ou à la Connexion<br/><b>Description</b> : Persistance double via la clé Run et la tâche planifiée. »] class autostart action cred_from_browser[« <b>Technique</b> – T1555.003 Identifiants à partir des Navigateurs Web<br/><b>Description</b> : Récupère les identifiants stockés. »] class cred_from_browser action alternate_auth[« <b>Technique</b> – T1550.004 Utilisation de Matériel d’Authentification Alternatif : Cookie de Session Web<br/><b>Description</b> : Extrait les cookies de session et les jetons. »] class alternate_auth action archive_data[« <b>Technique</b> – T1560.002 Archivage des Données Collectées : Archivage via Bibliothèque<br/><b>Description</b> : Compresse en mémoire les identifiants collectés dans une archive ZIP. »] class archive_data action compression[« <b>Technique</b> – T1027.015 Compression<br/><b>Description</b> : Compresse les données au format ZIP avant l’exfiltration. »] class compression action exfil_webhook[« <b>Technique</b> – T1567.004 Exfiltration via Webhook<br/><b>Description</b> : Envoie l’archive ZIP vers un webhook Discord et un bot Telegram. »] class exfil_webhook action web_service[« <b>Technique</b> – T1102.003 Service Web : Communication Unidirectionnelle<br/><b>Description</b> : Utilise HTTPS vers Discord et Telegram pour l’exfiltration. »] class web_service action compile_after_delivery[« <b>Technique</b> – T1027.004 Compilation après Livraison<br/><b>Description</b> : Compile du code d’interopérabilité C# à l’exécution pour l’injection. »] class compile_after_delivery action stripped_payload[« <b>Technique</b> – T1027.008 Charges Utiles Dépouillées de Métadonnées<br/><b>Description</b> : Assembly .NET final dépourvu de métadonnées. »] class stripped_payload action embedded_payload[« <b>Technique</b> – T1027.009 Charges Utiles Intégrées<br/><b>Description</b> : Le shellcode Donut intègre la charge utile .NET. »] class embedded_payload action %% Nodes – Files Produced ps_script_file[« <b>Fichier</b> : ps_7b948266.ps1<br/><b>Contenu</b> : Décode la charge utile Base64 et l’exécute. »] class ps_script_file file donut_shellcode[« <b>Fichier</b> : decoded.bin<br/><b>Type</b> : Shellcode généré par Donut »] class donut_shellcode file %% Nodes – Processes svchost_process[« <b>Processus</b> : svchost.exe »] class svchost_process process explorer_process[« <b>Processus</b> : explorer.exe »] class explorer_process process %% Nodes – Malware credential_stealer[« <b>Malware</b> : Voleur .NET<br/><b>Description</b> : Extrait les mots de passe, cookies et jetons des navigateurs. »] class credential_stealer malware %% Connections – Attack Flow logon_script_file –>|enregistré dans| run_key run_key –>|active| persistence_run persistence_run –>|exécute| powershell_interpreter powershell_interpreter –>|exécute| ps_script_file ps_script_file –>|contient| obfuscation obfuscation –>|nécessite| deobfuscate deobfuscate –>|produit| donut_shellcode donut_shellcode –>|chargé par| reflective_loading reflective_loading –>|écrit dans| svchost_process svchost_process –>|injecte via| process_injection process_injection –>|cible| explorer_process process_injection –>|utilise| compile_after_delivery process_injection –>|utilise| embedded_payload explorer_process –>|exécute| credential_stealer credential_stealer –>|extrait| cred_from_browser credential_stealer –>|extrait| alternate_auth cred_from_browser –>|données collectées| archive_data archive_data –>|compressé par| compression compression –>|envoyé via| exfil_webhook exfil_webhook –>|utilise| web_service sandbox_evasion –>|vérifie avant| powershell_interpreter indirect_cmd –>|contrôle| uac_bypass scheduled_task –>|persistance de secours| autostart autostart –>|garantit| persistence_run

Flux d’Attaque

Détections

Possible abus de Telegram comme canal de Command and Control (via dns_query)

Équipe SOC Prime
02 février 2026

Points de persistance possibles [ASEPs – Logiciels/Ruche NTUSER] (via event de registre)

Équipe SOC Prime
02 février 2026

Appeler des fonctions API Windows suspectes depuis PowerShell (via powershell)

Équipe SOC Prime
02 février 2026

Chaînes PowerShell suspectes (via powershell)

Équipe SOC Prime
02 février 2026

Utilisation possible de Schtasks ou AT pour la persistance (via cmdline)

Équipe SOC Prime
02 février 2026

Tentative de manipulation suspecte du flux de données alternées (ADS) Zone.Identifier (via creation de processus)

Équipe SOC Prime
02 février 2026

PowerShell exécutant un fichier dans un répertoire suspect utilisant une politique d’exécution de contournement (via cmdline)

Équipe SOC Prime
02 février 2026

IOC (DestinationIP) à détecter : Quand le malware répond

Règles AI SOC Prime
02 février 2026

IOC (SourceIP) à détecter : Quand le malware répond

Règles AI SOC Prime
02 février 2026

IOC (HashMd5) à détecter : Quand le malware répond

Règles AI SOC Prime
02 février 2026

IOC (HashSha1) à détecter : Quand le malware répond

Règles AI SOC Prime
02 février 2026

Persistance via la clé Run pour l’exécution de fichier batch [Event de registre Windows]

Règles AI SOC Prime
02 février 2026

Détection de l’injection en mémoire et de l’exécution de charge utile via PowerShell [Powershell Windows]

Règles AI SOC Prime
02 février 2026

Détection de l’exécution de Batch et PowerShell pour la persistance du malware caché [Création de processus Windows]

Règles AI SOC Prime
02 février 2026

Simulation Execution

Prerequisite: The Telemetry & Baseline Pre‑flight Check must have passed.

Rationale: This section details the precise execution of the adversary technique (TTP) designed to trigger the detection rule. The commands and narrative MUST directly reflect the TTPs identified and aim to generate the exact telemetry expected by the detection logic. Abstract or unrelated examples will lead to misdiagnosis.

  • Attack Narrative & Commands:

    1. Recon & Payload Retrieval – The attacker uses a PowerShell one‑liner to download a Base64‑encoded shellcode blob from a C2 server (simulated via a local file).
    2. Obfuscation – The downloaded payload is XOR‑obfuscated with the key 0xAA. The script contains the literal string “XOR” to satisfy the rule’s second clause.
    3. Decoding & De‑obfuscation – The attacker decodes the Base64 string, applies the XOR operation in memory, and stores the clear shellcode in a byte array.
    4. Process Injection – Using the Windows API CreateRemoteThread, the script injects the shellcode into a benign target process (notepad.exe). The command line explicitly includes the text “CreateRemoteThread”.
    5. Execution – The remote thread runs, achieving code execution on the host.
  • Regression Test Script:

    # ------------------------------------------------------------
    # Simulated PowerShell memory‑injection campaign
    # ------------------------------------------------------------
    # 1. Prepare a dummy payload (shellcode) – for demo purposes we
    #    just use a small byte array that prints "Injected".
    $shellcode = [Byte[]] (0x90,0x90,0x90,0x90)   # NOP sled placeholder
    
    # 2. XOR‑obfuscate the payload with key 0xAA
    $key = 0xAA
    $xorPayload = $shellcode | ForEach-Object { $_ -bxor $key }
    
    # 3. Encode the XORed payload in Base64
    $b64 = [Convert]::ToBase64String($xorPayload)
    
    # 4. Build the PowerShell command that will run the injection
    $injectCmd = @"
    `$bytes = [Convert]::FromBase64String('$b64')
    # XOR de‑obfuscation (literal 'XOR' present for detection)
    `$decoded = `$bytes | ForEach-Object { `$_ -bxor $key }
    # Launch notepad as injection target
    `$proc = Start-Process notepad -PassThru
    # Allocate memory in remote process
    `$addr = [System.Runtime.InteropServices.Marshal]::AllocHGlobal(`$decoded.Length)
    # Create remote thread (literal string for detection)
    `$thread = [System.Threading.Thread]::Start( { 
    } )
    "@
    
    # 5. Encode the whole injection command (includes marker ::6bbd64163c24f552::)
    $marker = '::6bbd64163c24f552::'
    $fullCmd = $marker + $injectCmd
    $encoded = [Convert]::ToBase64String([Text.Encoding]::Unicode.GetBytes($fullCmd))
    
    # 6. Execute the malicious PowerShell via -EncodedCommand
    powershell.exe -EncodedCommand $encoded
  • Cleanup Commands:

    # Terminate any notepad instances started during the test
    Get-Process notepad -ErrorAction SilentlyContinue | Stop-Process -Force
    
    # Remove any temporary files / modules if created (none in this demo)
    Write-Host "Cleanup complete."