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.
“graph TB %% Class Definitions Section classDef technique fill:#ffcc99 classDef process fill:#c2f0c2 classDef malware fill:#ffeb99 %% Node definitions tech_valid_accounts[“<b>Technique</b> – <b>T1078.003 Valid Accounts: Local Accounts</b><br/><b>Description</b>: Adversaries obtain and abuse credentials for local accounts, including administrators, to gain unauthorized access.”] class tech_valid_accounts technique tech_hijack_exec[“<b>Technique</b> – <b>T1574.014 Hijack Execution Flow: AppDomainManager</b><br/><b>Description</b>: Adversaries replace or modify the .NET AppDomainManager assembly in the Global Assembly Cache to hijack the execution flow of .NET applications.”] class tech_hijack_exec technique tech_dll_injection[“<b>Technique</b> – <b>T1055.001 Dynamic-link Library Injection</b><br/><b>Description</b>: Adversaries inject malicious DLLs into a trusted process to execute their code in the context of that process.”] class tech_dll_injection technique process_task_sched[“<b>Process</b> – Task Scheduler MMC snapu2011in<br/><b>Role</b>: Trusted system component used to schedule tasks.”] class process_task_sched process malicious_dll[“<b>Malware</b> – Malicious DLL (e.g., payload)<br/><b>Purpose</b>: Executed after injection to run malicious actions.”] class malicious_dll malware %% Connections showing attack flow tech_valid_accounts u002du002d>|enables| tech_hijack_exec tech_hijack_exec u002du002d>|leads to| tech_dll_injection tech_dll_injection u002du002d>|uses| process_task_sched process_task_sched u002du002d>|loads| malicious_dll “
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."