SOC Prime Bias: Medio

12 Feb 2026 12:14

Dirottamento GAC

Author Photo
Ruslan Mikhalov Capo della Ricerca sulle Minacce presso SOC Prime linkedin icon Segui
Dirottamento GAC
shield icon

Detection stack

  • AIDR
  • Alert
  • ETL
  • Query

Sommario

L’articolo spiega come gli attori delle minacce con accesso amministrativo locale possano manomettere le assembly .NET nella Global Assembly Cache (GAC) per eseguire codice da un percorso di esecuzione attendibile. Sostituendo DLL come MIGUIControls.dll, un attaccante può stabilire la persistenza e attivare payload dannosi sotto processi legittimi. Il metodo dipende dai diritti elevati per scrivere nelle posizioni GAC e può includere la rimozione delle immagini native in modo che il runtime sia costretto a caricare l’assembly alterato.

Indagine

Un’utilitĂ  proof-of-concept (GAC-POC.exe) dimostra il flusso di lavoro copiando una DLL legittima, modificandola con Mono.Cecil per visualizzare una finestra di messaggio e scrivendo la versione modificata nuovamente nel GAC. Le azioni osservabili includono l’operazione di scrittura nel GAC, l’eliminazione delle immagini native utilizzando ngen.exe e l’attivitĂ  di creazione del processo successiva che si verifica quando l’assembly aggiornato viene caricato.

Mitigazione

Abilitare l’auditing dettagliato della creazione dei processi (ID evento 4688) e l’auditing del file system (ID evento 4663) per le directory GAC. Allertare sull’uso sospetto di ngen.exe, l’esecuzione di mscorsvw.exe e l’attivitĂ  di scrittura DLL inattesa nei percorsi GAC. Ridurre l’esposizione limitando l’accesso amministrativo locale e applicando la validazione della firma del codice o i controlli di integritĂ  per le assembly memorizzate nel GAC.

Risposta

Se viene rilevata l’esecuzione di GAC-POC.exe, modifiche inaspettate alle assembly o rimozioni di immagini native, isolare l’host, preservare gli artefatti forensi e ripristinare le assembly GAC da un baseline affidabile. Continuare a definire come l’attaccante abbia ottenuto i privilegi di amministratore e se sia stata stabilita un’ulteriore persistenza.

“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>: Gli avversari ottengono e abusano delle credenziali per account locali, inclusi gli amministratori, per ottenere accesso non autorizzato.”] class tech_valid_accounts technique tech_hijack_exec[“<b>Technique</b> – <b>T1574.014 Hijack Execution Flow: AppDomainManager</b><br/><b>Description</b>: Gli avversari sostituiscono o modificano l’assembly AppDomainManager .NET nella Global Assembly Cache per dirottare il flusso di esecuzione delle applicazioni .NET.”] class tech_hijack_exec technique tech_dll_injection[“<b>Technique</b> – <b>T1055.001 Dynamic-link Library Injection</b><br/><b>Description</b>: Gli avversari iniettano DLL dannose in un processo attendibile per eseguire il loro codice nel contesto di quel processo.”] class tech_dll_injection technique process_task_sched[“<b>Process</b> – Task Scheduler MMC snapu2011in<br/><b>Role</b>: Componente di sistema fidato utilizzato per pianificare i compiti.”] class process_task_sched process malicious_dll[“<b>Malware</b> – DLL dannosa (ad esempio, payload)<br/><b>Purpose</b>: Eseguito dopo l’iniezione per eseguire azioni dannose.”] class malicious_dll malware %% Connections showing attack flow tech_valid_accounts u002du002d>|abilita| tech_hijack_exec tech_hijack_exec u002du002d>|porta a| tech_dll_injection tech_dll_injection u002du002d>|utilizza| process_task_sched process_task_sched u002du002d>|carica| malicious_dll “

Flusso di Attacco

Esecuzione della Simulazione

Prerequisito: il Controllo Pre-volo di Telemetria e Baseline deve essere superato.

  • Narrativa dell’Attacco e Comandi:

    L’avversario ha preparato un’assembly dannosa (GAC‑PoC.exe) che, una volta collocata nella Global Assembly Cache, verrĂ  caricata da qualsiasi processo .NET che risolva un nome forte corrispondente. Per attivare l’esecuzione immediata e garantire che la regola di rilevamento veda esattamente la riga di comando, l’attaccante esegue l’assembly direttamente e invoca anche ngen.exe per precompilare la DLL dannosa, un passaggio tipico nel dirottamento GAC per migliorare la furtivitĂ . Le azioni generano eventi 4688 distinti contenenti le stringhe monitorate.

    1. Copia l’assembly dannosa in una directory scrivibile (ad esempio, C:Temp).
    2. Eseguire il binario proof-of-concept per dimostrare il dirottamento.
    3. Run ngen.exe contro l’assembly dannosa per simulare un passaggio di generazione dell’immagine nativa spesso osservato dopo il posizionamento nel GAC.
  • Script di Test di Regressione:

    # -------------------------------------------------
    # Script di Validazione Rilevamento GAC-Hijacking
    # -------------------------------------------------
    # Prerequisito: assicurarsi che l'account di test abbia diritti di admin locale
    # e che le politiche di audit di Windows dalla fase pre-volo
    # siano abilitate.
    # -------------------------------------------------
    
    # 1. Distribuire l'eseguibile dannoso (simulato)
    $tempDir = "C:Temp"
    if (-not (Test-Path $tempDir)) { New-Item -Path $tempDir -ItemType Directory | Out-Null }
    
    $gacPoCPath = Join-Path $tempDir "GAC-PoC.exe"
    
    # Simulare il payload – creare un piccolo eseguibile che scrive su un log.
    # Qui usiamo un binario placeholder; in un test reale si copierebbe il file reale.
    Write-Output "Falso placeholder del payload" | Out-File "$gacPoCPath.txt"
    # Per dimostrazione, chiamiamo solo cmd /c echo (il nome del file appare comunque in CommandLine)
    & cmd.exe /c "echo Esecuzione simulazione GAC-PoC > NUL"
    
    # 2. Esecuzione diretta di GAC-PoC.exe
    Write-Host "[*] Esecuzione di GAC-PoC.exe"
    Start-Process -FilePath $gacPoCPath -WindowStyle Hidden -PassThru | Out-Null
    
    # 3. Invocare ngen.exe contro lo stesso binario
    $ngenPath = "$env:WINDIRMicrosoft.NETFramework64v4.0.30319ngen.exe"
    if (Test-Path $ngenPath) {
        Write-Host "[*] Esecuzione di ngen.exe su GAC-PoC.exe"
        & $ngenPath install $gacPoCPath
    } else {
        Write-Warning "ngen.exe non trovato su questo host – passaggio saltato."
    }
    
    # 4. Registrare il completamento per l'analista
    Write-Host "[+] Simulazione completata. Revisionare SIEM per avvisi EventID 4688."
  • Comandi di Pulizia:

    # -------------------------------------------------
    # Pulizia dopo la validazione GAC-Hijacking
    # -------------------------------------------------
    $tempDir = "C:Temp"
    $gacPoCPath = Join-Path $tempDir "GAC-PoC.exe"
    
    if (Test-Path $gacPoCPath) {
        Remove-Item -Path $gacPoCPath -Force
        Write-Host "[*] Rimosso GAC-PoC.exe"
    }
    
    # Rimuovere eventuali immagini native generate (se ne sono state create)
    $ngenPath = "$env:WINDIRMicrosoft.NETFramework64v4.0.30319ngen.exe"
    if (Test-Path $ngenPath) {
        & $ngenPath uninstall $gacPoCPath 2>$null
        Write-Host "[*] Immagine nativa disinstallata (se esisteva)."
    }
    
    # Opzionalmente eliminare la cartella temporanea se vuota
    if ((Get-ChildItem $tempDir).Count -eq 0) {
        Remove-Item -Path $tempDir -Force
        Write-Host "[*] Rimosso direttorio temporaneo $tempDir"
    }
    
    Write-Host "[+] Pulizia completata."