
Printer Exploitation Toolkit - La herramienta que hizo obsoleta la búsqueda en contenedores de basura.
¿Tu impresora es segura? Verifícalo antes de que alguien más lo haga...
PRET es una nueva herramienta para pruebas de seguridad de impresoras desarrollada en el marco de una Tesis de Maestría en la Universidad del Ruhr en Bochum. Se conecta a un dispositivo a través de red o USB y explota las características de un lenguaje de impresión dado. Actualmente se admiten PostScript, PJL y PCL, los cuales son utilizados por la mayoría de las impresoras láser. Esto permite cosas geniales como capturar o manipular trabajos de impresión, acceder al sistema de archivos y memoria de la impresora, o incluso causar daños físicos al dispositivo. Todos los ataques están documentados en detalle en el Wiki de Hacking Printers.
La idea principal de PRET es facilitar la comunicación entre el usuario final y la impresora. De este modo, después de ingresar un comando similar a UNIX, PRET lo traduce a PostScript, PJL o PCL, lo envía a la impresora, evalúa el resultado y lo traduce de vuelta a un formato amigable. PRET ofrece una gran cantidad de comandos útiles para ataques a impresoras y fuzzing.

PRET solo requiere un intérprete de Python2. Sin embargo, para salida coloreada y soporte SNMP, se deben instalar módulos de terceros:
# pip install colorama pysnmp
Si se ejecuta en una consola de Windows y los caracteres Unicode no se muestran correctamente, instala el módulo win_unicode_console:
# pip install win_unicode_console
Para la impresión experimental 'sin controlador' (ver comando print), es necesario instalar ImageMagick y GhostScript:
# apt-get install imagemagick ghostscript
usage: pret.py [-h] [-s] [-q] [-d] [-i file] [-o file] target {ps,pjl,pcl}
positional arguments:
target printer device or hostname
{ps,pjl,pcl} printing language to abuse
optional arguments:
-h, --help show this help message and exit
-s, --safe verify if language is supported
-q, --quiet suppress warnings and chit-chat
-d, --debug enter debug mode (show traffic)
-i file, --load file load and run commands from file
-o file, --log file log raw data sent to the target
$ ./pret.py laserjet.lan ps
$ ./pret.py /dev/usb/lp0 pjl
PRET requiere un objetivo válido y un lenguaje de impresión como argumentos. El objetivo puede ser la dirección IP/nombre de host de una impresora de red (con el puerto 9100/tcp abierto) o un dispositivo como /dev/usb/lp0 para una impresora USB local. Para descubrir rápidamente todas las impresoras de red en tu subred usando difusión SNMP, simplemente ejecuta PRET sin argumentos:
./pret.py
No target given, discovering local printers
address device uptime status
───────────────────────────────────────────────────────────────────────────────
192.168.1.5 hp LaserJet 4250 10:21:49 Ready
192.168.1.11 HP LaserJet M3027 MFP 13 days Paper jam
192.168.1.27 Lexmark X792 153 days Ready
192.168.1.28 Brother MFC-7860DW 16:31:17 Sleep mode
El lenguaje de impresión a explotar debe ser uno de ps, pjl o pcl. No todos los lenguajes son compatibles con todas las impresoras, por lo que puede que quieras cambiar de idioma si no recibes ninguna respuesta. Cada lenguaje de impresión está mapeado a un conjunto diferente de comandos de PRET y tiene diferentes capacidades para explotar.
--safe intenta verificar a través de IPP, HTTP y SNMP si el lenguaje de impresión seleccionado (PS/PJL/PCL) es realmente compatible con el dispositivo antes de conectar. En impresoras no conectadas a la red (USB, cable paralelo) esta prueba fallará.
--quit suprime la determinación del modelo de impresora, el mensaje de introducción y otras charlas.
--debug muestra el flujo de datos realmente enviado al dispositivo y la retroalimentación recibida. Ten en cuenta que los datos de cabecera y otros gastos generales se filtran. Para ver todo el tráfico, usa wireshark. La depuración también se puede activar/desactivar dentro de una sesión de PRET usando el comando debug.
--load archivo lee y ejecuta comandos de PRET desde un archivo de texto. Esto es útil para automatización. Los archivos de comandos también se pueden invocar más tarde dentro de una sesión de PRET mediante el comando load.
--log archivo escribe una copia del flujo de datos sin procesar enviado a la impresora en un archivo. Esto puede ser útil para construir un archivo de trabajo de impresión malicioso que se pueda implementar en otra impresora no directamente accesible, por ejemplo imprimiéndolo desde una unidad USB.
Después de conectarse a un dispositivo de impresora, verás el shell de PRET y podrás ejecutar varios comandos:
$ ./pret.py laserjet.lan pjl
________________
_/_______________/|
/___________/___//|| PRET | Printer Exploitation Toolkit v0.25
|=== |----| || by Jens Mueller <[email protected]>
| | ô| ||
|___________| ô| ||
| ||/.´---.|| | || 「 cause your device can be
|-||/_____\||-. | |´ more fun than paper jams 」
|_||=L==H==||_|__|/
(ASCII art by
Jan Foerster)
Connection to laserjet.lan established
Device: hp LaserJet 4250
Welcome to the pret shell. Type help or ? to list commands.
laserjet.lan:/> help
Available commands (type help <topic>):
=======================================
append debug edit free id ls open restart timeout
cat delete env fuzz info mirror printenv selftest touch
cd df exit get load mkdir put set traversal
chvol disable find help lock nvram pwd site unlock
close display format hold loop offline reset status version
laserjet.lan:/> ls ../../
- 834 .profile
d - bin
d - dev
d - etc
d - hp
d - hpmnt
- 1276 init
d - lib
d - pipe
d - tmp
laserjet.lan:/> exit
A continuación se muestra una lista de comandos genéricos de PRET:
help List available commands or get detailed help with 'help cmd'.
debug Enter debug mode. Use 'hex' for hexdump: debug [hex]
load Run commands from file: load cmd.txt
loop Run command for multiple arguments: loop <cmd> <arg1> <arg2> …
open Connect to remote device: open <target>
close Disconnect from device.
timeout Set connection timeout: timeout <seconds>
discover Discover local printer devices via SNMP.
print Print image file or raw text: print <file>|"text"
site Execute custom command on printer: site <command>
exit Exit the interpreter.
Las operaciones genéricas del sistema de archivos con una implementación específica de PS/PJL/PCL son:
┌───────────┬─────┬─────┬─────┬────────────────────────────────────────┐
│ Command │ PS │ PJL │ PCL │ Description │
├───────────┼─────┼─────┼─────┼────────────────────────────────────────┤
│ ls │ ✓ │ ✓ │ ✓ │ Lista el contenido del directorio remoto. │
│ get │ ✓ │ ✓ │ ✓ │ Recibe archivo: get <archivo> │
│ put │ ✓ │ ✓ │ ✓ │ Envía archivo: put <archivo_local> │
│ append │ ✓ │ ✓ │ │ Añade al archivo: append <archivo> <cadena> │
│ delete │ ✓ │ ✓ │ ✓ │ Elimina archivo remoto: delete <archivo> │
│ rename │ ✓ │ │ │ Renombra archivo remoto: rename <antiguo> <nuevo> │
│ find │ ✓ │ ✓ │ │ Lista recursivamente el contenido del directorio. │
│ mirror │ ✓ │ ✓ │ │ Refleja el sistema de archivos remoto al directorio local. │
│ cat │ ✓ │ ✓ │ ✓ │ Envía archivo remoto a stdout. │
│ edit │ ✓ │ ✓ │ ✓ │ Edita archivos remotos con vim. │
│ touch │ ✓ │ ✓ │ │ Actualiza marcas de tiempo: touch <archivo> │
│ mkdir │ ✓ │ ✓ │ │ Crea directorio remoto: mkdir <ruta> │
├───────────┼─────┼─────┼─────┼────────────────────────────────────────┤
│ cd │ ✓ │ ✓ │ │ Cambia el directorio de trabajo remoto. │
│ pwd │ ✓ │ ✓ │ │ Muestra el directorio de trabajo en el dispositivo. │
│ chvol │ ✓ │ ✓ │ │ Cambia volumen remoto: chvol <volumen> │
│ traversal │ ✓ │ ✓ │ │ Establece path traversal: traversal <ruta> │
├───────────┼─────┼─────┼─────┼────────────────────────────────────────┤
│ format │ ✓ │ ✓ │ │ Inicializa el sistema de archivos de la impresora. │
│ fuzz │ ✓ │ ✓ │ │ Fuzzing del sistema de archivos: fuzz <categoría> │
├─ ─ ─ ─ ─ ─┴─ ─ ─┴─ ─ ─┴─ ─ ─┴─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┤
│ path - Explora la estructura del FS con estrategias de path traversal. │
│ write - Primero coloca/añade archivo, luego verifica su existencia. │
│ blind - Pruebas de solo lectura para archivos existentes como /etc/passwd. │
├───────────┬─────┬─────┬─────┬────────────────────────────────────────┤
│ df │ ✓ │ ✓ │ │ Muestra información del volumen. │
│ free │ ✓ │ ✓ │ ✓ │ Muestra memoria disponible. │
└───────────┴─────┴─────┴─────┴────────────────────────────────────────┘
id Muestra información del dispositivo.
version Muestra la versión del intérprete PostScript.
devices Muestra los dispositivos de E/S disponibles.
uptime Muestra el tiempo de actividad del sistema (puede ser aleatorio).
date Muestra la fecha y hora del sistema de la impresora.
pagecount Muestra el contador de páginas de la impresora.
lock Establece la contraseña de startjob y parámetros del sistema.
unlock Desactiva la contraseña de startjob y parámetros del sistema.
restart Reinicia el intérprete PostScript.
reset Restablece la configuración PostScript a los valores de fábrica.
disable Desactiva la funcionalidad de impresión.
destroy Causa daño físico a la NVRAM de la impresora.
hang Ejecuta un bucle infinito PostScript.
overlay Coloca un archivo EPS superpuesto en todas las copias impresas: overlay <archivo.eps>
cross Coloca graffiti de impresora en todas las copias impresas: cross <fuente> <texto>
replace Reemplaza cadena en documentos a imprimir: replace <antiguo> <nuevo>
capture Captura trabajos adicionales a imprimir en este dispositivo.
hold Habilita la retención de trabajos.
set Establece clave en el diccionario superior: set <clave=valor>
known Lista los operadores PostScript compatibles: known <operador>
search Busca en todos los diccionarios por clave: search <clave>
dicts Devuelve una lista de diccionarios y sus permisos.
resource Lista o vuelca recurso PostScript: resource <categoría> [dump]
dump Vuelca diccionario: dump <diccionario>
Diccionarios: - systemdict - statusdict - userdict
- globaldict - serverdict - errordict
- internaldict - currentsystemparams
- currentuserparams - currentpagedevice
config Cambia la configuración de la impresora: config <configuración>
duplex - Establece impresión a doble cara.
copies # - Establece número de copias.
economode - Establece modo económico.
negative - Establece impresión negativa.
mirror - Establece inversión de espejo.
No todos los comandos son compatibles con todas las impresoras. Especialmente los dispositivos Brother y Kyocera utilizan sus propios clones de PostScript – Br-Script y KPDL – en lugar de licenciar el 'Adobe PostScript' original. Tales variedades del lenguaje PostScript pueden no ser 100% compatibles, especialmente en lo que respecta a funciones sensibles a la seguridad como la captura de trabajos de impresión. El acceso al sistema de archivos es compatible con la mayoría de las impresoras, aunque generalmente limitado a un directorio específico y aislado.
id Muestra información del dispositivo.
status Habilita mensajes de estado.
version Muestra la versión del firmware o número de serie (de 'info config').
pagecount Manipula el contador de páginas de la impresora: pagecount <número>
printenv Muestra variable de entorno de la impresora: printenv <VAR>
env Muestra variables de entorno (alias de 'info variables').
set Establece variable de entorno de la impresora: set <VAR=VALOR>
display Establece mensaje en pantalla de la impresora: display <mensaje>
offline Desconecta la impresora y muestra mensaje: offline <mensaje>
restart Reinicia la impresora.
reset Restablece valores de fábrica.
selftest Realiza varias autopruebas de la impresora.
disable Desactiva la funcionalidad de impresión.
destroy Causa daño físico a la NVRAM de la impresora.
flood Inunda la entrada del usuario, puede revelar desbordamientos de búfer.
lock Bloquea la configuración del panel de control y el acceso de escritura al disco.
unlock Desbloquea la configuración del panel de control y el acceso de escritura al disco.
hold Habilita la retención de trabajos.
nvram Operaciones NVRAM: nvram <operación>
nvram dump [all] - Vuelca (toda) la NVRAM a un archivo local.
nvram read addr - Lee un solo byte de una dirección.
nvram write addr value - Escribe un solo byte en una dirección.
info Muestra información: info <categoría>
info config - Proporciona información de configuración.
info filesys - Devuelve información del sistema de archivos PJL.
info id - Proporciona el número de modelo de la impresora.
info memory - Identifica la cantidad de memoria disponible.
info pagecount - Devuelve el número de páginas impresas.
info status - Proporciona el estado actual de la impresora.
info ustatus - Lista las variables de estado no solicitadas.
info variables - Lista las variables de entorno de la impresora.
Algunos comandos son compatibles exclusivamente con impresoras HP, porque otros fabricantes solo han implementado un subconjunto del estándar PJL. Esto es especialmente cierto para comandos basados en PML como restart o reset. Habilitar la retención de trabajos a largo plazo mediante el comando hold parece ser posible solo en algunos dispositivos Epson. El acceso a la NVRAM a través del comando nvram es una característica propietaria de las impresoras Brother. El acceso limitado al sistema de archivos es compatible con varios dispositivos HP, OKI, Konica, Xerox, Epson y Ricoh.
selftest Realiza autoprueba de la impresora.
info Muestra información: info <categoría>
info fonts - Muestra fuentes instaladas.
info macros - Muestra macros instaladas.
info patterns - Muestra patrones definidos por el usuario.
info symbols - Muestra conjuntos de símbolos.
info extended - Muestra fuentes extendidas.
PCL es un lenguaje de descripción de página muy limitado sin acceso al sistema de archivos. Por lo tanto, los comandos get/put/ls utilizan un sistema de archivos virtual basado en macros PCL, implementado principalmente por el valor de 'hack'. Esta prueba de concepto muestra que incluso un dispositivo que solo admite lenguajes minimalistas como PCL puede usarse para almacenar archivos arbitrarios, como material que infringe derechos de autor. Aunque dicho servicio de intercambio de archivos no es una vulnerabilidad de seguridad per se, podría considerarse como 'mal uso del servicio' según la política corporativa.
pret.py - Programa principal ejecutablecapabilities.py - Rutinas para verificar compatibilidad con lenguaje de impresióndiscovery.py - Rutinas para listar impresoras usando difusión SNMPprinter.py - Código genérico para describir un dispositivo de impresiónpostscript.py - Código específico de PS (hereda de la clase printer)pjl.py - Código específico de PJL (hereda de la clase printer)pcl.py - Código específico de PCL (hereda de la clase printer)helper.py - Funciones auxiliares para salida, registro, sockets, etc.codebook.py - Tabla estática de códigos de estado/error PJLfuzzer.py - Constantes para fuzzing del sistema de archivosmibs/* - MIBs SNMP específicos de impresoradb/* - base de datos de modelos compatiblesDadas las características y varias extensiones propietarias en lenguajes de impresión como PostScript y PJL, realizar un pentest en impresoras no es un trabajo trivial. PRET puede ayudar a asistir y verificar problemas conocidos en el lenguaje. Una vez que hayas jugado con la herramienta, es posible que desees realizar un análisis de seguridad sistemático de impresoras. Un buen punto de partida es el Cheat Sheet de Pruebas de Seguridad de Impresoras.
¡Feliz Hacking!
lpd/* - Scripts para fuzzing LPD