Hijacking .NET: Hijack Execution Flow - COR_PROFILER (T1574.012)

Il COR_PROFILER rappresenta una funzionalità legittima del .NET Framework che permette agli sviluppatori di caricare DLL di profilazione non gestite in ogni processo che carica il Common Language Runtime (CLR). Questa caratteristica, pensata per monitorare e debuggare codice gestito, diventa un vettore d'attacco quando gli avversari la sfruttano per dirottare il flusso di esecuzione.

La tecnica si manifesta attraverso tre tattiche principali: Persistence (TA0003) per mantenere l'accesso ai sistemi anche dopo riavvii, Privilege Escalation (TA0004) per ottenere permessi elevati quando processi .NET vengono eseguiti con privilegi superiori, e Defense Evasion (TA0005) per mascherare attività malevole all'interno di processi legittimi.

L'impatto è significativo: ogni volta che il CLR viene invocato, la DLL malevola viene caricata automaticamente. A partire da .NET Framework 4, non è nemmeno necessario registrare la DLL come oggetto COM se si specifica la variabile COR_PROFILER_PATH, rendendo l'attacco ancora più furtivo.

Per comprendere questa tecnica, iniziamo creando una DLL di profiling malevola. Su Windows, il COR_PROFILER può essere configurato a tre livelli: sistema, utente o processo. La configurazione più persistente avviene attraverso il registro di sistema.

Prima di tutto, verifichiamo se sono già presenti profiler configurati: reg query "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v COR_ENABLE_PROFILING reg query "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v COR_PROFILER

Per impostare un profiler a livello di sistema (richiede privilegi amministrativi): reg add "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v COR_ENABLE_PROFILING /t REG_SZ /d "1" /f reg add "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v COR_PROFILER /t REG_SZ /d "{11111111-1111-1111-1111-111111111111}" /f reg add "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v COR_PROFILER_PATH /t REG_SZ /d "C:\Temp\malicious.dll" /f

Blue Mockingbird ha dimostrato l'efficacia di questa tecnica utilizzando wmic.exe per modificare le variabili d'ambiente. Un approccio alternativo consiste nel creare un profiler in-memory senza toccare il registro:

$env:COR_ENABLE_PROFILING = "1" $env:COR_PROFILER = "{11111111-1111-1111-1111-111111111111}" $env:COR_PROFILER_PATH = "C:\Temp\evil.dll"

Ogni nuovo processo .NET avviato da questa sessione PowerShell caricherà automaticamente la DLL specificata. Per testare l'hijacking, esegui qualsiasi applicazione .NET come powershell.exe o un semplice programma C#.

Su Linux con .NET Core, il meccanismo è simile ma utilizza variabili d'ambiente standard: export CORECLR_ENABLE_PROFILING=1 export CORECLR_PROFILER={11111111-1111-1111-1111-111111111111} export CORECLR_PROFILER_PATH=/tmp/profiler.so

Un aspetto interessante è che la DLL di profilazione viene caricata prima dell'esecuzione del codice gestito, permettendo di intercettare e modificare il comportamento dell'applicazione fin dall'inizio.

Vuoi diventare un Ethical Hacker ma non sai da dove iniziare?

Scarica la guida gratuita e segui il percorso corretto fin dal primo passo