# 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:
* Si quieres ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF**, consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs exclusivos**](https://opensea.io/collection/the-peass-family)
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de Telegram**](https://t.me/peass) o **sigue** a **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
* **Comparte tus trucos de hacking enviando PRs a los repositorios de GitHub** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
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/**](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](http://hacking-printers.net/wiki/images/thumb/1/1d/Protocols.png/500px-Protocols.png)
## 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_](https://en.wikipedia.org/wiki/NetWare\_Core\_Protocol) de Novell o [_AppleTalk_](https://en.wikipedia.org/wiki/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í**](../9100-pjl.md)**.**
### **Aprende más sobre** [**LPD en Pentesting 515 aquí**](../515-pentesting-line-printer-daemon-lpd.md)**.**
### **Aprende más sobre** [**IPP en Pentesting 631 aquí**](../pentesting-631-internet-printing-protocol-ipp.md)**.**
## 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](http://www.undocprint.org/formats/printer\_control\_languages/cpca), [XJCL](http://www.undocprint.org/formats/printer\_control\_languages/xjcl), [EJL](http://www.undocprint.org/formats/printer\_control\_languages/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](http://www.undocprint.org/formats/printer\_control\_languages/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'**](../9100-pjl.md) 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](https://en.wikipedia.org/wiki/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](https://en.wikipedia.org/wiki/Graphics_Device_Interface#GDI_printers) solo aceptan flujos de datos de mapa de bits simples como [ZJS](http://www.undocprint.org/formats/page_description_languages/zjstream) mientras que el renderizado real lo realiza el controlador de impresora. Existen varios lenguajes de descripción de página propietarios como [PRESCRIBE](http://www.undocprint.org/formats/page_description_languages/prescribe) de Kyocera, [SPL](http://www.undocprint.org/formats/page_description_languages/spl), [XES](http://www.undocprint.org/formats/page_description_languages/xes), [CaPSL](http://www.undocprint.org/formats/page_description_languages/capsl), [RPCS](http://www.undocprint.org/formats/page_description_languages/rpcs), [ESC/P](https://en.wikipedia.org/wiki/ESC/P) que se utiliza principalmente en impresoras de matriz de puntos o [HP-GL](https://en.wikipedia.org/wiki/HPGL) y [HP-GL/2](https://en.wikipedia.org/wiki/HPGL#HP-GL.2F2) que se han diseñado para plotters. También es común el soporte para impresión directa de [PDF](https://en.wikipedia.org/wiki/Portable_Document_Format) y [XPS](https://en.wikipedia.org/wiki/Open_XML_Paper_Specification) 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](https://en.wikipedia.org/wiki/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](http://hacking-printers.net/wiki/index.php/Denial\_of\_service) (por ejemplo, a través de bucles infinitos), [manipulación](http://hacking-printers.net/wiki/index.php/Print\_job\_manipulation) y [retención](http://hacking-printers.net/wiki/index.php/Print\_job\_retention) de trabajos de impresión, así como para obtener acceso al [sistema de archivos](http://hacking-printers.net/wiki/index.php/File\_system\_access) 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](http://hacking-printers.net/wiki/images/thumb/f/ff/Dictstack.png/300px-Dictstack.png)](http://hacking-printers.net/wiki/index.php/File:Dictstack.png)
\
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](http://hacking-printers.net/wiki/index.php/Document\_processing#Showpage\_redefinition), retención de trabajos de impresión y [manipulación](http://hacking-printers.net/wiki/index.php/Print\_job\_manipulation). 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](https://en.wikipedia.org/wiki/Raster\_image\_processor).
### 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’**:
```
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](https://en.wikipedia.org/wiki/USB) o [paralelos](https://en.wikipedia.org/wiki/IEEE_1284). 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í.**](cross-site-printing.md)
### 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í.**](../../windows-hardening/active-directory-methodology/printers-spooler-service-abuse.md)
## 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í.**](factory-defaults.md)
### **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í.**](accounting-bypass.md)
### **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í.**](scanner-and-fax.md)
## **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í.**](print-job-retention.md)
### **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í.**](print-job-manipulation.md)
## **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í.**](memory-access.md)
### **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í.**](file-system-access.md)
### **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í**](credentials-disclosure-brute-force.md)**.**
## **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.**](buffer-overflows.md)
### 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.**](firmware-updates.md)
### **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í.**](software-packages.md)
## **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í.**](transmission-channel.md)
### **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í.**](document-processing.md)
### **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í.**](physical-damage.md)
Aprende hacking en AWS de cero a héroe con htARTE (HackTricks AWS Red Team Expert)!
Otras formas de apoyar a HackTricks:
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** revisa los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
* **Comparte tus trucos de hacking enviando PRs a los repositorios de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) en github.