PureLogs Livré par Stéganographie PawsRunner
Detection stack
- AIDR
- Alert
- ETL
- Query
Résumé
La campagne repose sur un e-mail de phishing contenant une archive TXZ qui livre un chargeur JavaScript, lequel définit des variables d’environnement et lance conhost.exe en mode sans tête. Le chargeur décrypte ensuite un assembly .NET connu sous le nom de PawsRunner, qui récupère des images PNG contenant un contenu crypté caché grâce à des techniques stéganographiques. À partir de ces images, le malware extrait la charge utile finale : le voleur d’informations PureLogs .NET. Une fois actif, PureLogs se connecte à un serveur de commande et de contrôle à distance via HTTPS et exfiltre les identifiants de navigateur ainsi que les informations système.
Enquête
L’analyse a montré que le chargeur JavaScript extrait des commandes des variables d’environnement du processus, lance PowerShell avec un indicateur de fenêtre cachée et décrypte une charge utile chiffrée en AES qui est exécutée via la réflexion .NET. PawsRunner fait tourner trois API réseau et trois chaînes d’agent utilisateur différentes tout en téléchargeant des fichiers PNG, puis analyse iTXt and IEND pour localiser les données dissimulées et décrypte l’étape suivante avec RC4. PureLogs utilise à son tour TripleDES et Gzip pour charger une DLL téléchargeur, effectue des requêtes HTTP protégées par TLS vers des points de terminaison spécifiques, et collecte un large ensemble de données liées au navigateur depuis le système de la victime.
Atténuation
Les organisations devraient bloquer les pièces jointes TXZ à la passerelle e-mail, surveiller les conhost.exe instances s’exécutant sans fenêtre visible, et détecter PowerShell lancé avec le -w hidden drapeau. Les équipes de sécurité devraient également déployer des signatures pour PawsRunner et PureLogs, restreindre le trafic sortant vers le domaine et l’adresse IP de commande et de contrôle identifiés, et limiter l’exécution des assemblies .NET non signés. Dans la mesure du possible, une détection de la stéganographie devrait être appliquée aux fichiers image entrants suspects.
Réponse
Si cette activité est détectée, isolez le point de terminaison affecté, terminez les processus suspects conhost.exe et PowerShell, et supprimez toute binaire .NET déposée du système. Les identifiants compromis doivent être révoqués, l’authentification multifactorielle appliquée, et les mots de passe de navigateur stockés réinitialisés. Les enquêteurs devraient également effectuer une analyse des réseaux pour confirmer qu’aucune communication supplémentaire de commande et de contrôle n’a eu lieu et appliquer les étapes de remédiation pour éviter la réinfection.
graph TB %% Définitions des classes classDef action fill:#99ccff classDef tool fill:#cccccc classDef process fill:#ffdd99 classDef malware fill:#ff9999 %% Nœuds initial_phishing[« <b>Action</b> – <b>T1566.001 Pièce Jointe de Spearphishing</b><br/>L’attaquant envoie un e-mail de phishing contenant une archive TXZ avec la charge malveillante. »] class initial_phishing action malicious_archive[« <b>Malware</b> – <b>Nom</b> : Archive TXZ Malveillante<br/><b>Description</b> : Archive utilisée pour livrer la charge utile JavaScript initiale. »] class malicious_archive malware user_execution[« <b>Action</b> – <b>T1204.004 Exécution Utilisateur</b><br/>La victime extrait l’archive, puis le JavaScript exécute PowerShell en mode caché et lit les commandes depuis les variables d’environnement. »] class user_execution action powershell_loader[« <b>Processus</b> – <b>Nom</b> : Chargeur PowerShell<br/><b>Description</b> : Exécute l’assembly .NET déchiffré via reflection sans écriture sur disque. »] class powershell_loader process defense_compile[« <b>Action</b> – <b>T1027.004 Compilation Après Livraison</b><br/>L’assembly .NET déchiffré est chargé en mémoire via reflection. »] class defense_compile action defense_compress[« <b>Action</b> – <b>T1027.015 Compression</b><br/>La charge utile est déchiffrée avec AES puis décompressée via Gzip. »] class defense_compress action defense_stego[« <b>Action</b> – <b>T1027.003 Stéganographie</b><br/>Le chargeur télécharge des images PNG et extrait des données chiffrées cachées depuis les blocs iTXt/IEND. »] class defense_stego action masquerade_icon[« <b>Action</b> – <b>T1036.008 Déguisement</b><br/>Le binaire utilise des images de chats comme icône d’application afin de paraître légitime. »] class masquerade_icon action c2_encrypted[« <b>Action</b> – <b>T1573 Canal Chiffré</b><br/>Les communications C2 supplémentaires utilisent HTTPS avec des charges utiles chiffrées en AES-256. »] class c2_encrypted action credential_access[« <b>Action</b> – <b>T1555.003 Informations d’Identification depuis les Navigateurs Web</b><br/>PureLogs énumère les navigateurs et extrait les mots de passe enregistrés, cookies et fichiers de portefeuilles crypto. »] class credential_access action purelogs_tool[« <b>Outil</b> – <b>Nom</b> : PureLogs<br/><b>Description</b> : Utilitaire de vol d’identifiants collectant les données des navigateurs. »] class purelogs_tool tool collection_archive[« <b>Action</b> – <b>T1560.003 Archivage des Données Collectées</b><br/>Les données collectées sont compressées avec Gzip puis chiffrées avec AES avant l’exfiltration. »] class collection_archive action exfiltration_http[« <b>Action</b> – <b>T1048.003 Exfiltration via un Protocole Non-C2 Non Chiffré</b><br/>Les données sont envoyées via des requêtes HTTP POST vers plusieurs points de terminaison externes. »] class exfiltration_http action %% Connexions initial_phishing –>|livre| malicious_archive malicious_archive –>|déclenche| user_execution user_execution –>|exécute| powershell_loader powershell_loader –>|effectue| defense_compile defense_compile –>|utilise| defense_compress defense_compress –>|utilise| defense_stego defense_stego –>|active| masquerade_icon masquerade_icon –>|établit| c2_encrypted c2_encrypted –>|active| credential_access credential_access –>|utilise| purelogs_tool credential_access –>|collecte| collection_archive collection_archive –>|exfiltre via| exfiltration_http
Flux d’attaque
Détections
La possibilité d’exécution via des lignes de commande PowerShell cachées (via cmdline)
Voir
LOLBAS WScript / CScript (via process_creation)
Voir
Appeler des méthodes .NET suspectes depuis PowerShell (via powershell)
Voir
Indicateurs possibles d’obfuscation PowerShell (via powershell)
Voir
LOLBAS Conhost (via cmdline)
Voir
IOCs (HashSha256) pour détecter : PureLogs : Livraison via PawsRunner Stéganographie
Voir
IOCs (SourceIP) pour détecter : PureLogs : Livraison via PawsRunner Stéganographie
Voir
IOCs (DestinationIP) pour détecter : PureLogs : Livraison via PawsRunner Stéganographie
Voir
Décryptage AES PowerShell depuis des variables d’environnement [Windows PowerShell]
Voir
Détection de l’exécution de processus malveillants via Conhost et PowerShell cachés [Création de processus Windows]
Voir
Exécution de simulation
Prérequis: Le test préliminaire de télémétrie et de référence doit avoir réussi.
-
Narratif et commandes de l’attaque
- Étape 1 – Préparer la charge utile chiffrée
- L’attaquant crée une petite charge utile factice (
"secret"), la chiffre avec AES-256 en utilisant une clé connue, encode la chaîne chiffrée en Base64 et la stocke dans une variable d’environnementENC_PAYLOAD.
- L’attaquant crée une petite charge utile factice (
- Étape 2 – Exécuter le chargeur de décryptage PowerShell
- Une seule ligne lit
ENC_PAYLOAD, décode la chaîne Base64, construit unAesCryptoServiceProvider, dérive la clé/IV, décrypte les données et exécute éventuellement le texte en clair.
- Une seule ligne lit
- Étape 3 – Générer la télémétrie de détection
- La commande PowerShell inclut le mot littéral « AES » (par exemple,
New-Object System.Security.Cryptography.AesCryptoServiceProvider) et est enregistrée en tant qu’EventID 4104, satisfaisant la règle de détection.
- La commande PowerShell inclut le mot littéral « AES » (par exemple,
- Étape 1 – Préparer la charge utile chiffrée
-
Script de test de régression
# ------------------------------------------------- # Simulation de décryptage AES PowerShell (Déclenche la détection) # ------------------------------------------------- # 1. Définir une clé et un IV statiques de 256 bits (à des fins de démo) $key = [byte[]](0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10, 0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,0x20) $iv = [byte[]](0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf,0xb0) # 2. Charge utile en texte clair (exemple) $plain = [System.Text.Encoding]::UTF8.GetBytes("secret data") # 3. Chiffrer la charge utile en utilisant AES (CBC, PKCS7) $aes = [System.Security.Cryptography.AesCryptoServiceProvider]::new() $aes.Key = $key $aes.IV = $iv $aes.Mode = [System.Security.Cryptography.CipherMode]::CBC $aes.Padding = [System.Security.Cryptography.PaddingMode]::PKCS7 $encryptor = $aes.CreateEncryptor() $cipherBytes = $encryptor.TransformFinalBlock($plain,0,$plain.Length) $cipherB64 = [Convert]::ToBase64String($cipherBytes) # 4. Stocker le texte chiffré dans une variable d'environnement # 5. Chargeur de décryptage – la ligne exacte qui sera enregistrée (contient "AES") $loader = @" `$enc = [System.Environment]::GetEnvironmentVariable('ENC_PAYLOAD') `$bytes = [Convert]::FromBase64String(`$enc) `$aes = New-Object System.Security.Cryptography.AesCryptoServiceProvider `$aes.Key = $($key -join ',') `$aes.IV = $($iv -join ',') `$decryptor = `$aes.CreateDecryptor() `$plain = `$decryptor.TransformFinalBlock(`$bytes,0,`$bytes.Length) `$result = [System.Text.Encoding]::UTF8.GetString(`$plain) Write-Output `"Decrypted: `$result`" "@ # Exécuter le chargeur (sera capturé comme EventID 4104) Invoke-Expression $loader -
Commandes de nettoyage
# Supprimer la variable d'environnement # Effacer toutes les variables temporaires de la session Remove-Variable -Name key,iv,plain,cipherBytes,cipherB64,loader -ErrorAction SilentlyContinue
Validation post-simulation
- Exécutez la requête de validation (exemple KQL ci-dessus) mais filtrez pour
ScriptBlockText contient "AES"pour confirmer que la détection a été déclenchée. - Examinez les détails de l’alerte dans le SIEM ; vérifiez que le nom de l’alerte correspond à la règle (si définie) et que la gravité est signalée comme Haute.
Remarques finales
- La règle détecte avec succès le scénario d’utilisation simple de « AES ».
- Les adversaires peuvent échapper en divisant le mot (par exemple,
"AE"+"S"), en chargeant la classe .NET via la réflexion, ou en effectuant le décryptage dans des binaires compilés. - Améliorer la règle avec des indicateurs comportementaux (utilisation de variables d’environnement pour le texte chiffré, chaînes à haute entropie, création d’
AesCryptoServiceProviderobjets, et appelsTransformFinalBlock) améliorera la résilience face à une obfuscation simple.