
La vulnérabilité d'élévation de privilèges du spouleur d'impression Windows (CVE-2019-1040/CVE-2019-1019) a été implémentée en tant que Reflective DLL pour les tests de pénétration.
PrintSpoofer est un outil qui réalise une élévation de privilèges locale en exploitant une vulnérabilité dans le service Windows Print Spooler (CVE-2019-1040 / CVE-2019-1019). Ce projet implémente l'exploit PrintSpoofer au format Reflective DLL, ce qui le rend adapté à une utilisation avec des frameworks de tests d'intrusion comme Cobalt Strike.
PrintSpoofer exploite une vulnérabilité dans le service Windows Print Spooler qui permet à un utilisateur avec peu de privilèges d'obtenir des privilèges de niveau SYSTEM. L'exploit abuse de la manière dont le service Print Spooler gère les pipes nommés (named pipes).
PrintSpoofer opère en réalisant les étapes suivantes :
L'exploit vérifie d'abord si le jeton courant possède le privilège SE_IMPERSONATE_NAME. Celui-ci est nécessaire pour usurper le jeton d'un autre utilisateur.
Un named pipe est créé en utilisant un UUID aléatoire. Le chemin du pipe est :
\\.\pipe\<UUID>\pipe\spoolss
Une connexion asynchrone est attendue sur le named pipe créé. Un événement est créé et le pipe est préparé pour accepter des connexions entrantes.
Dans un thread séparé, un appel RPC est effectué vers le service Print Spooler. En invoquant RpcRemoteFindFirstPrinterChangeNotificationEx, le service tente de se connecter au pipe que nous avons créé.
Lorsque le service Print Spooler (s'exécutant en tant que SYSTEM) se connecte au named pipe, l'exploit utilise ImpersonateNamedPipeClient pour usurper le jeton du service. Cela permet d'obtenir les privilèges SYSTEM.
Avec un jeton SYSTEM, des actions de haute privilège peuvent maintenant être exécutées.
Le service Windows Print Spooler traite les notifications d'imprimante via des named pipes. Comme le service ne valide pas correctement les connexions aux pipes, un attaquant peut le forcer à se connecter à un pipe malveillant, puis usurper le jeton SYSTEM.
Le projet communique avec le service Print Spooler en utilisant le protocole MS-RPRN (Print System Remote Protocol). Ce protocole est défini via un fichier IDL (Interface Definition Language) et permet les appels RPC.
Une DLL reflective se comporte différemment des DLL standards :
LoadLibraryOuvrez le fichier PrintSpoofer.sln dans Visual Studio.
Sélectionnez votre plateforme de solution et configuration :
x64 ou Win32 (selon l'architecture cible)Release (production) ou Debug (développement)Compilez la solution via Générer la solution (Ctrl+Maj+B).
La DLL compilée se trouvera à l'emplacement :
PrintSpoofer\x64\Release\PrintSpoofer.dll (pour x64)
PrintSpoofer\Win32\Release\PrintSpoofer.dll (pour x86)
Le projet utilise les définitions de préprocesseur suivantes :
REFLECTIVE_DLL_EXPORTS : Active les exports de la DLL reflectiveREFLECTIVEDLLINJECTION_CUSTOM_DLLMAIN : Utilise un DllMain personnaliséREFLECTIVEDLLINJECTION_VIA_LOADREMOTELIBRARYR : Active LoadRemoteLibraryR (en mode Release)PrintSpoofer peut être utilisé avec la commande elevate de Cobalt Strike :
elevate PrintSpoofer LISTENER_NAME
Où :
PrintSpoofer : le nom du module d'élévationLISTENER_NAME : l'écouteur qui recevra le shell élevéLa DLL peut être chargée manuellement via des techniques d'injection Reflective DLL.
Une exécution réussie de l'exploit affichera :
[+] Found privilege: SeImpersonatePrivilege
[+] Named pipe listening...
[+] ImpersonateNamedPipeClient OK
[+] Exploit successfully, enjoy your shell
dllmain.cppDllMain)PrintSpoofer.cppms-rprn.idlReflectiveLoader.cppCet outil est destiné exclusivement à des fins éducatives et pour des tests d'intrusion autorisés.
Ce projet est sous licence MIT. Pour plus d'informations, consultez le fichier LICENSE.