Quand le malware riposte
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.
Flux d’Attaque
Détections
Possible abus de Telegram comme canal de Command and Control (via dns_query)
Voir
Points de persistance possibles [ASEPs – Logiciels/Ruche NTUSER] (via event de registre)
Voir
Appeler des fonctions API Windows suspectes depuis PowerShell (via powershell)
Voir
Chaînes PowerShell suspectes (via powershell)
Voir
Utilisation possible de Schtasks ou AT pour la persistance (via cmdline)
Voir
Tentative de manipulation suspecte du flux de données alternées (ADS) Zone.Identifier (via creation de processus)
Voir
PowerShell exécutant un fichier dans un répertoire suspect utilisant une politique d’exécution de contournement (via cmdline)
Voir
IOC (DestinationIP) à détecter : Quand le malware répond
Voir
IOC (SourceIP) à détecter : Quand le malware répond
Voir
IOC (HashMd5) à détecter : Quand le malware répond
Voir
IOC (HashSha1) à détecter : Quand le malware répond
Voir
Persistance via la clé Run pour l’exécution de fichier batch [Event de registre Windows]
Voir
Détection de l’injection en mémoire et de l’exécution de charge utile via PowerShell [Powershell Windows]
Voir
Détection de l’exécution de Batch et PowerShell pour la persistance du malware caché [Création de processus Windows]
Voir
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:
- 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).
- 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. - Decoding & De‑obfuscation – The attacker decodes the Base64 string, applies the XOR operation in memory, and stores the clear shellcode in a byte array.
- 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”. - 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."