
La vulnerabilidad de escalada de privilegios del Print Spooler de Windows (CVE-2019-1040/CVE-2019-1019) se ha implementado como un Reflective DLL para pruebas de penetración.
PrintSpoofer es una herramienta que realiza una escalada de privilegios local explotando una vulnerabilidad en el servicio Print Spooler de Windows (CVE-2019-1040 / CVE-2019-1019). Este proyecto implementa el exploit PrintSpoofer en formato Reflective DLL, lo que lo hace adecuado para su uso con frameworks de pruebas de penetración como Cobalt Strike.
PrintSpoofer explota una vulnerabilidad en el servicio Print Spooler de Windows que permite a un usuario con pocos privilegios obtener privilegios de nivel SYSTEM. El exploit abusa de la forma en que el servicio Print Spooler maneja los named pipes.
PrintSpoofer opera realizando los siguientes pasos:
El exploit primero comprueba si el token actual tiene el privilegio SE_IMPERSONATE_NAME. Esto es necesario para suplantar el token de otro usuario.
Se crea un named pipe utilizando un UUID aleatorio. La ruta del pipe es:
\\.\pipe\<UUID>\pipe\spoolss
Se espera una conexión asíncrona en el named pipe creado. Se crea un evento y el pipe se prepara para aceptar conexiones entrantes.
En un hilo separado, se realiza una llamada RPC al servicio Print Spooler.
Al invocar RpcRemoteFindFirstPrinterChangeNotificationEx, el servicio intenta conectarse al pipe que creamos.
Cuando el servicio Print Spooler (que se ejecuta como SYSTEM) se conecta al named pipe, el exploit usa ImpersonateNamedPipeClient para suplantar el token del servicio.
Esto da como resultado la obtención de privilegios SYSTEM.
Con un token SYSTEM, ahora se pueden ejecutar acciones de alto privilegio.
El servicio Print Spooler de Windows procesa las notificaciones de impresora a través de named pipes. Debido a que el servicio no valida adecuadamente las conexiones de los pipes, un atacante puede obligarlo a conectarse a un pipe malicioso y luego suplantar el token SYSTEM.
El proyecto se comunica con el servicio Print Spooler mediante el protocolo MS-RPRN (Print System Remote Protocol). Este protocolo se define a través de un archivo IDL (Interface Definition Language) y permite realizar llamadas RPC.
Una DLL reflectante se comporta de manera diferente a las DLL estándar:
LoadLibraryAbra el archivo PrintSpoofer.sln en Visual Studio.
Seleccione la Plataforma de solución y la Configuración:
x64 o Win32 (según la arquitectura de destino)Release (producción) o Debug (desarrollo)Compile la solución mediante Build Solution (Ctrl+Shift+B).
La DLL compilada se ubicará en:
PrintSpoofer\x64\Release\PrintSpoofer.dll (para x64)
PrintSpoofer\Win32\Release\PrintSpoofer.dll (para x86)
El proyecto utiliza las siguientes definiciones de preprocesador:
REFLECTIVE_DLL_EXPORTS: Habilita las exportaciones de Reflective DLLREFLECTIVEDLLINJECTION_CUSTOM_DLLMAIN: Utiliza un DllMain personalizadoREFLECTIVEDLLINJECTION_VIA_LOADREMOTELIBRARYR: Habilita LoadRemoteLibraryR (en modo Release)PrintSpoofer se puede utilizar con el comando elevate de Cobalt Strike:
elevate PrintSpoofer LISTENER_NAME
Donde:
PrintSpoofer: El nombre del módulo de elevaciónLISTENER_NAME: El listener que recibirá la shell elevadaLa DLL se puede cargar manualmente utilizando técnicas de inyección de DLL reflectante.
Una ejecución exitosa del exploit mostrará:
[+] Found privilege: SeImpersonatePrivilege
[+] Named pipe listening...
[+] ImpersonateNamedPipeClient OK
[+] Exploit successfully, enjoy your shell
dllmain.cppDllMain)PrintSpoofer.cppms-rprn.idlReflectiveLoader.cppEsta herramienta está destinada únicamente a fines educativos y para pruebas de penetración autorizadas.
Este proyecto está licenciado bajo la Licencia MIT. Para más información, consulte el archivo LICENSE.