hacktricks/network-services-pentesting/pentesting-printers/print-job-retention.md
carlospolop 63bd9641c0 f
2023-06-05 20:33:24 +02:00

10 KiB

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

Retención de trabajos

Algunas impresoras tienen trabajos de impresión almacenados accesibles desde el servidor web. Sin embargo, por lo general, la retención de trabajos debe activarse explícitamente para un determinado trabajo de impresión y se puede hacer mediante comandos PJL estándar o código PostScript propietario. Los trabajos se mantienen en memoria y se pueden reimprimir desde el panel de control.

PJL

La retención legítima de trabajos se puede habilitar para el documento actual estableciendo la variable PJL HOLD como se muestra a continuación:

@PJL SET HOLD=ON
[actual data to be printed follows]

Los trabajos retenidos se mantienen en memoria y pueden ser reimpresos desde el panel de control de la impresora. Esta característica es compatible con varias impresoras, sin embargo, parece que solo algunos dispositivos Epson permiten establecer la retención permanente de trabajos mediante @PJL DEFAULT HOLD=ON.

¿Cómo probar este ataque?

Utilice el comando hold de PRET en modo pjl y verifique si se puede establecer la retención permanente de trabajos:

./pret.py -q printer pjl
Connection to printer established

Welcome to the pret shell. Type help or ? to list commands.
printer:/> hold
Setting job retention, reconnecting to see if still enabled
Retention for future print jobs: OFF

PostScript

PostScript ofrece funcionalidades similares, pero específicas del modelo y del proveedor. Para las series HP LaserJet 4k y varias impresoras Kyocera, se puede habilitar la retención de trabajos mediante la adición de los siguientes comandos al documento PostScript:

<< /Collate true /CollateDetails
<< /Hold 1 /Type 8 >> >> setpagedevice

Aunque teóricamente es posible habilitar permanentemente la retención de trabajos PostScript utilizando el operador startjob, esta configuración se restablece explícitamente por CUPS al comienzo de cada trabajo de impresión utilizando << /Collate false >> setpagedevice. Para contrarrestar este mecanismo de protección, el atacante puede redefinir permanentemente el operador setpagedevice para que no tenga ningún efecto.

¿Cómo probar este ataque?

Usa el comando hold de PRET en modo ps:

./pret.py -q printer ps
Connection to printer established

Welcome to the pret shell. Type help or ? to list commands.
printer:/> hold
Job retention enabled.

Captura de trabajos

Es posible, aunque poco común, activar la retención de trabajos en el diálogo de impresión como se discutió anteriormente. Sin embargo, con PostScript se tiene acceso completo sobre el trabajo de impresión actual y con el operador startjob, incluso es posible salir del ciclo del servidor y acceder a trabajos futuros. Tal funcionalidad tiene el potencial de capturar todos los documentos si se utiliza PostScript como controlador de impresora.

PostScript

Con la capacidad de conectarse a operadores arbitrarios de PostScript, es posible manipular y acceder a trabajos de impresión ajenos. Para analizar la secuencia de datos real enviada a la impresora, se puede aplicar una característica bastante interesante del lenguaje PostScript: leer su propio código de programa como datos utilizando el operador currentfile. De esta manera, toda la secuencia de datos que debe ser procesada por el intérprete de PostScript se puede acceder mediante la lectura y almacenamiento en un archivo en el dispositivo de la impresora. Si la impresora no ofrece acceso al sistema de archivos, los documentos capturados se pueden almacenar en la memoria, por ejemplo, dentro de diccionarios permanentes de PostScript.
Un problema práctico es decidir qué operador debe ser conectado ya que no se tiene acceso a la secuencia de datos hasta que este operador es procesado por el intérprete de PostScript. Como un atacante quiere capturar trabajos de impresión desde el principio, el operador redefinido debe ser el primer operador contenido en el documento de PostScript. Afortunadamente, todos los documentos impresos con CUPS se comprimen en una estructura fija que comienza con currentfile /ASCII85Decode filter /LZWDecode filter cvx exec. Basándose en la suposición de tal estructura fija, el atacante puede capturar documentos desde el principio y ejecutar (es decir, imprimir) el archivo posteriormente. Para sistemas de impresión diferentes a CUPS, este ataque también debería ser posible, pero los operadores deben ser adaptados. Tenga en cuenta que el encabezado de PostScript que generalmente incluye el tamaño del medio, el usuario y los nombres de trabajo no se pueden capturar utilizando este método porque primero se conecta al comienzo del documento real. Otra estrategia genérica para conectarse al comienzo de cada trabajo de impresión es establecer el parámetro del sistema BeginPage, si es compatible con la impresora (la mayoría de las impresoras lo hacen). Esta vulnerabilidad probablemente ha estado presente en dispositivos de impresión durante décadas, ya que se abusan únicamente de las construcciones de lenguaje definidas por el estándar PostScript.

Use el comando capture de PRET en modo ps:

./pret.py -q printer ps
Connection to printer established

Welcome to the pret shell. Type help or ? to list commands.

printer:/> capture 
Print job operations:  capture <operation>
  capture start   - Record future print jobs.
  capture stop    - End capturing print jobs.
  capture list    - Show captured print jobs.
  capture fetch   - Save captured print jobs.
  capture print   - Reprint saved print jobs.
printer:/> capture start
Future print jobs will be captured in memory!
printer:/> exit

Ahora, imprima documentos arbitrarios (asegúrese de que PRET esté desconectado para no bloquear el canal de impresión). Después, puede listar, recuperar o reimprimir los documentos capturados:

./pret.py -q printer ps
Connection to printer established

Welcome to the pret shell. Type help or ? to list commands.
printer:/> capture list
Free virtual memory: 16.6M | Limit to capture:  5.0M
date          size  user           jobname                 creator             
───────────────────────────────────────────────────────────────────────────────
Jan 25 18:38  3.1M  -              -                       -                   
Jan 25 18:40  170K  -              -                       -                   
printer:/> capture fetch
Receiving capture/printer/690782792
3239748 bytes received. 
Receiving capture/printer/690646210
174037 bytes received.
printer:/> capture print
printing...
printing...
2 jobs reprinted
printer:/> capture stop
Stopping job capture, deleting recorded jobs
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥