Sequestro de GAC
Detection stack
- AIDR
- Alert
- ETL
- Query
Resumo
O artigo explica como atores de ameaça com acesso de administrador local podem adulterar assemblies .NET no Cache de Assemblies Global (GAC) para executar código a partir de um caminho de execução confiável. Ao trocar DLLs como MIGUIControls.dll, um atacante pode estabelecer persistência e disparar cargas maliciosas sob processos legítimos. O método depende de direitos elevados para escrever em locais do GAC e pode incluir a remoção de imagens nativas para que o tempo de execução seja forçado a carregar o assembly alterado.
Investigação
Uma ferramenta de prova de conceito (GAC-POC.exe) demonstra o fluxo de trabalho ao copiar uma DLL legítima, modificá-la com Mono.Cecil para exibir uma caixa de mensagem e escrever a versão modificada de volta no GAC. Ações observáveis incluem a operação de escrita no GAC, a exclusão de imagens nativas usando ngen.exe e a atividade de criação de processos subsequente que ocorre quando o assembly atualizado é carregado.
Mitigação
Habilite a auditoria detalhada de criação de processos (ID de Evento 4688) e auditoria do sistema de arquivos (ID de Evento 4663) para diretórios do GAC. Alerta para uso suspeito de ngen.exe, execução de mscorsvw.exe e atividade inesperada de escrita de DLL em caminhos do GAC. Reduza a exposição limitando o acesso de administrador local e aplicando validação de assinatura de código ou verificações de integridade para assemblies armazenados no GAC.
Resposta
Se a execução do GAC-POC.exe, modificações inesperadas de assemblies ou remoções de imagens nativas forem detectadas, isole o host, preserve artefatos forenses e restaure assemblies do GAC a partir de uma linha de base conhecida boa. Continue escopo para determinar como o atacante obteve privilégios de administrador e se foi estabelecido persistência adicional.
Fluxo de Ataque
Execução de Simulação
Pré-requisito: A Verificação de Pré-voo de Telemetria & Linha de Base deve ter sido aprovada.
-
Narrativa de Ataque & Comandos:
O adversário preparou um assembly malicioso (
GAC‑PoC.exe) que, quando colocado no Cache de Assemblies Global, será carregado por qualquer processo .NET que resolva um nome forte correspondente. Para acionar a execução imediata e garantir que a regra de detecção veja a linha de comando exata, o atacante executa o assembly diretamente e também invocangen.exepara pré-compilar a DLL maliciosa, um passo típico no desvio do GAC para melhorar a stealth. As ações geram eventos 4688 distintos contendo as strings observadas.- Copie o assembly malicioso para um diretório gravável (por exemplo,
C:Temp). - Execute o binário de prova de conceito para demonstrar o desvio.
- Run
ngen.execontra o assembly malicioso para simular uma etapa de geração de imagem nativa frequentemente observada após a colocação no GAC.
- Copie o assembly malicioso para um diretório gravável (por exemplo,
-
Script de Teste de Regressão:
# ------------------------------------------------- # Script de Validação de Detecção de Desvio do GAC # ------------------------------------------------- # Pré-requisito: certifique-se de que a conta de teste tenha direitos de administrador local # e que as políticas de auditoria do Windows da etapa de pré-voo # estejam habilitadas. # ------------------------------------------------- # 1. Desimplante o executável malicioso (simulado) $tempDir = "C:Temp" if (-not (Test-Path $tempDir)) { New-Item -Path $tempDir -ItemType Directory | Out-Null } $gacPoCPath = Join-Path $tempDir "GAC-PoC.exe" # Simule a carga útil – crie um pequeno executável que escreva em um log. # Aqui usamos um binário de espaço reservado; em um teste real, você copiaria o arquivo real. Write-Output "Placeholder de carga útil falsa" | Out-File "$gacPoCPath.txt" # Para a demonstração, apenas chamamos cmd /c echo (o nome do arquivo ainda aparece em CommandLine) & cmd.exe /c "echo Simulação de GAC-PoC em execução > NUL" # 2. Execução direta de GAC-PoC.exe Write-Host "[*] Executando GAC-PoC.exe" Start-Process -FilePath $gacPoCPath -WindowStyle Hidden -PassThru | Out-Null # 3. Chame ngen.exe contra o mesmo binário $ngenPath = "$env:WINDIRMicrosoft.NETFramework64v4.0.30319ngen.exe" if (Test-Path $ngenPath) { Write-Host "[*] Executando ngen.exe em GAC-PoC.exe" & $ngenPath install $gacPoCPath } else { Write-Warning "ngen.exe não encontrado neste host – pulando etapa." } # 4. Registro de conclusão para o analista Write-Host "[+] Simulação concluída. Revise o SIEM para alertas de EventID 4688." -
Comandos de Limpeza:
# ------------------------------------------------- # Limpeza após validação de desvio do GAC # ------------------------------------------------- $tempDir = "C:Temp" $gacPoCPath = Join-Path $tempDir "GAC-PoC.exe" if (Test-Path $gacPoCPath) { Remove-Item -Path $gacPoCPath -Force Write-Host "[*] Removed GAC-PoC.exe" } # Remova quaisquer imagens nativas geradas (se alguma foi criada) $ngenPath = "$env:WINDIRMicrosoft.NETFramework64v4.0.30319ngen.exe" if (Test-Path $ngenPath) { & $ngenPath uninstall $gacPoCPath 2>$null Write-Host "[*] Desinstalou imagem nativa (se existia)." } # Opcionalmente, exclua a pasta temporária se estiver vazia if ((Get-ChildItem $tempDir).Count -eq 0) { Remove-Item -Path $tempDir -Force Write-Host "[*] Pasta temporária removida $tempDir" } Write-Host "[+] Limpeza completa."