
La vulnerabilità di escalation dei privilegi dello Spooler di stampa di Windows (CVE-2019-1040/CVE-2019-1019) è stata implementata come DLL riflessiva per i test di penetrazione.
PrintSpoofer è uno strumento che esegue un escalation dei privilegi locale sfruttando una vulnerabilità nel servizio Print Spooler di Windows (CVE-2019-1040 / CVE-2019-1019). Questo progetto implementa l'exploit PrintSpoofer in formato Reflective DLL, rendendolo adatto per l'uso con framework di penetration testing come Cobalt Strike.
PrintSpoofer sfrutta una vulnerabilità nel servizio Print Spooler di Windows che consente a un utente con privilegi bassi di ottenere privilegi di livello SYSTEM. L'exploit abusa del modo in cui il servizio Print Spooler gestisce le named pipe.
PrintSpoofer opera eseguendo i seguenti passaggi:
L'exploit verifica innanzitutto se il token corrente ha il privilegio SE_IMPERSONATE_NAME. È necessario per impersonare il token di un altro utente.
Viene creata una named pipe utilizzando un UUID casuale. Il percorso della pipe è:
\\.\pipe\<UUID>\pipe\spoolss
Si attende una connessione asincrona sulla named pipe creata. Viene creato un evento e la pipe viene preparata per accettare connessioni in arrivo.
In un thread separato, viene effettuata una chiamata RPC al servizio Print Spooler.
Invocando RpcRemoteFindFirstPrinterChangeNotificationEx, il servizio tenta di connettersi alla pipe che abbiamo creato.
Quando il servizio Print Spooler (in esecuzione come SYSTEM) si connette alla named pipe, l'exploit utilizza ImpersonateNamedPipeClient per impersonare il token del servizio.
Ciò comporta l'ottenimento dei privilegi SYSTEM.
Con un token SYSTEM, è ora possibile eseguire azioni ad alta privilegi.
Il servizio Print Spooler di Windows elabora le notifiche della stampante attraverso named pipe. Poiché il servizio non convalida correttamente le connessioni alle pipe, un attaccante può indurlo a connettersi a una pipe malevola e quindi impersonificare il token SYSTEM.
Il progetto comunica con il servizio Print Spooler utilizzando MS-RPRN (Print System Remote Protocol). Questo protocollo è definito attraverso un file IDL (Interface Definition Language) e abilita le chiamate RPC.
Una DLL riflessiva si comporta diversamente dalle DLL standard:
LoadLibraryAprire il file PrintSpoofer.sln in Visual Studio.
Selezionare Piattaforma soluzione e Configurazione:
x64 o Win32 (a seconda dell'architettura di destinazione)Release (produzione) o Debug (sviluppo)Compilare la soluzione tramite Compila soluzione (Ctrl+Maiusc+B).
La DLL compilata si troverà in:
PrintSpoofer\x64\Release\PrintSpoofer.dll (per x64)
PrintSpoofer\Win32\Release\PrintSpoofer.dll (per x86)
Il progetto utilizza le seguenti definizioni del preprocessore:
REFLECTIVE_DLL_EXPORTS: Abilita le esportazioni della DLL riflessivaREFLECTIVEDLLINJECTION_CUSTOM_DLLMAIN: Utilizza un DllMain personalizzatoREFLECTIVEDLLINJECTION_VIA_LOADREMOTELIBRARYR: Abilita LoadRemoteLibraryR (in modalità Release)PrintSpoofer può essere utilizzato con il comando elevate di Cobalt Strike:
elevate PrintSpoofer NOME_LISTENER
Dove:
PrintSpoofer: Il nome del modulo di elevazioneNOME_LISTENER: Il listener che riceverà la shell elevataLa DLL può essere caricata manualmente utilizzando tecniche di iniezione di DLL riflessive.
Un'esecuzione riuscita dell'exploit mostrerà:
[+] Found privilege: SeImpersonatePrivilege
[+] Named pipe listening...
[+] ImpersonateNamedPipeClient OK
[+] Exploit successfully, enjoy your shell
dllmain.cppDllMain)PrintSpoofer.cppms-rprn.idlReflectiveLoader.cppQuesto strumento è destinato esclusivamente a scopi educativi e per test di penetrazione autorizzati.
Questo progetto è concesso in licenza con la licenza MIT. Per maggiori informazioni, consultare il file LICENSE.