JavaScript Obfusqué au Coeur de l’Attaque
Detection stack
- AIDR
- Alert
- ETL
- Query
Résumé
Un email de phishing a livré un fichier JavaScript malveillant à l’intérieur d’une archive RAR, déclenchant une chaîne d’infection qui se termine par l’exécution du malware Formbook. Une fois lancé, le script écrit plusieurs fichiers dans le dossier public, établit une persistance via une tâche planifiée, et lance une charge utile PowerShell qui décrypte un contenu chiffré par AES pour charger un DLL .NET malveillant. Ce DLL est ensuite injecté dans un MSBuild.exe processus, où il continue l’exécution et déploie l’étape finale du malware. La campagne intègre également plusieurs méthodes d’évasion de détection, y compris le patching d’ETW et d’AMSI pour réduire la détection.
Investigation
Lors de l’analyse, les chercheurs ont identifié le dropper JavaScript cbmjlzan.JS, ainsi qu’une tâche planifiée configurée pour exécuter le script copié toutes les quinze minutes pour la persistance. Ils ont également retracé la commande PowerShell responsable du décodage des données encodées en base64 cachées dans des fichiers image. Le contenu décrypté a révélé un DLL .NET qui a été injecté dans MSBuild.exe et utilisé pour livrer Formbook. Des indicateurs supplémentaires, y compris des chemins de fichiers, des noms de tâches et des matériaux cryptographiques, ont été extraits pour soutenir une enquête plus approfondie et le développement de la détection.
Atténuation
Les organisations devraient bloquer l’exécution de fichiers JavaScript non fiables et de scripts PowerShell lancés à partir de répertoires accessibles par les utilisateurs tout en surveillant de près les tâches planifiées créées avec des noms inhabituels ou aléatoires. Des contrôles d’exécution devraient être appliqués à MSBuild.exe pour éviter les abus dans les chaînes de malware. Les outils de sécurité devraient également détecter les comportements d’injection de DLL, la manipulation d’ETW et d’AMSI, ainsi que les signatures connues liées à Formbook. La formation à la sensibilisation des utilisateurs reste importante pour réduire le risque posé par les pièces jointes de phishing.
Réponse
Les défenseurs devraient générer des alertes lorsque le fichier JavaScript identifié ou la tâche planifiée associée apparaît, puis isoler l’endpoint affecté et collecter les preuves volatiles pour analyse. Les fichiers malveillants devraient être retirés, la tâche planifiée supprimée, et le DLL injecté examiné en totalité pour comprendre le flux d’exécution complet. Tout composant du système compromis devrait être reconstruit ou restauré pour garantir l’intégrité. Les IOCs pertinents devraient également être partagés avec la communauté de sécurité plus large pour aider les autres à détecter une activité similaire.
graph TB %% Class definitions classDef action fill:#ffcccc classDef tool fill:#99ccff classDef process fill:#ffff99 classDef file fill:#ccffcc classDef malware fill:#ffcc99 %% Nodes email_phishing[« <b>Action</b> – <b>T1566.001 Hameçonnage avec pièce jointe</b><br/>Pièce jointe RAR malveillante envoyée par email »] class email_phishing action tool_wsh[« <b>Outil</b> – <b>Nom</b>: Windows Script Host (JavaScript)<br/><b>Technique</b>: T1559.001 Component Object Model »] class tool_wsh tool action_copy[« <b>Action</b> – <b>T1559.001 Component Object Model</b><br/>Le script se copie dans C:\\Users\\Public\\Libraries »] class action_copy action action_sched[« <b>Action</b> – <b>T1053 Tâche planifiée</b><br/>Création d’une tâche planifiée pour persistance »] class action_sched action tool_ps[« <b>Outil</b> – <b>Nom</b>: PowerShell<br/><b>Technique</b>: T1059.001 Interpréteur de commandes »] class tool_ps tool action_decode[« <b>Action</b> – <b>T1027.004 Compilation après livraison</b> & <b>T1140 Déobfuscation/décodage</b><br/>Décodage Base64 et chiffrement AES »] class action_decode action action_patch[« <b>Action</b> – <b>T1027.005 Suppression d’indicateurs</b><br/>Patchs ETW et AMSI en mémoire »] class action_patch action file_dll[« <b>Fichier</b> – <b>Nom</b>: Orio.png (contient DLL .NET chiffrée)<br/><b>Technique</b>: Charge utile cachée »] class file_dll file process_msbuild[« <b>Processus</b> – <b>Nom</b>: msbuild.exe<br/><b>Technique</b>: T1127.001 Exécution proxy outils développeur »] class process_msbuild process action_inject[« <b>Action</b> – <b>T1055.001 Injection de processus</b><br/>Injection DLL dans msbuild.exe »] class action_inject action malware_formbook[« <b>Malware</b> – <b>Nom</b>: Formbook<br/><b>Source</b>: Payload intégré dans Brio.png »] class malware_formbook malware %% Edges / Flow email_phishing –>|delivers| tool_wsh tool_wsh –>|uses COM to| action_copy action_copy –>|leads to| action_sched tool_wsh –>|launches| tool_ps tool_ps –>|executes| action_decode tool_ps –>|applies| action_patch action_decode –>|produces| file_dll action_patch –>|prepares environment for| file_dll file_dll –>|loaded by| process_msbuild process_msbuild –>|receives| action_inject action_inject –>|extracts final payload from| malware_formbook
Flux du’Attaque
Détections
Chaînes PowerShell suspectes (via cmdline)
Voir
Chaînes PowerShell suspectes (via powershell)
Voir
LOLBAS WScript / CScript (via creation_process)
Voir
Exécution suspecte depuis le profil utilisateur public (via creation_process)
Voir
Appel de méthodes .NET suspectes depuis PowerShell (via powershell)
Voir
Fichiers suspects dans le profil utilisateur public (via événement_fichier)
Voir
Persistance JavaScript obfusquée et injection de charge malveillante [Création de Processus Windows]
Voir
Exécution de PowerShell obfusqué pour le décryptage [Windows PowerShell]
Voir
Exécution de Simulation
Prérequis : La Vérification Pré-vol du Télémetrie et de la Ligne de Base doit avoir réussi.
Raisonnement : 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 TTPs identifiés et viser à générer la télémétrie exacte attendue par la logique de détection.
-
Récit et Commandes d’Attaque :
Un attaquant qui a compromis un compte à faible privilège souhaite télécharger une charge malveillante qui est stockée sous forme de chaîne Base64 dans un dépôt de script compromis. Pour éviter la détection, l’attaquant élabore une commande PowerShell en une seule ligne qui (1) décode la chaîne Base64, (2) l’invoque viaiex, et (3) crée un objet AES pour décrypter davantage de données intégrées. La ligne de commande exacte est écrite pour correspondre aux littéraux de la règle.powershell C:WindowsSystem32WindowsPowerShellv1.0powershell.exe -Noexit -nop -c iex([Text.Encoding]::Unicode.GetString([Convert]::FromBase64String(('REPLACED_STRING'.Replace('VFHDVXDJCF',''))))) ; $aes_var = [System.Security.Cryptography.Aes]::Create()- L’attaquant remplace
REPLACED_STRINGpar une charge utile Base64 légitime après avoir dépouillé un marqueur connu (VFHDVXDJCF). - The
-Noexit -nop -cles commutateurs suppriment les invites et contournent la politique d’exécution, correspondant à la condition de détection. - The
$aes_varle nom de la variable est conservé littéral pour satisfaire la seconde clause de sélection.
- L’attaquant remplace
-
Script de Test de Régression : Le script PowerShell suivant reproduit exactement la ligne de commande de manière contrôlée, garantissant que le SIEM reçoit une télémétrie identique.
# Script de Test de Régression – déclenche la détection $payload = "U2FtcGxlIEJhc2U2NCBTdHJpbmc=" # "Chaîne Base64 Exemple" $marker = "VFHDVXDJCF" $obfuscated = $payload.Replace($marker, "") # simule le .Replace utilisé dans la détection $command = @" C:WindowsSystem32WindowsPowerShellv1.0powershell.exe -Noexit -nop -c iex([Text.Encoding]::Unicode.GetString([Convert]::FromBase64String(('${obfuscated}'.Replace('VFHDVXDJCF',''))))) ; $aes_var = [System.Security.Cryptography.Aes]::Create() "@ # Exécute la ligne de commande élaborée Invoke-Expression $command -
Commandes de Nettoyage : Supprimer tout objet AES persistant et arrêter la session PowerShell lancée.
# Nettoyage – terminer le processus PowerShell enfant s'il est toujours en cours d'exécution Get-Process -Name powershell -ErrorAction SilentlyContinue | Where-Object { $_.Path -like "*WindowsPowerShellv1.0powershell.exe" } | Stop-Process -Force # Effacer éventuellement toutes les variables temporaires Remove-Variable -Name payload, marker, obfuscated, command -ErrorAction SilentlyContinue