IntermediovulnerabilidadesCVEwindowsprint-spoolerprivilege-escalation

CVE-2021-34527 PrintNightmare: La Impresora como Arma (2021)

PrintNightmare (CVE-2021-34527 y CVE-2021-1675) convirtió el servicio Windows Print Spooler en un vector de ejecución de código como SYSTEM. Una divulgación accidental, parches incompletos y la ubicuidad del Print Spooler (activo incluso en Domain Controllers) crearon un caos que grupos como Magniber, Vice Society y Conti supieron aprovechar.

MalwareIntel Research··13 min lectura·2 técnicas ATT&CK

La impresora que nadie pidió

El servicio Windows Print Spooler lleva funcionando desde Windows NT 3.1, lanzado en 1993. Su misión es gestionar trabajos de impresión: aceptar documentos, encolarlos, enviarlos a la impresora y gestionar los controladores necesarios. Es uno de esos componentes de Windows que pasan completamente desapercibidos hasta que dejan de funcionar.

O hasta que alguien descubre que permiten ejecutar código arbitrario como SYSTEM en cualquier máquina Windows de la red.

En junio de 2021, una serie de eventos que combinaron confusión entre investigadores, divulgación accidental de exploits y parches incompletos de Microsoft convirtieron el Print Spooler en el protagonista involuntario de una de las crisis de seguridad más caóticas del año. PrintNightmare, como se bautizó colectivamente al conjunto de vulnerabilidades CVE-2021-1675, CVE-2021-34527 y CVE-2021-36958, afectaba a todas las versiones de Windows, estaba habilitado por defecto en todos los sistemas (incluyendo Domain Controllers), y demostró que un componente de 28 años de antigüedad podía seguir sorprendiendo a la comunidad de seguridad.

La divulgación accidental

El parche que no era

El 8 de junio de 2021, Microsoft publicó su actualización mensual de seguridad (Patch Tuesday) que incluía un fix para CVE-2021-1675, descrita como una vulnerabilidad de escalada de privilegios local (LPE) en el Print Spooler. La clasificación inicial fue "Important" (no "Critical"), y la descripción sugería que solo podía explotarse localmente.

Dos semanas después, el 21 de junio, Microsoft reclasificó CVE-2021-1675 de LPE a RCE (Remote Code Execution). Este cambio silencioso en la clasificación pasó relativamente desapercibido.

El error de los investigadores chinos

En paralelo, un equipo de investigadores chinos de Sangfor (Zhiniang Peng y Xuefeng Li) había descubierto de forma independiente una vulnerabilidad RCE en el Print Spooler y preparaban una presentación para la conferencia Black Hat USA 2021. Cuando vieron que Microsoft había parcheado CVE-2021-1675 y la había reclasificado como RCE, asumieron que se trataba del mismo bug que ellos habían encontrado.

Bajo la creencia de que la vulnerabilidad ya estaba parcheada, publicaron el exploit completo (proof-of-concept) en GitHub el 28 de junio de 2021. Lo que no sabían es que su exploit funcionaba contra un bug diferente al que Microsoft había parcheado. El parche de junio no cubría su variante.

El exploit estuvo disponible públicamente durante varias horas antes de que los investigadores se dieran cuenta del error y lo retiraran. Pero Internet no olvida. El código fue clonado, replicado y distribuido en cuestión de minutos.

El caos de los CVEs

Lo que siguió fue una confusión sin precedentes:

29 de junio: Investigadores de seguridad confirman que el parche de junio de Microsoft no protege contra el exploit publicado. La vulnerabilidad es un zero-day efectivo.

1 de julio: Microsoft asigna CVE-2021-34527 como identificador separado para la vulnerabilidad RCE que el parche de junio no cubría, reconociendo que es un bug diferente a CVE-2021-1675.

6 de julio: Microsoft publica un parche de emergencia (fuera de ciclo) para CVE-2021-34527. Investigadores descubren inmediatamente que el parche es incompleto y puede evadirse.

Agosto-septiembre 2021: Se descubre CVE-2021-36958, otra variante que explota el mecanismo Point-and-Print. Microsoft la clasifica como zero-day.

La comunidad de seguridad adoptó el nombre "PrintNightmare" para referirse colectivamente a toda esta familia de vulnerabilidades, contribuyendo tanto a la visibilidad del problema como a la confusión sobre qué estaba parcheado y qué no.

Anatomía técnica

El servicio Print Spooler

El Print Spooler (spoolsv.exe) es un servicio de Windows que gestiona la cola de impresión y la comunicación con impresoras. Expone una interfaz RPC (Remote Procedure Call) que permite a clientes remotos enviar trabajos de impresión, consultar el estado de impresoras, y gestionar controladores de impresora.

Las funciones RPC del Print Spooler se definen en la interfaz MS-RPRN (Print System Remote Protocol) y MS-PAR (Print System Asynchronous Remote Protocol). Las funciones relevantes para PrintNightmare son:

RpcAddPrinterDriverEx()
  → Instala un controlador de impresora en el sistema
  → Acepta rutas a archivos de driver (DLLs)
  → Ejecuta con privilegios SYSTEM

RpcAsyncAddPrinterDriver()
  → Versión asíncrona de la misma función
  → Misma vulnerabilidad

El mecanismo de carga de drivers

Cuando se instala un controlador de impresora en Windows, el proceso es:

  1. El cliente llama a RpcAddPrinterDriverEx con una estructura DRIVER_INFO que incluye:

    • pDriverPath: ruta al DLL principal del driver.
    • pDataFile: ruta al archivo de datos del driver.
    • pConfigFile: ruta al DLL de configuración del driver.
  2. El Spooler descarga estos archivos desde la ruta especificada (que puede ser una ruta UNC de red: \\servidor\share\archivo.dll).

  3. Los archivos se copian al directorio de drivers del sistema: C:\Windows\System32\spool\drivers\x64\3\

  4. El Spooler carga la DLL en su propio proceso (spoolsv.exe), que ejecuta como NT AUTHORITY\SYSTEM.

La vulnerabilidad

El fallo fundamental era doble:

Falta de verificación de privilegios. La función RpcAddPrinterDriverEx no verificaba adecuadamente que el usuario que la invocaba tuviera permisos de administrador para instalar drivers. Un usuario autenticado con privilegios mínimos (cualquier cuenta de dominio) podía llamar a esta función.

Falta de validación de rutas. El Spooler no validaba que los archivos referenciados fueran controladores de impresora legítimos. Cualquier DLL podía cargarse, incluyendo una que ejecutara código malicioso.

La combinación de ambos fallos significaba que un usuario autenticado con los privilegios más bajos posibles podía hacer que el Print Spooler descargara y ejecutara una DLL arbitraria como SYSTEM.

El exploit paso a paso

ATACANTE (usuario de dominio sin privilegios)      VÍCTIMA (cualquier Windows)
    │                                                      │
    │  1. Crear SMB share con DLL maliciosa               │
    │     \\atacante\share\evil.dll                        │
    │     (DLL que ejecuta código como SYSTEM)             │
    │                                                      │
    │  2. RpcAddPrinterDriverEx(                          │
    │       pDataFile = "\\atacante\share\evil.dll"       │
    │     )  ──────────────────────────────────────────→  │
    │                                                      │
    │                   3. Spooler descarga evil.dll        │
    │                      desde \\atacante\share\          │
    │                                                      │
    │                   4. Spooler carga evil.dll           │
    │                      en spoolsv.exe (SYSTEM)         │
    │                                                      │
    │                   5. Código malicioso ejecuta         │
    │                      como NT AUTHORITY\SYSTEM         │
    │                                                      │

En el escenario de explotación local (LPE), el atacante no necesitaba un SMB share remoto. Podía colocar la DLL maliciosa en un directorio local accesible y apuntar RpcAddPrinterDriverEx a esa ruta local.

Point-and-Print: la tercera variante

Cuando los parches de Microsoft intentaron corregir RpcAddPrinterDriverEx, los investigadores descubrieron que el mecanismo Point-and-Print de Windows proporcionaba otra ruta de explotación.

Point-and-Print permite a los usuarios instalar controladores de impresora de forma transparente al conectarse a una impresora compartida en la red. El proceso es:

  1. El usuario se conecta a una impresora compartida en un servidor.
  2. Si el cliente no tiene el driver instalado, lo descarga automáticamente del servidor de impresión.
  3. El driver se instala localmente sin intervención del administrador.

Un atacante podía configurar un servidor de impresión malicioso con un driver troyanizado. Cuando un usuario se conectaba a la impresora compartida (o era redirigido a ella), el driver malicioso se instalaba automáticamente con privilegios SYSTEM.

Esta variante (CVE-2021-36958) era particularmente peligrosa porque no requería que el atacante tuviera credenciales de dominio: bastaba con que el usuario hiciera clic en un enlace o fuera redirigido a un recurso UNC controlado por el atacante.

Historia del Print Spooler: un componente problemático

Stuxnet y el Print Spooler (2010)

PrintNightmare no fue la primera vez que el Print Spooler de Windows protagonizó un incidente de seguridad de escala global. En 2010, Stuxnet, el gusano que saboteó el programa nuclear iraní, utilizaba CVE-2010-2729 (una vulnerabilidad RCE en el Print Spooler) como uno de sus mecanismos de propagación en redes locales.

Stuxnet explotaba el Print Spooler para ejecutar código remotamente en máquinas Windows de la red de la planta de enriquecimiento de uranio de Natanz, permitiendo la propagación lateral del gusano hacia los sistemas SCADA que controlaban las centrifugadoras.

Décadas de vulnerabilidades

El historial de vulnerabilidades en el Print Spooler es extenso:

AñoCVETipoContexto
2009CVE-2009-0228RCEProcesamiento de separación de páginas
2010CVE-2010-2729RCEExplotado por Stuxnet
2012CVE-2012-1851RCEEjecución vía impresora compartida
2016CVE-2016-3238RCEInyección de driver al conectar a impresora
2020CVE-2020-1048LPEEscritura arbitraria de archivos
2020CVE-2020-1337LPEBypass del parche de CVE-2020-1048
2021CVE-2021-1675LPE/RCEPrintNightmare (primera variante)
2021CVE-2021-34527RCEPrintNightmare (segunda variante)
2021CVE-2021-36958RCEPrintNightmare (Point-and-Print)

Este historial sugiere un problema estructural en el componente, no fallos aislados. La base de código del Print Spooler se remonta a los años 90, fue diseñada en una época donde la seguridad no era una prioridad, y acumula décadas de parches incrementales que han añadido complejidad sin resolver los problemas de diseño subyacentes.

Explotación por grupos de ransomware

PrintNightmare se convirtió rápidamente en una herramienta favorita de grupos de ransomware por su combinación de fiabilidad, impacto y ubicuidad.

Magniber

Magniber, un grupo de ransomware activo desde 2017 y originalmente enfocado en Corea del Sur, fue uno de los primeros en incorporar PrintNightmare. Utilizaban la vulnerabilidad para escalar privilegios después de obtener acceso inicial mediante campañas de malvertising. La elevación a SYSTEM les permitía desactivar software de seguridad, eliminar shadow copies y desplegar el ransomware con los permisos máximos.

Vice Society

Vice Society, un grupo emergente en 2021 que se especializó en ataques contra el sector educativo (escuelas, universidades, distritos escolares), adoptó PrintNightmare como su técnica principal de movimiento lateral. Su cadena de ataque típica era:

  1. Acceso inicial mediante credenciales comprometidas o RDP expuesto.
  2. Reconocimiento del dominio.
  3. PrintNightmare contra Domain Controllers y servidores críticos para obtener SYSTEM.
  4. Despliegue de ransomware (inicialmente variantes de HelloKitty/FiveHands, posteriormente su propio ransomware).

Vice Society causó disrupciones significativas en instituciones educativas durante 2021 y 2022, un período en el que muchas de ellas dependían fuertemente de sus sistemas informáticos para la enseñanza remota y presencial post-pandemia.

Conti

Conti, uno de los grupos de ransomware más prolíficos de la historia, integró PrintNightmare en sus playbooks operativos internos. Los documentos filtrados de Conti (Conti Leaks, febrero 2022) revelaron que el grupo tenía procedimientos estandarizados para usar PrintNightmare como vector de escalada de privilegios, junto con otras técnicas como Zerologon y Kerberoasting.

La cadena de ataque de Conti con PrintNightmare seguía un patrón documentado:

  1. Acceso inicial: Phishing con documentos que desplegaban BazarLoader o Trickbot.
  2. Persistencia: Cobalt Strike beacon instalado en la máquina comprometida.
  3. Escalada: PrintNightmare contra el Domain Controller para obtener SYSTEM.
  4. Exfiltración: Robo de datos sensibles antes del cifrado (doble extorsión).
  5. Impacto: Despliegue masivo de Conti ransomware vía Group Policy o PsExec.

Los parches incompletos

Un patrón frustrante

La secuencia de parches para PrintNightmare fue una demostración del desafío que representa parchear un componente con una superficie de ataque tan amplia:

8 de junio (Patch Tuesday): Parche para CVE-2021-1675 como LPE. No cubría la variante RCE.

6 de julio (parche de emergencia): Parche para CVE-2021-34527. Investigadores como Matthew Hickey (@hackerfantastic) demostraron en horas que podía evadirse usando rutas UNC con caracteres especiales.

Julio-agosto (parches adicionales): Microsoft publicó correcciones incrementales que cerraban los bypasses conocidos, pero cada parche generaba nuevas investigaciones que descubrían variantes adicionales.

Septiembre 2021: Microsoft abordó CVE-2021-36958 (Point-and-Print) con cambios en el comportamiento por defecto del sistema, requiriendo privilegios de administrador para instalar drivers de impresora.

Por qué fue tan difícil parchear

La dificultad de parchear PrintNightmare radicaba en la tensión entre seguridad y funcionalidad:

La funcionalidad era legítima. Instalar controladores de impresora de forma remota es una necesidad operativa en entornos corporativos. Los administradores de IT necesitan poder desplegar impresoras a miles de usuarios sin visitar cada máquina.

El modelo de permisos era el problema. El Print Spooler había sido diseñado para facilitar la instalación de drivers, no para restringirla. Cambiar el modelo de permisos significaba romper flujos de trabajo existentes.

La superficie de ataque era múltiple. RpcAddPrinterDriverEx no era la única función vulnerable. RpcAsyncAddPrinterDriver, Point-and-Print, y otros mecanismos proporcionaban rutas alternativas de explotación. Cada parche cerraba una puerta, pero los investigadores encontraban ventanas.

Mitigaciones y recomendaciones

Desactivación del Print Spooler

La mitigación más efectiva siempre fue la más simple: desactivar el servicio Print Spooler en todos los sistemas que no lo necesitaran.

# Detener y desactivar el Print Spooler
Stop-Service -Name Spooler -Force
Set-Service -Name Spooler -StartupType Disabled

# Verificar que está desactivado
Get-Service -Name Spooler | Select-Object Status, StartType

Para Domain Controllers, la recomendación era terminante: el Print Spooler no debería estar activo en un DC bajo ninguna circunstancia, salvo que ese DC funcione explícitamente como servidor de impresión (una configuración desaconsejada).

Restricción de Point-and-Print

Para las máquinas de usuario que necesitaban imprimir:

Política de grupo:
  Computer Configuration → Administrative Templates → Printers
  → Point and Print Restrictions

  Configurar:
  - "When installing drivers for a new connection": Show warning and elevation prompt
  - "When updating drivers for an existing connection": Show warning and elevation prompt
  - "Users can only point and print to these servers": Activar con lista de servidores de impresión autorizados

Monitorización

Monitorizar:
  - Event ID 316 (Operational log): Instalación de driver de impresora
  - Creación de archivos DLL en: C:\Windows\System32\spool\drivers\
  - Conexiones SMB salientes desde spoolsv.exe a hosts no autorizados
  - Cambios en la clave de registro:
    HKLM\SOFTWARE\Policies\Microsoft\Windows NT\Printers\PointAndPrint

El legado: la impresora como superficie de ataque

PrintNightmare cambió la percepción de la industria sobre los servicios heredados de Windows. Un componente diseñado para gestionar impresoras resultó ser un vector de compromiso de dominio más efectivo que muchos exploits diseñados específicamente para atacar Active Directory.

La lección principal es sobre la superficie de ataque acumulada. El Print Spooler tiene 30 años de código legacy, interfaces RPC expuestas, un modelo de permisos permisivo y presencia universal (habilitado por defecto en todas las instalaciones de Windows). Cada una de estas propiedades individualmente es un factor de riesgo. Combinadas, crearon un componente que ha producido más de 50 vulnerabilidades documentadas a lo largo de su historia.

La respuesta de Microsoft fue significativa: después de PrintNightmare, la compañía implementó cambios fundamentales en cómo el sistema operativo gestiona la instalación de drivers de impresora, requiriendo privilegios de administrador por defecto. Fue un cambio que priorizó la seguridad sobre la conveniencia, algo que habría sido impensable una década antes.

Para los equipos de seguridad, PrintNightmare dejó una regla clara: auditar todos los servicios habilitados por defecto en los sistemas, especialmente en servidores críticos como Domain Controllers. La pregunta correcta no es "¿qué servicios necesitamos activar?" sino "¿qué servicios necesitamos desactivar?" La impresora que nadie pidió resultó ser el arma que todo atacante quería.

Técnicas MITRE ATT&CK referenciadas

Preguntas frecuentes

Artículos relacionados

Este contenido tiene fines exclusivamente educativos y de investigación en ciberseguridad defensiva. No se proporcionan binarios maliciosos ni payloads ejecutables. El uso indebido de esta información es responsabilidad exclusiva del usuario. Leer disclaimer completo.