hacktricks/network-services-pentesting/pentesting-printers/accounting-bypass.md

10 KiB
Raw Blame History

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

Otras formas de apoyar a HackTricks:

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 eludir el sistema de contabilidad. Además, poder 'imprimir' es una condición previa para la mayoría de los ataques contra impresoras de red.

Hay dos enfoques principales cuando se trata de la contabilidad de trabajos de impresión: dejar que la impresora lo maneje directamente o usar un servidor de impresión intermedio. 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 o LPRng, para manejar la contabilidad y es bastante común en empresas e instituciones. El servidor de impresión puede utilizar LPD, IPP u otros protocolos de impresión y reenvía los trabajos a la impresora real. Es importante notar que el acceso directo a la red de la impresora debe estar restringido, de lo contrario, un atacante puede eludir 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, raw, HTTP, SMB, FTP, SNMP).

Hay básicamente dos enfoques para eludir 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 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. A continuación, se presenta una comparación de las características de seguridad de ambos sistemas.

Sistema de impresión Protocolo Encriptación Autenticación Contador de páginas
LPRng LPD SSL/TLS Kerberos, PGP hardware
CUPS IPP SSL/TLS Kerberos, HTTP software

Elusiones de autenticación

LPRng y CUPS ofrecen encriptación de canal basada en SSL y esquemas de autenticación seguros como Kerberos, trabajos de impresión firmados con PGP o autenticación HTTP básica/digest. Si se configuran 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 reales. En cambio, los nombres de usuario dados como parámetros LPD (LPRng) o IPP (CUPS) se registran y se contabilizan los cuales pueden ser establecidos con valores arbitrarios por el lado del cliente. La razón de esto es una simple consideración 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 quieren imprimir algo, mientras que el costo de algunas impresiones no contabilizadas es soportable.

Puedes verificar la autenticación adecuada intentando imprimir con un nombre de usuario personalizado de la siguiente manera:

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 hacen la suposición de que la impresora tiene algún tipo de mecanismo de contador de páginas no volátil que es confiable e inmune a ciclos de encendido/apagado. Tales contadores de páginas de hardware son soportados por la mayoría de las impresoras y leídos por LPRng usando PJL después de cada trabajo de impresión. HP incluso ha documentado una característica para escribir en la variable del contador de páginas al poner 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, el contador simplemente tiene que ser restablecido 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 los valores de fábrica también restablece el contador de páginas a cero en algunos de los dispositivos probados.
Reducir el contador de páginas también puede usarse 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, es importante enfatizar que restablecer el contador de páginas no es necesariamente con fines maliciosos: Es un modelo de negocio bien conocido vender tinta sobrevalorada para dispositivos de inyección de tinta de bajo costo y bloquear kits de recarga de terceros al negarse a imprimir después de un cierto número de páginas para manejar tales prácticas poco éticas es absolutamente legítimo restablecer el contador de páginas.

En impresoras láser HP antiguas, el comando pagecount de PRET puede usarse para establecer fácilmente 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 han sido implementados para todos los principales lenguajes de descripción de páginas. Para PostScript, una forma fácil de evadir la contabilidad es verificar si el parámetro del sistema PageCount existe lo cual retornará falso cuando se interprete en CUPS/Ghostscript antes de imprimir realmente 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 contabiliza una página 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 es obligatorio utilizar la cola/opción 'raw' de IPP, de lo contrario, CUPS analiza el código con un filtro de PostScript a PostScript (ps2write de Ghostscript) antes de que alcance el contador de páginas.

¿Cómo probar este ataque?

Envuelva un documento PostScript de varias páginas arbitrario en el código anterior e imprima. Luego vaya a 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 tiene que establecer una cola raw. Es decir, una cola donde el sistema de filtrado no interviene y el trabajo de impresión va directamente a una impresora. Para CUPS, esto se hace configurando el tipo de contenido a application/vnd.cups-raw. Si su sistema ya está configurado para usar el servidor de impresión a ser probado, simplemente use:

lp -o raw test.ps
Aprende hacking en AWS de cero a héroe con htARTE (HackTricks AWS Red Team Expert)!

Otras formas de apoyar a HackTricks: