SOC Prime Bias: Médio

12 Fev 2026 12:14

Sequestro de GAC

Author Photo
Ruslan Mikhalov Chefe de Pesquisa de Ameaças na SOC Prime linkedin icon Seguir
Sequestro de GAC
shield icon

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 invoca ngen.exe para 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.

    1. Copie o assembly malicioso para um diretório gravável (por exemplo, C:Temp).
    2. Execute o binário de prova de conceito para demonstrar o desvio.
    3. Run ngen.exe contra o assembly malicioso para simular uma etapa de geração de imagem nativa frequentemente observada após a colocação no GAC.
  • 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."