hacktricks/network-services-pentesting/pentesting-printers
carlospolop 63bd9641c0 f
2023-06-05 20:33:24 +02:00
..
accounting-bypass.md f 2023-06-05 20:33:24 +02:00
buffer-overflows.md f 2023-06-05 20:33:24 +02:00
credentials-disclosure-brute-force.md f 2023-06-05 20:33:24 +02:00
cross-site-printing.md f 2023-06-05 20:33:24 +02:00
document-processing.md f 2023-06-05 20:33:24 +02:00
factory-defaults.md f 2023-06-05 20:33:24 +02:00
file-system-access.md f 2023-06-05 20:33:24 +02:00
firmware-updates.md f 2023-06-05 20:33:24 +02:00
memory-access.md f 2023-06-05 20:33:24 +02:00
physical-damage.md f 2023-06-05 20:33:24 +02:00
print-job-manipulation.md f 2023-06-05 20:33:24 +02:00
print-job-retention.md f 2023-06-05 20:33:24 +02:00
README.md f 2023-06-05 20:33:24 +02:00
scanner-and-fax.md f 2023-06-05 20:33:24 +02:00
software-packages.md f 2023-06-05 20:33:24 +02:00
transmission-channel.md f 2023-06-05 20:33:24 +02:00

Pentesting de Impresoras

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

Por favor, ten en cuenta que la mayoría del contenido de toda la información relacionada con el Pentesting de Impresoras fue tomado 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 impresora:\

Encapsulación de los lenguajes de impresora

Protocolos de impresión en red

El envío de datos a un dispositivo de impresora se puede hacer mediante un cable USB/paralelo o a través de una red. Esta 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. Hay varios protocolos exóticos para la impresión en red, como el NCP de Novell o AppleTalk. En el mundo de Windows, las impresoras compartidas SMB/CIFS se han vuelto bastante populares. Además, algunos dispositivos admiten la impresión a través de protocolos genéricos como la carga de archivos FTP o HTTP. Sin embargo, los protocolos de impresión más comunes admitidos directamente por las impresoras de red son la impresión LPD, IPP y el puerto 9100 de puerto crudo, que se discutirán a continuación. Los protocolos de impresión en red pueden ser atacados directamente, por ejemplo, explotando un desbordamiento de búfer en el demonio LPD de la impresora. En muchos escenarios de ataque, sin embargo, actúan solo como un transportador/canal para implementar código malicioso de lenguaje de impresora. Tenga en cuenta que una impresora de 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 impresora

Un lenguaje de control de trabajo administra configuraciones como las bandejas de salida para el trabajo de impresión actual. Si bien generalmente se encuentra como una capa opcional entre el protocolo de impresión y el lenguaje de descripción de página, las funciones pueden superponerse. Ejemplos de lenguajes de control de trabajo específicos del proveedor 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 solo 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 su lugar utilizan SNMP o su metalenguaje basado en PJL, PML.

PJL

El Lenguaje de Trabajo de Impresora (PJL) fue introducido originalmente por HP, pero pronto se convirtió en un estándar de facto para el control de trabajos de impresión. "PJL reside por encima de otros lenguajes de impresora" y se puede utilizar para cambiar configuraciones como la bandeja o el tamaño del papel. Sin embargo, debe señalarse 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 enumerados en la referencia de PJL y prefieren agregar comandos propietarios. PJL también se utiliza para establecer el formato de archivo de los datos de impresión reales que seguirán. Sin un cambio explícito de lenguaje de este tipo, la impresora tiene que identificar el lenguaje de descripción de página en función de los números mágicos. A continuación se muestran los comandos típicos de PJL para establecer el tamaño del 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' se puede encontrar más información sobre cómo enumerar PJL.

PML

El Lenguaje de Gestión de Impresoras (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 públicamente, sin embargo, partes del estándar fueron filtradas por el proyecto LPRng: la Guía de usuario de PJL Passthrough a PML y SNMP define PML como "un protocolo de gestión de impresoras de solicitud-respuesta orientado a objetos" y da una introducción a los conceptos básicos de la sintaxis. PML está incrustado dentro de PJL y se puede utilizar para leer y establecer valores SNMP en un dispositivo de impresora. Esto es especialmente interesante si un firewall bloquea el acceso a los servicios SNMP (161/udp). El uso de PML dentro de un trabajo de impresión que recupera el valor hrDeviceDescr (OID 1.3.6.1.2.1.25.3.2.1.3, descripción textual de un dispositivo) se muestra a continuación:

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

La parte trasera de la cadena respondida por la impresora, 6870204c617365724a65742034323530, es hexadecimal para hp LaserJet 4250. Como se puede ver, es posible invocar (un subconjunto de) comandos SNMP a través de PJL vía PML. Un uso de PML sensible a la seguridad es restablecer las impresoras HP a los valores de fábrica a través de trabajos de impresión ordinarios, eliminando así mecanismos de protección como contraseñas establecidas por el usuario.

UEL

El Lenguaje Universal de Salida (UEL) en realidad no es un "lenguaje" real de control de trabajos, sino un solo 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 la interpretación del lenguaje de la impresora se detenga/reinicie 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, la configuración PJL como el tamaño del medio de papel o las definiciones de PostScript establecidas en un trabajo de impresión influirían en el siguiente trabajo. UEL puede ser útil para concatenar varios trabajos en un solo archivo/secuencia de datos enviados a la impresora. Esto se puede utilizar para engañar a los contadores de páginas de hardware o para cambiar el lenguaje de impresión en ataques 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 de trabajo limitado, por lo que no siempre es posible una clara demarcación entre la descripción de página y el lenguaje de control de impresora/trabajo. La función de un "controlador de impresora" es traducir el archivo que se va a imprimir en un PDL que es entendido por el modelo de impresora. Tenga en cuenta 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 en absoluto. Las impresoras llamadas basadas en host o GDI solo aceptan secuencias de datos de mapa de bits simples como ZJS mientras que la representación real la realiza el controlador de impresora. Hay 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 han sido diseñados para plóteres. El soporte para la impresión directa de PDF y XPS también es común 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 simplemente crear gráficos vectoriales. PostScript es un lenguaje de programación basado en pila, completamente Turing que consta de casi 400 operadores para aritmética, manipulación de pila y gráficos y varios tipos de datos como matrices 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 puede teóricamente ser implementada 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 la minería de bitcoins. Sin embargo, PostScript es capaz de E/S básica del sistema de archivos para almacenar código, gráficos o archivos de fuente de uso frecuente.
Originalmente diseñado como una característica, los peligros de tal funcionalidad eran limitados antes de que las impresoras se interconectaran y los riesgos se discutieran principalmente en el contexto de los intérpretes de PostScript basados en host. En este sentido, Encapsulated PostScript (EPS) también es notable 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 imprimir "Hola mundo" en stdout:

%!
(Hello world) print

Brother y Kyocera utilizan sus propios clones de PostScript: Br-Script y KPDL. Estas versiones 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 de trabajos de impresión y retención de trabajos de impresión, así como para acceder al sistema de archivos de la impresora.

Salir del bucle del servidor

Normalmente, cada trabajo de impresión se encapsula en su propio entorno separado. Una característica interesante de PostScript es que un programa puede evitar la encapsulación del trabajo de impresión y alterar la VM inicial para trabajos posteriores. Para hacerlo, puede usar startjob, una función 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 con la divulgación de credenciales). Dado que el bucle del servidor de trabajos es generalmente responsable de limpiar el estado del intérprete entre trabajos, cualquier cambio que se haga fuera del bucle del servidor permanecerá como parte del estado permanente del intérprete para todos los trabajos posteriores. En otras palabras, un trabajo de impresión puede acceder y alterar trabajos posteriores. ¡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 suelen residir en el diccionario systemdict, sin embargo, colocando 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. Usando los operadores startjob/exitserver, tales cambios pueden hacerse permanentes, al menos hasta que se reinicie la impresora. Se muestra a continuación un esquema de la pila de diccionarios de PostScript:


La pila de diccionarios de PostScript


El impacto potencial de la redefinición de operadores está limitado solo por la creatividad. Cuando se imprimen más documentos legítimos 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 de trabajos de impresión. Sin embargo, tenga en cuenta que esto no es necesariamente un error de seguridad, sino una característica del lenguaje de 32 años de antigüedad, disponible en casi cualquier impresora PostScript y RIP.

PCL

PCL 3 y PCL 4 añadieron soporte para fuentes y macros que ambos pueden ser descargados permanentemente en el dispositivo, sin embargo, solo se hace referencia a ellos 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 de uno o más caracteres ASCII que representan un comando a interpretar. PCL 6 Enhanced o 'PCL XL' utiliza un protocolo orientado a objetos codificado en binario. A continuación se muestra un ejemplo de documento PCL para imprimir 'Hola mundo':

<Esc>Hello world

Debido a sus capacidades limitadas, PCL es difícil de explotar desde una perspectiva de seguridad a menos que se descubran comandos propietarios interesantes en la versión de PCL de algunos 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 muestra que incluso un dispositivo que admite solo lenguajes de descripción de página minimalistas como PCL se puede utilizar para almacenar archivos arbitrarios como material que infringe los derechos de autor. Aunque convertir una impresora en un servicio de intercambio de archivos no es una vulnerabilidad de seguridad en sí misma, puede aplicarse como "uso indebido del servicio" dependiendo de la política corporativa.

Ataques varios

Unidad flash USB o cable

Los datos se pueden enviar y recibir desde una impresora local mediante cables USB o paralelos. Ambos canales son compatibles con PRET para comunicarse con el dispositivo. Además, las impresoras y los MFP a menudo se envían con puertos USB de tipo A que permiten a los usuarios imprimir directamente desde un dispositivo USB. Aunque las unidades flash USB conectadas no ofrecen un canal bidireccional, su uso en una sala de copias concurrida puede parecer menos conspicuo. Obviamente, explotar las 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. En general, se puede considerar que obtener acceso físico a la impresora es menos difícil que para otros componentes de la red como servidores o estaciones de trabajo.

Impresión entre sitios

Abusando de la solicitud 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 aquí.

Abuso del servicio Spooler en AD

Si puede encontrar algún servicio Spool escuchando dentro del dominio, es posible que pueda abusar de él para obtener nuevas credenciales y escalar privilegios. Más información sobre cómo encontrar y abusar de los servicios Spooler aquí.

Escalada de privilegios

Valores predeterminados de fábrica

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

Bypass de contabilidad

Es posible que pueda suplantar a usuarios existentes o no existentes para imprimir páginas utilizando 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, es posible que pueda 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 se pueden retener en la memoria y se pueden imprimir nuevamente en un momento posterior desde el panel de control, o utilizando PostScript, incluso puede acceder de forma remota a todos los trabajos que se van a imprimir, descargarlos e imprimirlos. Aprende más aquí.

Manipulación de trabajos de impresión

Puede agregar nuevo contenido a las páginas que se imprimen, cambiar todo el contenido que se va a imprimir o incluso reemplazar solo ciertas letras o palabras. Aprende cómo hacerlo aquí.

Divulgación de información

Acceso a la memoria

Es posible que pueda volcar la memoria NVRAM y extraer información confidencial (como contraseñas) de allí. Lee cómo hacerlo aquí.

Acceso al sistema de archivos

Es posible que pueda acceder al sistema de archivos abusando de PJL o PostScript. Lee cómo hacerlo aquí.

Divulgación de credenciales/fuerza bruta

Es posible que pueda revelar la contraseña que se está utilizando abusando de SNMP o de la configuración LDAP o podría intentar forzar PJL o PostScript. Lee cómo hacerlo aquí.

Ejecución de código

Desbordamientos de búfer

Ya se han encontrado varios desbordamientos de búfer en la entrada PJL y en el demonio LPD, y podría haber más. Lee esto para obtener más información.

Actualizaciones de firmware

Es posible que pueda hacer que la impresora actualice el controlador a uno malicioso especialmente diseñado por usted. Lee esto para obtener más información.

Paquetes de software

Los proveedores 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 función de escribir software personalizado que se ejecuta en impresoras estaba destinada 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 y aumentar el tiempo de espera del servidor podría llevar a un DoS. Aprende más sobre esto aquí.

Procesamiento de documentos

Puede 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 sin conexión. 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í.

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥