Détournement de GAC
Detection stack
- AIDR
- Alert
- ETL
- Query
Résumé
L’article explique comment les acteurs malveillants avec un accès administrateur local peuvent manipuler les assemblages .NET dans le cache d’assemblage global (GAC) pour exécuter du code à partir d’un chemin d’exécution de confiance. En échangeant des DLLs comme MIGUIControls.dll, un attaquant peut établir une persistance et déclencher des charges malveillantes sous des processus légitimes. La méthode dépend de droits élevés pour écrire dans les emplacements GAC et peut inclure la suppression des images natives afin que le runtime soit forcé de charger l’assemblage modifié.
Enquête
Un utilitaire de preuve de concept (GAC-POC.exe) démontre le flux de travail en copiant une DLL légitime, en la modifiant avec Mono.Cecil pour afficher une boîte de message, et en réécrivant la version modifiée dans le GAC. Les actions observables incluent l’opération d’écriture dans le GAC, la suppression d’images natives via ngen.exe et l’activité de création de processus qui suit lorsque l’assemblage mis à jour est chargé.
Atténuation
Activez l’audit détaillé de la création de processus (ID d’événement 4688) et l’audit du système de fichiers (ID d’événement 4663) pour les répertoires GAC. Alertez sur l’utilisation suspecte de ngen.exe, l’exécution de mscorsvw.exe et l’activité d’écriture de DLL inattendue dans les chemins GAC. Réduisez l’exposition en limitant l’accès administrateur local et en appliquant une validation de signature de code ou des vérifications d’intégrité pour les assemblages stockés dans le GAC.
Réponse
Si l’exécution de GAC-POC.exe, des modifications inattendues d’assemblage ou des suppressions d’images natives sont détectées, isolez l’hôte, préservez les artefacts médico-légaux et restaurez les assemblages GAC à partir d’une base de référence fiable. Continuez le périmètre pour déterminer comment l’attaquant a obtenu les privilèges administrateur et si une persistance supplémentaire a été établie.
« 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 Comptes valides : Comptes locaux</b><br/><b>Description</b> : Les adversaires obtiennent et utilisent des identifiants pour les comptes locaux, y compris les administrateurs, pour accéder non autorisé. »] class tech_valid_accounts technique tech_hijack_exec[« <b>Technique</b> – <b>T1574.014 Détournement du flux d’exécution : AppDomainManager</b><br/><b>Description</b> : Les adversaires remplacent ou modifient l’assemblage .NET AppDomainManager dans le cache d’assemblage global pour détourner le flux d’exécution des applications .NET. »] class tech_hijack_exec technique tech_dll_injection[« <b>Technique</b> – <b>T1055.001 Injection de bibliothèque de liens dynamiques</b><br/><b>Description</b> : Les adversaires injectent des DLLs malveillantes dans un processus de confiance pour exécuter leur code dans le contexte de ce processus. »] class tech_dll_injection technique process_task_sched[« <b>Processus</b> – Complément MMC du planificateur de tâches<br/><b>Rôle</b> : Composant système de confiance utilisé pour planifier des tâches. »] class process_task_sched process malicious_dll[« <b>Malware</b> – DLL malveillante (p. ex., charge utile)<br/><b>But</b> : Exécuté après l’injection pour effectuer des actions malveillantes. »] class malicious_dll malware %% Connexions montrant le flux d’attaque tech_valid_accounts u002du002d>|permet| tech_hijack_exec tech_hijack_exec u002du002d>|mène à| tech_dll_injection tech_dll_injection u002du002d>|utilise| process_task_sched process_task_sched u002du002d>|charge| malicious_dll «
Flux d’attaque
Exécution de simulation
Prérequis : La vérification préliminaire de la télémetrie et de la base de référence doit avoir réussi.
-
Narrative et Commandes d’Attaque :
L’adversaire a préparé un assemblage malveillant (
GAC-PoC.exe) qui, lorsqu’il est placé dans le cache d’assemblage global, sera chargé par tout processus .NET qui résout un nom fort correspondant. Pour déclencher une exécution immédiate et s’assurer que la règle de détection voit exactement la ligne de commande, l’attaquant exécute directement l’assemblage et invoque égalementngen.exepour pré-compiler la DLL malveillante, une étape typique dans le détournement de GAC pour améliorer la furtivité. Les actions génèrent des événements 4688 distincts contenant les chaînes surveillées.- Copier l’assemblage malveillant dans un répertoire accessible en écriture (par ex.,
C:Temp). - Exécuter le binaire de preuve de concept pour démontrer le détournement.
- Run
ngen.execontre l’assemblage malveillant pour simuler une étape de génération d’image native souvent observée après la mise en place de GAC.
- Copier l’assemblage malveillant dans un répertoire accessible en écriture (par ex.,
-
Script de Test de Régression :
# ------------------------------------------------- # Script de validation de détection de détournement de GAC # ------------------------------------------------- # Prérequis : assurez-vous que le compte de test a des droits d'administrateur local # et que les politiques d'audit Windows de l'étape préliminaire # sont activées. # ------------------------------------------------- # 1. Déployez l'exécutable malveillant (simulé) $tempDir = "C:Temp" if (-not (Test-Path $tempDir)) { New-Item -Path $tempDir -ItemType Directory | Out-Null } $gacPoCPath = Join-Path $tempDir "GAC-PoC.exe" # Simulez la charge utile – créez un petit exécutable qui écrit dans un journal. # Ici nous utilisons un binaire de remplacement ; dans un vrai test vous copieriez le vrai fichier. Write-Output "Fausse charge utile" | Out-File "$gacPoCPath.txt" # Pour la démonstration, nous invoquons simplement cmd /c echo (le nom du fichier apparaît toujours dans CommandLine) & cmd.exe /c "echo Running GAC-PoC simulation > NUL" # 2. Exécution directe de GAC-PoC.exe Write-Host "[*] Exécution de GAC-PoC.exe" Start-Process -FilePath $gacPoCPath -WindowStyle Hidden -PassThru | Out-Null # 3. Invoquer ngen.exe contre le même binaire $ngenPath = "$env:WINDIRMicrosoft.NETFramework64v4.0.30319ngen.exe" if (Test-Path $ngenPath) { Write-Host "[*] Exécution de ngen.exe sur GAC-PoC.exe" & $ngenPath install $gacPoCPath } else { Write-Warning "ngen.exe non trouvé sur cet hôte – étape ignorée." } # 4. Consigner l'achèvement pour l'analyste Write-Host "[+] Simulation terminée. Vérifiez les alertes EventID 4688 dans le SIEM." -
Commandes de Nettoyage :
# ------------------------------------------------- # Nettoyage après la validation du détournement de GAC # ------------------------------------------------- $tempDir = "C:Temp" $gacPoCPath = Join-Path $tempDir "GAC-PoC.exe" if (Test-Path $gacPoCPath) { Remove-Item -Path $gacPoCPath -Force Write-Host "[*] GAC-PoC.exe supprimé" } # Supprimez toute image native générée (si elle a été créée) $ngenPath = "$env:WINDIRMicrosoft.NETFramework64v4.0.30319ngen.exe" if (Test-Path $ngenPath) { & $ngenPath uninstall $gacPoCPath 2>$null Write-Host "[*] Image native désinstallée (si elle existait)." } # Supprimez éventuellement le dossier temporaire s'il est vide if ((Get-ChildItem $tempDir).Count -eq 0) { Remove-Item -Path $tempDir -Force Write-Host "[*] Répertoire temporaire $tempDir supprimé" } Write-Host "[+] Nettoyage terminé."