hacktricks/network-services-pentesting/pentesting-printers/README.md

23 KiB
Raw Blame History

Pentesting de Impresoras

Aprende hacking en AWS de cero a héroe con htARTE (HackTricks AWS Red Team Expert)!

Otras formas de apoyar a HackTricks:

Por favor, ten en cuenta que la mayoría del contenido de toda la información relacionada con _Pentesting de Impresoras_** ** fue tomada de la enorme y asombrosa investigación que puedes encontrar en http://hacking-printers.net/. He intentado resumir esa información aquí, pero siempre puedes ir a la fuente para aprender más sobre el tema.

Fundamentos

A continuación se muestra una relación esquemática sobre la encapsulación de los lenguajes de impresoras:\

Encapsulación de los lenguajes de impresoras

Protocolos de impresión en red

Enviar datos a un dispositivo de impresión se puede hacer mediante cable USB/paralelo o a través de una red. Este wiki se centra en la impresión en red, pero la mayoría de los ataques presentados también se pueden realizar contra impresoras locales. Existen varios protocolos exóticos para la impresión en red como el NCP de Novell o AppleTalk. En el mundo de Windows, las comparticiones de impresoras SMB/CIFS se han vuelto bastante populares. Además, algunos dispositivos admiten la impresión a través de protocolos genéricos como subidas de archivos FTP o HTTP. Sin embargo, los protocolos de impresión más comunes que admiten directamente las impresoras en red son LPD, IPP y la impresión en el puerto crudo 9100. Los protocolos de impresión en red pueden ser atacados directamente, por ejemplo, explotando un desbordamiento de búfer en el daemon LPD de la impresora. Sin embargo, en muchos escenarios de ataque, solo actúan como un canal para desplegar código malicioso de lenguaje de impresora. Ten en cuenta que una impresora en red generalmente admite múltiples protocolos para imprimir un documento, lo que amplía la superficie de ataque.

Aprende más sobre el puerto crudo 9100 aquí.

Aprende más sobre LPD en Pentesting 515 aquí.

Aprende más sobre IPP en Pentesting 631 aquí.

Lenguajes de Control de Impresoras

Un lenguaje de control de trabajos gestiona configuraciones como bandejas de salida para el trabajo de impresión actual. Aunque generalmente se sitúa como una capa opcional entre el protocolo de impresión y el lenguaje de descripción de página, las funciones pueden solaparse. Ejemplos de lenguajes de control de trabajos específicos de proveedores son CPCA, XJCL, EJL y PJL que es compatible con una variedad de impresoras y se discutirá a continuación. Además, los lenguajes de control y gestión de impresoras están diseñados para afectar no solo a un único trabajo de impresión sino al dispositivo en su totalidad. Un enfoque para definir un estándar común para esta tarea fue NPAP. Sin embargo, no se ha establecido y solo es compatible con Lexmark. Otros fabricantes de impresoras en cambio utilizan SNMP o su metalenguaje basado en PJL PML.

PJL

El Lenguaje de Trabajos de Impresora (PJL) fue originalmente introducido por HP pero pronto se convirtió en un estándar de facto para el control de trabajos de impresión. 'PJL se sitúa por encima de otros lenguajes de impresoras' y se puede utilizar para cambiar configuraciones como la bandeja de papel o el tamaño. Sin embargo, se debe señalar que PJL no se limita al trabajo de impresión actual ya que algunas configuraciones pueden hacerse permanentes. PJL también se puede utilizar para cambiar la pantalla de la impresora o leer/escribir archivos en el dispositivo. Hay muchos dialectos ya que los proveedores tienden a admitir solo un subconjunto de los comandos listados en la referencia de PJL y prefieren agregar los propios. PJL también se utiliza para establecer el formato de archivo de los datos de impresión reales que seguirán. Sin un cambio de lenguaje explícito, la impresora tiene que identificar el lenguaje de descripción de página basado en números mágicos. A continuación se muestran comandos típicos de PJL para establecer el tamaño de papel y el número de copias antes de cambiar el intérprete al modo PostScript:

@PJL SET PAPER=A4
@PJL SET COPIES=10
@PJL ENTER LANGUAGE=POSTSCRIPT

Dentro de la página sobre el puerto 9100 'puerto raw' puedes encontrar más información sobre cómo enumerar PJL.

PML

El Printer Management Language (PML) es un lenguaje propietario para controlar impresoras HP. Básicamente combina las características de SNMP con PJL. No se ha publicado documentación disponible al público, sin embargo, partes del estándar fueron filtradas por el proyecto LPRng: la Guía del Usuario de Passthrough de PJL a PML y SNMP define PML como 'un protocolo de gestión de impresoras basado en el modelo de solicitud-respuesta y orientado a objetos' y ofrece una introducción a los conceptos básicos de la sintaxis. PML está incrustado dentro de PJL y puede usarse para leer y configurar valores SNMP en un dispositivo de impresión. Esto es especialmente interesante si un firewall bloquea el acceso a servicios SNMP (161/udp). El uso de PML dentro de un trabajo de impresión para recuperar el valor hrDeviceDescr (OID 1.3.6.1.2.1.25.3.2.1.3, descripción textual de un dispositivo) se demuestra a continuación:

> @PJL DMINFO ASCIIHEX="000006030302010301"
< "8000000603030201030114106870204c617365724a65742034323530

UEL

El Lenguaje de Salida Universal (UEL) en realidad no es un verdadero 'lenguaje' de control de trabajos sino un único comando utilizado para terminar la corriente de datos actual: el carácter de escape (\x1b), seguido de %-12345X. Fue introducido originalmente con el PCL de HP y es compatible con la mayoría de las impresoras láser modernas. Una buena práctica de los 'controladores de impresora' es invocar el UEL al principio y al final de cada trabajo de impresión, de modo que se detenga/reinicie la interpretación del lenguaje de la impresora y cada trabajo tenga su propio entorno separado, como se muestra a continuación:

\x1b%-12345X
@PJL SET PAPER=A4
@PJL ENTER LANGUAGE=PCL
...
[PCL datastream]
...
\x1b%-12345X

De lo contrario, por ejemplo, configuraciones de PJL como el tamaño del papel o definiciones de PostScript establecidas en un trabajo de impresión podrían influir en el siguiente trabajo. UEL puede ser útil para encadenar múltiples trabajos en un solo archivo/flujos de datos enviado a la impresora. Esto se puede utilizar para engañar a contadores de páginas de hardware o para cambiar el lenguaje de impresión en ataques avanzados de impresión entre sitios.

Lenguajes de Descripción de Página

Un lenguaje de descripción de página (PDL) especifica la apariencia del documento real. Sin embargo, debe señalarse que algunos PDL ofrecen un control limitado del trabajo, por lo que una clara demarcación entre el lenguaje de descripción de página y el lenguaje de control de impresora/trabajo no siempre es posible. La función de un 'controlador de impresora' es traducir el archivo a ser impreso en un PDL que sea entendido por el modelo de impresora. Cabe destacar que algunas impresoras de inyección de tinta de bajo costo no admiten ningún lenguaje de descripción de página de alto nivel. Las impresoras basadas en el host o GDI solo aceptan flujos de datos de mapa de bits simples como ZJS mientras que el renderizado real lo realiza el controlador de impresora. Existen varios lenguajes de descripción de página propietarios como PRESCRIBE de Kyocera, SPL, XES, CaPSL, RPCS, ESC/P que se utiliza principalmente en impresoras de matriz de puntos o HP-GL y HP-GL/2 que se han diseñado para plotters. También es común el soporte para impresión directa de PDF y XPS en impresoras más nuevas. Sin embargo, los lenguajes de descripción de página 'estándar' más comunes son PostScript y PCL.

PostScript (PS)

El término 'descripción de página' puede ser engañoso, ya que PostScript es capaz de mucho más que solo crear gráficos vectoriales. PostScript es un lenguaje de programación basado en pila, Turing-completo que consta de casi 400 operadores para aritmética, manipulación de pila y gráficos y varios tipos de datos como arreglos o diccionarios y fue creado por Adobe.
Técnicamente hablando, el acceso a un intérprete de PostScript ya se puede clasificar como ejecución de código porque cualquier función algorítmica teóricamente se puede implementar en PostScript. Ciertamente, sin acceso a la pila de red o bibliotecas adicionales del sistema operativo, las posibilidades se limitan a cálculos matemáticos arbitrarios como minar bitcoins. Sin embargo, PostScript es capaz de E/S básica del sistema de archivos para almacenar código, gráficos o archivos de fuentes utilizados con frecuencia.
Originalmente diseñado como una característica, los peligros de tal funcionalidad estaban limitados antes de que las impresoras se interconectaran y los riesgos se discutían principalmente en el contexto de intérpretes de PostScript basados en el host. En este sentido, también es notable el PostScript Encapsulado (EPS) ya que se puede incluir en otros formatos de archivo para ser interpretado en el host como documentos LaTeX. Al igual que PJL y PCL, PostScript admite comunicación bidireccional entre el host y la impresora.
A continuación se muestra un ejemplo de código PostScript para hacer eco de Hello world en stdout:

%!
(Hello world) print

Brother y Kyocera utilizan sus propios clones de PostScript: Br-Script y KPDL. Estas variantes del lenguaje PostScript no son 100% compatibles, especialmente en lo que respecta a características de seguridad como salir del bucle del servidor. PostScript se puede utilizar para una variedad de ataques como denegación de servicio (por ejemplo, a través de bucles infinitos), manipulación y retención de trabajos de impresión, así como para obtener acceso al sistema de archivos de la impresora.

Saliendo del bucle del servidor

Normalmente, cada trabajo de impresión está encapsulado en su propio entorno separado. Una característica interesante de PostScript es que un programa puede eludir la encapsulación del trabajo de impresión y alterar la VM inicial para trabajos subsiguientes. Para hacerlo, puede utilizar startjob, una característica de Nivel 2:

true 0 startjob

o exitserver (disponible en todas las implementaciones que incluyen un servidor de trabajos):

serverdict begin 0 exitserver

Esta capacidad está controlada por StartJobPassword que por defecto es 0 (comparar divulgación de credenciales). Dado que el bucle del servidor de trabajos generalmente es responsable de limpiar el estado del intérprete entre trabajos, cualquier cambio realizado fuera del bucle del servidor permanecerá como parte del estado permanente del intérprete para todos los trabajos subsiguientes. En otras palabras, un trabajo de impresión puede acceder y alterar trabajos futuros. ¡Bingo!

Redefinición de operadores

Cuando un documento PostScript llama a un operador, se utiliza la primera versión encontrada en la pila de diccionarios. Los operadores generalmente residen en el diccionario systemdict, sin embargo, al colocar una nueva versión en el diccionario userdict, los operadores pueden ser prácticamente sobrescritos porque la versión definida por el usuario es la primera encontrada en la pila de diccionarios. Utilizando los operadores startjob/exitserver, tales cambios pueden hacerse permanentes al menos hasta que la impresora se reinicie. A continuación se muestra un esquema de la pila de diccionarios de PostScript:


La pila de diccionarios de PostScript


El impacto potencial de redefinir operadores solo está limitado por la creatividad. Cuando se imprimen documentos legítimos adicionales y llaman a un operador redefinido, se ejecutará la versión del atacante. Esto puede llevar a varios ataques como denegación de servicio, retención de trabajos de impresión y manipulación. Sin embargo, note que esto no es necesariamente un fallo de seguridad, sino una característica de un lenguaje de 32 años de antigüedad, disponible en casi cualquier impresora PostScript y RIP.

PCL

PCL 3 y PCL 4 agregaron soporte para fuentes y macros que pueden descargarse permanentemente al dispositivo sin embargo, solo se hace referencia por un id numérico, no por un nombre de archivo, ya que no se pretende el acceso directo al sistema de archivos. PCL 1 a 5 consisten en secuencias de escape seguidas por uno o más caracteres ASCII que representan un comando a interpretar. PCL 6 Enhanced o PCL XL utiliza un protocolo binario codificado y orientado a objetos. A continuación se muestra un ejemplo de documento PCL para imprimir Hello world:

<Esc>Hello world

Debido a sus capacidades limitadas, PCL es difícil de explotar desde una perspectiva de seguridad a menos que uno descubra comandos propietarios interesantes en alguna variante del PCL de los fabricantes de impresoras. La herramienta PRET implementa un sistema de archivos virtual basado en PCL que utiliza macros para guardar el contenido y los metadatos de los archivos en la memoria de la impresora. Este hack demuestra que incluso un dispositivo que solo admite lenguajes de descripción de páginas minimalistas como PCL puede usarse para almacenar archivos arbitrarios como material que infringe derechos de autor. Aunque convertir una impresora en un servicio de intercambio de archivos no es una vulnerabilidad de seguridad per se, puede considerarse como 'uso indebido del servicio' dependiendo de la política corporativa.

Ataques Varios

Unidad USB o cable

Los datos pueden enviarse y recibirse de una impresora local por cables USB o paralelos. Ambos canales son compatibles con PRET para comunicarse con el dispositivo. Además, las impresoras y MFPs a menudo vienen con puertos USB tipo A que permiten a los usuarios imprimir directamente desde un dispositivo USB.
Mientras que las unidades USB conectadas no ofrecen un canal bidireccional, su uso en una sala de copias concurrida puede parecer menos sospechoso. Obviamente, explotar impresoras USB requiere que el atacante obtenga acceso físico al dispositivo. Sin embargo, no es completamente irrealista para la mayoría de las instituciones y empresas. Conseguir acceso físico a la impresora generalmente se considera menos difícil que para otros componentes de red como servidores o estaciones de trabajo.

Impresión entre sitios

Abusando de solicitudes web del cliente un atacante puede abusar de impresoras arbitrarias dentro de la red interna del cliente conectado a su página web maliciosa.
Aprende cómo es posible esto aquí.

Abusando del servicio Spooler en AD

Si puedes encontrar cualquier servicio Spooler escuchando dentro del dominio, podrías ser capaz de abusar de él para obtener nuevas credenciales y escalar privilegios.
Más información sobre cómo encontrar y abusar de servicios Spooler aquí.

Escalada de Privilegios

Valores de Fábrica

Hay varias formas posibles de restablecer un dispositivo a los valores de fábrica, y esta es una funcionalidad crítica de seguridad ya que sobrescribe mecanismos de protección como contraseñas establecidas por el usuario.
Aprende más aquí.

Evasión de Contabilidad

Podrías ser capaz de suplantar a usuarios existentes o inexistentes para imprimir páginas usando sus cuentas o manipular el contador de hardware o software para poder imprimir más páginas.
Aprende cómo hacerlo aquí.

Escáner y Fax

Accediendo a las funcionalidades de Escáner o Fax podrías ser capaz de acceder a otras funcionalidades, pero todo esto depende del proveedor.
Aprende más aquí.

Acceso a Trabajos de Impresión

Retención de Trabajos de Impresión

Los trabajos pueden ser retenidos en memoria y ser impresos nuevamente en un momento posterior desde el panel de control, o usando PostScript incluso puedes acceder de forma remota a todos los trabajos que van a ser impresos, descargarlos e imprimirlos.
Aprende más aquí.

Manipulación de Trabajos de Impresión

Puedes añadir nuevo contenido a las páginas que se imprimen, cambiar todo el contenido que va a ser impreso o incluso reemplazar solo ciertas letras o palabras.
Aprende cómo hacerlo aquí.

Divulgación de Información

Acceso a Memoria

Podrías ser capaz de volcar la memoria NVRAM y extraer información sensible (como contraseñas) de allí.
Lee cómo hacerlo aquí.

Acceso al Sistema de Archivos

Podrías ser capaz de acceder al sistema de archivos abusando de PJL o PostScript.
Lee cómo hacerlo aquí.

Divulgación de Credenciales/Fuerza Bruta

Podrías ser capaz de divulgar la contraseña que se está usando abusando de SNMP o la configuración de LDAP o podrías intentar fuerza bruta en PJL o PostScript.
Lee cómo hacerlo aquí.

Ejecución de Código

Desbordamientos de Búfer

Varios desbordamientos de búfer han sido encontrados ya en la entrada de PJL y en el daemon LPD, y podría haber más.
Lee esto para más información.

Actualizaciones de Firmware

Podrías ser capaz de hacer que la impresora actualice el controlador a uno malicioso especialmente creado por ti.
Lee esto para más información.

Paquetes de Software

Los fabricantes de impresoras han comenzado a introducir la posibilidad de instalar software personalizado en sus dispositivos pero la información no está disponible públicamente. La característica de escribir software personalizado que se ejecuta en impresoras fue intencionada y está reservada para revendedores y contratistas.
Lee más sobre esto aquí.

Denegación de Servicio

Canal de Transmisión

Ocupar todas las conexiones e incrementar el tiempo de espera del servidor podría llevar a un DoS.
Aprende más sobre esto aquí.

Procesamiento de Documentos

Puedes usar PostScript y PJL para realizar bucles infinitos, redefinir comandos para evitar cualquier impresión, apagar cualquier funcionalidad de impresión o incluso poner la impresora en modo fuera de línea.
Aprende más sobre esto aquí.

Daño Físico

Uno podría abusar de PJL o PostScript para escribir en la NVRAM cientos de miles de veces con el objetivo de romper el chip o al menos hacer que los parámetros se congelen en los valores predeterminados de fábrica.
Aprende más sobre esto aquí.

Aprende hacking en AWS de cero a héroe con htARTE (HackTricks AWS Red Team Expert)!

Otras formas de apoyar a HackTricks: