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.

Explotando Adobe Cooltype Sing

Hace unos días apareció una nueva vulnerabilidad en los productos Adobe, en especial para el lector PDF Adobe Reader, en este caso aprovechando una vulnerabilidad en el campo “uniqueName” situado dentro de la estructura de la tabla de fuentes True Type, permitiendo al atacante producir un desbordamiento de pila y ejecutar código arbitrario.

En Metasploit no han tardado mucho en desarrollar un exploit e integrarlo para que podamos hacer las pruebas: adobe_cooltype_sing.rb

Para poder explotarla:

Los parámetros a configurar son el nombre del PDF que se genera y el path donde se almacenará, también podemos configurar el objetivo sobre el cuál queremos lanzarlo.

Cargamos el payload a lanzar

Y por último ejecutamos el exploit y lanzamos el handler a la espera de que el objetivo ejecute el PDF y nos devuelva la sesión

El único problema es que en determinadas plataformas y versiones de Adobe Reader este se queda colgado y no ejecuta el PDF.

Si os dais una vuelta por el SVN del exploit podréis observar los nuevos commits que se van añadiendo y las versiones que se van soportando.

Desensamblar una Shellcode

Leyendo esta entrada publicada por los de Securiteam me ha hecho recordar la cantidad de cabroncetes que hay sueltos por ahí y la manía que tienen por incluir instrucciones como rm -rf ~ /* 2> /dev/null & en la shellcode utilizada para explotar una vulnerabilidad y de paso inutilizarte el equipo.

En el caso que comenta xyberpix, al ejecutar el exploit, junto a este se lanzaba de paso un borrado contra el directorio home del usuario para pasar luego al directorio raíz, y mandar cualquier error de la salida al directorio /dev/null, de forma que el proceso fuese transparente al usuario.

Todo esto me hace recordar que nunca es bueno fiarse de los exploits que encontramos por la red, y que siempre viene bien saber qué hace exactamente la shellcode que queremos lanzar, así que como más vale prevenir que curar, he hecho un pequeño script en perl para que desensamble una shellcode y nos muestre los opcodes y se puedan leer con un poco más de facilidad.

En un nuevo fichero escribimos:


#!/usr/bin/perl -w

$shellcode = "AQUÍ VA NUESTRA SHELLCODE";

open(FILE, ">shellcode.bin");
print FILE "$shellcode";
close(FILE);

Lo ejecutamos con:


sebas@Penetraitor:~/roote/lab-sec$ perl proof.pl

Y por último hacemos que nos muestre el resultado por pantalla:


sebas@Penetraitor:~/roote/lab-sec$ ndisasm -b 32 shellcode.bin

00000000 2321 and esp,[ecx]
00000002 2F das
00000003 7573 jnz 0x78
00000005 722F jc 0x36
00000007 62696E bound ebp,[ecx+0x6e]
0000000A 2F das
0000000B 7065 jo 0x72
0000000D 726C jc 0x7b

[...]

También existen otras alternativas como Pym’s, que nos permite desensamblar una shell de forma online.