Port Monitor DLL Hijacking: Port Monitors (T1547.010)
La tecnica T1547.010 – Port Monitors sfrutta un meccanismo legittimo del sottosistema di stampa Windows per ottenere persistenza (TA0003) ed escalation di privilegi (TA0004). Il servizio spoolsv.exe, che gira nativamente con privilegi SYSTEM, carica all'avvio le DLL registrate come port monitor nella chiave di registro HKLM\SYSTEM\CurrentControlSet\Control\Print\Monitors. Un attaccante che riesca a scrivere in quella chiave un valore Driver puntante a una DLL controllata ottiene esecuzione automatica di codice in contesto privilegiato ad ogni boot.
L'API documentata AddMonitor consente di registrare programmaticamente un nuovo monitor, mentre una scrittura diretta a registro produce lo stesso effetto se i permessi lo consentono. La DLL può risiedere in C:\Windows\System32 (path di default cercato dallo spooler) oppure in un percorso arbitrario fully-qualified specificato nel valore Driver.
Nella kill chain la tecnica si colloca a valle di un Initial Access riuscito e di una prima escalation che garantisca privilegi amministrativi (necessari per scrivere nella chiave HKLM). Il risultato è duplice: sopravvivenza ai riavvii e transizione stabile a NT AUTHORITY\SYSTEM, spesso preludio a movimenti laterali o deployment di ulteriori impianti. La superficie interessata è ogni sistema Windows con servizio Print Spooler abilitato, condizione ancora comune su workstation e file server nonostante le raccomandazioni post-PrintNightmare di disabilitarlo dove non necessario.
In un ingaggio red team la simulazione di T1547.010 richiede un contesto con privilegi amministrativi locali sulla macchina target e servizio Print Spooler attivo. La verifica preliminare si fa con Get-Service -Name Spooler in PowerShell: se lo stato è Running, il vettore è disponibile.
La strada più pulita passa attraverso l'API AddMonitor esposta da winspool.drv. Un piccolo loader in C o C# può registrare un nuovo monitor specificando nome, ambiente (Windows x64) e nome della DLL, che deve trovarsi in C:\Windows\System32. La struttura MONITOR_INFO_2 richiede i tre campi pName, pEnvironment, pDLLName. Una volta invocata la funzione con successo, la DLL viene caricata al successivo avvio dello spooler.
In alternativa, quando si vuole evitare la chiamata API e passare per una scrittura diretta al registro, il comando è:
reg add "HKLM\SYSTEM\CurrentControlSet\Control\Print\Monitors\EvilMon" /v Driver /t REG_SZ /d "C:\Windows\System32\evilmon.dll" /f
Seguito da un restart dello spooler:
Restart-Service -Name Spooler -Force
La DLL deve esportare la funzione InitializePrintMonitor2 (o InitializePrintMonitor su sistemi legacy) restituendo un handle valido, altrimenti lo spooler la scarica immediatamente e logga un errore in Application. Un template minimale include DllMain per l'esecuzione del payload e uno stub di InitializePrintMonitor2 che ritorna una struttura vuota ma sintatticamente corretta, evitando il crash del servizio (che verrebbe notato).
Per la fase offensiva reale sono disponibili moduli in framework noti: Metasploit (open source) espone il post-exploitation module exploit/windows/local/persistence, mentre Empire (open source) e Covenant (open source) offrono task di persistenza analoghi che possono essere adattati. Per lo sviluppo custom della DLL, Visual Studio Community (gratuito) con template DLL Win32 è sufficiente; MinGW-w64 (open source) è l'alternativa cross-compile da Linux.
Raccomandazioni lab-safe: eseguire su VM isolata con snapshot pre-attacco, perché un errore nella firma di InitializePrintMonitor2 può mandare lo spooler in crash loop e impedire il boot pulito. Documentare il nome del monitor creato per la rimozione post-test con reg delete sulla stessa chiave. Testare anche la persistenza dopo riavvio completo, non solo dopo restart del servizio, per confermare la resistenza ai reboot.
Vuoi diventare un Ethical Hacker ma non sai da dove iniziare?
Accedi alle lezioni gratuite e segui il percorso corretto fin dal primo passo