Ahora puedes imprimir, ahora no

Hace algunas semanas, tuve la oportunidad de cacharrear con varios modelos de impresoras tratando de entender un poco mejor su forma de trabajar. Como me pareció bastante divertida la investigación y saque algunos fallos, me ha parecido interesante compartirlo aquí.

A día de hoy, la mayor parte de las impresoras que podemos encontrar en el mercado hacen uso de la tecnología JetDirect. Diseñada por HP, facilita la tarea de adjuntar este tipo de dispositivos de forma directa a una red de área local, permitiendo de esta forma que sean visibles y accesibles por el resto de dispositivos y/o usuarios conectados a un mismo segmento de red.

Así, cuando queremos imprimir un fichero en concreto, únicamente tenemos que mandarlo a la cola de impresión y segundos más tarde recoger el resultado que ha sido imprimido. De esta forma, a un alto nivel de abstracción, el usuario únicamente ha de saber que dada una determinada entrada, obtendrá una salida esperada. Pero, ¿realmente cómo funciona todo este proceso?

Como comentaba anteriormente, a nivel interno, el protocolo JetDirect permite establecer una comunicación con este tipo de dispositivos, quedando a la espera de recibir el flujo de datos a tratar.

Junto con el contenido a imprimir, siguiendo el formato impuesto por una extensión de fichero, se añade información adicional que es parseada e interpretada por la impresora.

Para nuestro propósito, nos basta con conocer los siguientes términos:

  • UEL (Universal Exit Language) – Comando utilizado al principio y final de cada flujo de datos enviado a la impresora. La sintaxis que representa es <ESC>%-12345X, donde ESCape puede ser representado por 0x1B.
  • PJL (Printer Job Language) – Utilizado para indicar a la impresora qué acción realizar, desde cambiar la configuración desde el dispositivo, hasta realizar transferencias de ficheros. Sirve de soporte adicional para el PCL.
  • PCL (Printer Control Language) – Básicamente es un lenguaje utilizado para dar un determinado formateado a las páginas. Aunque parezca inofensivo de primeras, utilizado conscientemente puede ser aprovechado para explotar vulnerabilidad en la mayoría de parsers e intérpretes.

Como siempre, para una información más detallada y precisa, es aconsejable leer las especificaciones aportadas por cada lenguaje:

Para comprender un poco por dónde va el tema, en la siguiente imagen podréis ver el aspecto que presenta un trabajo para imprimir:

El objetivo, como supondréis está en fuzzear las etiquetas que serán parseadas e interpretadas por los intérpretes de PCL/PJL respectivamente, desencadenando en denegaciones de servicio persistentes que afectan a un gran porcentaje de modelos y manufacturadores.

¿Por qué atacar una impresora?

Bajo mi punto de opinión, ¿cuántas personas conocéis que esperan que alguien explote/infecte una vulnerabilidad en su impresora? ¿cuántos clientes auditan las impresoras que tienen conectadas a su red corporativa?

Si tenemos en cuenta que son objetivos que pasan desapercibidos y nos paramos detenidamente a inspeccionar como interactúan estas con el usuario, nos encontramos con acceso por huellas dactilares, PINs, contraseñas por LDAP, smartcards y un largo etcétera, ¿No es algo que capte nuestra atención fácilmente?

Por otro lado, todos esos documentos que una empresa puede tener en sus equipos fuertemente cifrados utilizando una clave de longitud considerable, quedan automáticamente desprotegidos al mandarse a la cola de impresión y quedar reflejados y almacenados en el historial. ¿Qué sucedería si tuviésemos control o acceso directo a ese historial? O peor aún, ¿De qué servirían esas claves de cifrados si las impresoras tienen una memoria interna y podemos re-imprimir trabajos anteriores?

También podríamos modificar el motor encargado de generar PDFs para que incluyese algún 0day, utilizar las capacidades de enviar emails que traen integradas para montar una red de spam, o utilizar la capacidad de cómputo y el desuso de estas para tareas de procesado.

Si a todo esto le sumamos la larga lista de manufacturadoresCanon, Fujitsu, HP, Konica Minolta, Lexmark, Xerox, Sharp, Kyocera Mita, Kodak, Brother, Samsung, Toshiba, Ricoh, Lanier, Nashuatec, Infotek, OCE, OKI… y observamos las ventas que han tenido a lo largo de los años, tan sólo es cuestión de hacer cuentas para apreciar la gran magnitud del asunto:

Comic Sans FTW

Disclaimer: No me hago responsable del uso que se le pueda proporcionar a esta información, así mismo, tampoco nombraré marcas ni modelos específicos. Los resultados devueltos por los fallos pueden variar según el manufacturador o el modelo, así como de la versión del firmware instalada.

Vulnerabilidad I – Bypasseando procesos de autenticación

Como comentaba anteriormente, los nuevos modelos de impresoras incorporan mecanismos de autenticación para controlar los usuarios que tienen acceso a las mismas.

De esta forma controlamos varios puntos; El número de copias realizadas por cada uno de ellos, evitando que se realizan más de las indebidas o innecesarias (a todos nos gusta imprimir gratis). La cantidad total a facturar por copia impresa. Qué documentos han sido imprimidos, y un largo etcétera.

Cada vez que un empleado desea mandar a imprimir un trabajo deberá desbloquear el dispositivo, o introducir sus credenciales de dominio correspondientes.

Todo este proceso, es posible saltárselo a la torera realizando una conexión directa al puerto o mandando el contenido a imprimir:

El resultado obtenido:

Si analizamos el documento enviado a imprimir, observaremos dos etiquetas bastante curiosas:

@PJL SET JOBNAME = "C:\Documents and Settings\divine\My Documents\TU\tdoc\cad files\kapak.dwg Model (1)"
@PJL SET USERNAME = "AAA"

Vulnerabilidad II – Asignando trabajos a usuarios del sistema

Aprovechándonos de la vulnerabilidad anterior, vamos a modificar el valor de las dos etiquetas anteriormente descritas para asignarles al director algún que otro trabajo impreso.

De esta forma, además de poder imprimir saltándonos las restricciones, es posible asignarle las copias a cualquier otro usuario, incrementándose con ello el contador.

Vulnerabilidad III – Generando denegaciones de servicio

Tal y como mostraba en una de las imágenes anteriores, a los archivos mandados a imprimir se le incluye información adicional que determina su estilo, formateado y las acciones que la impresora ha de realizar entre otras cosas.

Esos valores, son parseados e interpretados por la impresora, de forma que si le introducimos un valor no esperado o deseado, en base a como esté implementado puede tener un comportamiento anómalo, dejando de ser funcional.

En nuestro caso, vamos a centrarnos en las etiquetas PCL, y para ello vamos a utilizar la siguiente porción de formateado:

Como referencia podemos utilizar: Printer Commands PCL, además de este fichero de macros

^[&l7H^[&l-1M^[*o5W^M^C^@^GÏ^[*o-2M^[*o5W^M^B^@^@^A^[*o5W^K^A^@^@^@^[*o5W^N^C^@^@^E^[*o5W^N^U^@^@^@^[&l110A^[&u600D^[*o5W^N^E^@^S`^[*o5W^N^F^@^[g^[*r4724S^[*g12W^F^_^@^A^BX^BX

Donde podemos extraer qué:

  • g#W – “Configure Raster Data Command“, seguido de un número determinado de bytes de configuración (# – En este caso 5), establece parámetros como la profundidad del color, resolución vertical y horizontal, etc.
  • o#W – “Configure Driver Comman“, igualmente, va seguido de un número determinado de bytes de configuración (# – En este caso 12), se utiliza para ejecutar instrucciones específicas de cada impresora, que pueden ser encontradas en la hoja de configuración de las especificaciones de cada impresora.
  • &l7H – Determina la fuente de donde se obtendrá el papel, en este caso está establecida a automática.
  • &l-1M – Media Type Bond
  • &l110A – Corresponde a la macro PCL_JENV_CHOU3que define la altura del papel.
  • &u600D – Al igual que el precedesor, indica el número de unidades PCL por pulgada.

Llegados a este punto, si modificamos cualquiera de dichos parámetros insertando un caracter no esperado, según como esté implementado el parser e intérprete para el modelo en concreto, obtenemos diversas denegaciones de servicio, tumbando las impresoras y forzándolas a ser reiniciadas manualmente:

Vulnerabilidad IV – ‘OLA KOMO TA YAMA?’

Una de las peculiaridades que presentan estos nuevos modelos, es la inclusión de una pantalla “TouchSmart” por la cual, puedas interactuar directamente con algunas opciones de configuración de la impresora, o en otros casos (como el que nos ciñe ahora) obtener y mostrar información de configuración de la misma.

Entre toda la información disponible para modificar, está la de nombrar al servicio FTP donde se subirán los trabajos escaneados para aquellas impresoras multifunciones:

Si bien el número de caracteres introducido está limitado y controlado por JS, una vez que tenemos la petición interceptada, basta con reenviarla e introducir por ejemplo:

perl -e 'print "A"x1000'
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

El resultado obtenido es el siguiente:

En este caso, la impresora fue brickeada y se le tuvo que hacer un hard reset instalándole por USB el firmware que tenía en funcionamiento.

2 pensamientos en “Ahora puedes imprimir, ahora no

  1. Pingback: Exploiting printers via Jetdirect vulnerabilities – viaForensics

  2. Pingback: Тысячи уязвимых принтеров можно найти через Google | Around Cyber

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *

Puedes usar las siguientes etiquetas y atributos HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" cssfile="">