# Pentesting de Impresoras
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
- Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
- Consigue el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
- **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
- **Comparte tus trucos de hacking enviando PR al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de 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 el Pentesting de Impresoras** fue tomado **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 impresora:\\
![Encapsulación de los lenguajes de impresora](http://hacking-printers.net/wiki/images/thumb/1/1d/Protocols.png/500px-Protocols.png)
## 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_](https://en.wikipedia.org/wiki/NetWare\_Core\_Protocol) de Novell o [_AppleTalk_](https://en.wikipedia.org/wiki/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í**](../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 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](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 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](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 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'**](../9100-pjl.md) 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](https://en.wikipedia.org/wiki/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](./#factory-defaults) 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](https://en.wikipedia.org/wiki/Graphics\_Device\_Interface#GDI\_printers) solo aceptan secuencias de datos de mapa de bits simples como [ZJS](http://www.undocprint.org/formats/page\_description\_languages/zjstream) mientras que la representación real la realiza el controlador de impresora. Hay 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 han sido diseñados para plóteres. El soporte para la impresión directa de [PDF](https://en.wikipedia.org/wiki/Portable\_Document\_Format) y [XPS](https://en.wikipedia.org/wiki/Open\_XML\_Paper\_Specification) 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](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 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](http://hacking-printers.net/wiki/index.php/Denial\_of\_service) (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](http://hacking-printers.net/wiki/index.php/File\_system\_access) 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](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 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](http://hacking-printers.net/wiki/index.php/Document\_processing#Showpage\_redefinition), 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](https://en.wikipedia.org/wiki/Raster\_image\_processor).
### 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'**:
```
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](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 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í.**](cross-site-printing.md)
### 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í.**](../../windows-hardening/active-directory-methodology/printers-spooler-service-abuse.md)
## 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í.**](factory-defaults.md)
### **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í.**](accounting-bypass.md)
### **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í.**](scanner-and-fax.md)
## 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í.**](print-job-retention.md)
### **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í.**](print-job-manipulation.md)
## **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í.**](memory-access.md)
### **Acceso al sistema de archivos**
Es posible que pueda 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**
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í.**](credentials-disclosure-brute-force.md)
## **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.**](buffer-overflows.md)
### 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.**](firmware-updates.md)
### **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í.**](software-packages.md)
## **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í.**](transmission-channel.md)
### **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í.**](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)
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
- Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFT exclusivos**](https://opensea.io/collection/the-peass-family)
- Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
- **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
- **Comparte tus trucos de hacking enviando PR al repositorio [hacktricks](https://github.com/carlospolop/hacktricks) y [hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.