# **Introducción** Imprimir sin permiso puede ser un riesgo de seguridad o una violación de la política de la empresa. En entornos donde se cobra por los trabajos de impresión, un atacante interno tiene motivación para evitar el sistema de contabilidad. Además, poder "imprimir" es una condición previa para la mayoría de los ataques contra las impresoras de red. Hay dos enfoques principales cuando se trata de contabilidad de trabajos de impresión: **dejar que la impresora lo maneje directamente o usar un servidor de impresión en el medio**. El primer enfoque es específico del proveedor, generalmente implica algún tipo de "controlador de impresora" especial y no se discute más aquí. El otro enfoque implica un servidor de impresión separado, generalmente una implementación de software como [CUPS](https://en.wikipedia.org/wiki/CUPS) o [LPRng](https://en.wikipedia.org/wiki/LPRng), para manejar la contabilidad y es bastante común en empresas e instituciones. El servidor de impresión puede hablar LPD, IPP u otros protocolos de impresión y reenvía trabajos a la impresora real. **Es importante tener en cuenta que el acceso directo a la red de la impresora debe estar restringido**, de lo contrario, un atacante puede **burlar fácilmente el servidor de impresión** y sus mecanismos de contabilidad. Esto significa filtrar el acceso a puertos típicos y atípicos (LPD, IPP, crudo, HTTP, SMB, FTP, SNMP). Básicamente hay dos enfoques para evitar los sistemas de contabilidad de trabajos de impresión: **suplantar a otro usuario o manipular el contador** de páginas impresas. A continuación, se discuten ambas opciones para las instalaciones de LPRng (v3.8.B) y CUPS (v2.1.4), que son sistemas de impresión de código abierto populares utilizados en entornos académicos y corporativos. Se presenta una comparación de las características de seguridad de ambos sistemas a continuación. | Sistema de impresión | Protocolo | Cifrado | Autenticación | Contador de páginas | | --------------- | -------- | ---------- | -------------- | ------------ | | **LPRng** | LPD | SSL/TLS | Kerberos, PGP | hardware | | **CUPS** | IPP | SSL/TLS | Kerberos, HTTP | software | # Saltos de autenticación LPRng y CUPS ofrecen ambos cifrado de canal basado en SSL y esquemas de autenticación seguros como [Kerberos](https://en.wikipedia.org/wiki/Kerberos\_\(protocol\)), trabajos de impresión firmados con PGP o autenticación HTTP [básica](https://en.wikipedia.org/wiki/Basic\_access\_authentication)/[digest](https://en.wikipedia.org/wiki/Digest\_access\_authentication). Si están **configurados correctamente** y en caso de que el atacante no pueda acceder directamente a la impresora, **no podrá suplantar a otros usuarios**. Sin embargo, estas características de seguridad son **opcionales y raramente se aplican** en los servidores de impresión del mundo real. En su lugar, los **nombres de usuario dados como parámetros LPD (LPRng) o IPP (CUPS) se registran y contabilizan** - lo que puede establecerse en valores arbitrarios por el lado del cliente. Las razones de esto son una consideración simple de costo-beneficio en la mayoría de las instituciones: **Kerberos necesita una configuración especial** en cada cliente y la **autenticación HTTP** requiere que los usuarios ingresen una **contraseña** cada vez que quieran imprimir algo, mientras que los costos de algunas impresiones no contabilizadas son soportables. Puede **verificar la autenticación adecuada** intentando imprimir con un **nombre de usuario personalizado** como este: ``` lp -U nobody test.ps ``` # Manipulación del contador de páginas ## Contadores de páginas de hardware Para una contabilidad correcta, **se debe determinar el número de páginas impresas** por el sistema de impresión, lo cual no es una tarea trivial. Los autores de **LPRng** _suponen que la impresora tiene algún tipo de mecanismo de contador de páginas no volátil que es confiable e impermeable a los ciclos de encendido / apagado_. Tales **contadores de páginas de hardware** son compatibles con la mayoría de las impresoras y **se leen** mediante LPRng **usando PJL después** de cada trabajo de impresión. **HP** incluso ha documentado una función para **escribir** en la variable del **contador de páginas** configurando la impresora en modo de servicio. De esta manera, el **contador de páginas** de la _HP LaserJet 1200, HP LaserJet 4200N_ y _HP LaserJet 4250N_ **puede ser manipulado** dentro de un trabajo de impresión. Al final del documento a imprimir y separado por el [UEL](./#uel), el contador simplemente debe restablecerse a su valor original (por ejemplo, `2342`): ``` \x1b%-12345X@PJL JOB This page was printed for free \x1b%-12345X@PJL EOJ \x1b%-12345X@PJL JOB @PJL SET SERVICEMODE=HPBOISEID @PJL SET PAGES=2342 \x1b%-12345X@PJL EOJ ``` Un atacante podría establecer un número negativo de páginas impresas. Tenga en cuenta que restablecer el dispositivo a [valores de fábrica](factory-defaults.md) también **restablece el contador de páginas a cero en algunos** de los dispositivos probados.\ Reducir el contador de páginas también se puede utilizar para **vender una impresora por encima de su precio** ya que se puede comparar con el odómetro al comprar un coche de segunda mano. Sin embargo, vale la pena enfatizar que **restablecer el contador de páginas no es necesariamente para fines maliciosos**: es un modelo de negocio bien conocido vender tinta sobrevalorada para dispositivos de inyección de tinta de bajo costo y bloquear los kits de recarga de terceros al negarse a imprimir después de cierto número de páginas - para manejar tales prácticas poco éticas, es absolutamente legítimo restablecer el contador de páginas. En las impresoras HP antiguas, el comando `pagecount` de [PRET](https://github.com/RUB-NDS/PRET) se puede utilizar para establecer fácilmente los contadores de páginas de hardware: ``` ./pret.py -q printer pjl Connection to printer established Welcome to the pret shell. Type help or ? to list commands. printer:/> pagecount 10 Old pagecounter: 53214 New pagecounter: 10 ``` ## Contadores de páginas de software **CUPS** utiliza **contadores de páginas de software** que se han implementado para todos los principales lenguajes de descripción de páginas. Para PostScript, una forma sencilla de evitar la contabilización es comprobar si existe el parámetro del sistema PageCount, que devolverá falso al ser interpretado en CUPS/Ghostscript, antes de imprimir el documento, como se muestra a continuación. ``` currentsystemparams (PageCount) known { <@\textit{[...] code which is only executed on a printer device [...]}@> } if ``` De esta manera, el software de contabilidad utilizado por CUPS genera un documento diferente al de la impresora. **CUPS solo tiene en cuenta una página** - lo que parece ser un **mínimo codificado** - mientras que el trabajo de impresión **real** puede contener **cientos de páginas**. Tenga en cuenta que el uso de la cola/opción IPP "raw" es obligatorio, de lo contrario CUPS analiza el código con un filtro PostScript-to-PostScript (ps2write de Ghostscript) antes de que llegue al contador de páginas. **¿Cómo probar este ataque?** **Envuelva** un **documento PostScript de varias páginas arbitrario** en el **código anterior** e imprímalo. Luego vaya a [`http://printserver:631/jobs?which_jobs=all`](http://printserver:631/jobs?which\_jobs=all) y verifique el contador de páginas de CUPS para este trabajo de impresión. Tenga en cuenta que debe establecer una cola en bruto. Es decir, una cola donde el sistema de filtrado no está involucrado y el trabajo de impresión va directamente a una impresora. Para CUPS, esto se hace estableciendo el tipo de contenido en `application/vnd.cups-raw`. Si su sistema ya está configurado para usar el servidor de impresión que se va a probar, simplemente use: ``` lp -o raw test.ps ```
☁️ 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) - Obtén la [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com) - **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) **grupo de Discord** 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 PRs al repositorio [hacktricks](https://github.com/carlospolop/hacktricks) y al repositorio [hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.