PDF deconstruído al aroma de shellcode ( I )

Como dice Toni Villalón, los malos no tienen vacaciones… así que los que trabajamos en respuesta ante incidentes tampoco. Hace unos días una de nuestras usuarias creó un ticket con un correo que le parecía malicioso (una muestra más de que la concienciación en seguridad cuesta de realizar, pero que a largo plazo termina rindiendo beneficios).

La usuaria nos mandó un fichero con extensión .msg (el resultado de “Guardar Como…” en Outlook). Para abrirlo en Ubuntu lo más sencillo es emplear el script en Perl msgconvert.pl, que nos lo convierte a MIME (un formato mucho más estándar y manejable).

El nuevo fichero nos da información muy interesante con tan solo un examen superficial:

y un adjunto denominado “Invoice_4605916.pdf”.

Suena raro, ¿verdad?. Pues vamos a extraer ese PDF del fichero en formato MIME para ver qué pinta tiene. Si repasamos un poco el estándar MIME recordaremos que el formato de codificación es base64, así que es tan sencillo como copiar el texto entero desde el principio hasta el final del adjunto (no olvidéis los símbolos “=” si los hubiera, que son el padding de base64) , pegarlo a un fichero de texto, y desde una línea de comandos ejecutar:

El resultado es un fichero PDF de 52Kb, que abierto en Ubuntu nos muestra una pantalla en blanco (Recordad: nunca abráis estos ficheros en una máquina Windows a la que le tengáis cariño, usad siempre una máquina virtual o un equipo que pueda ser formateado sin problemas). Es un buen momento para empezar a sacar la artillería pesada, por lo que llamamos a nuestro analizador de PDF favorito, peepdf, (!Thx , @EternalTodo!), en modo iterativo, ignorando los errores, e indicándole que parsee de forma laxa para detectar objetos malformados.

Damas y caballeros, tenemos premio. El CVE-2013-2729 es una vulnerabilidad de Adobe Reader en versiones anteriores a la 11.03 que aprovecha un fallo en la gestión de imágenes codificadas en el formato BMP/RLE. Es una vulnerabilidad bastante conocida por lo fácil que es encontrar PoCs por Internet y crear exploits al uso.

Estos exploits suelen ser pequeños, actuando simplemente como droppers del malware real descargándoselo de una URL, por lo que lo primordial desde el punto de vista de la respuesta ante incidentes es encontrar el dominio al que se conectan para poder bloquearlo lo antes posible.

El paso siguiente suele ser analizar el código JavaScript, que suele tener el shellcode que termina ejecutando el exploit. Sin embargo, cuando ejecutamos en peepdf el comando “js_analyze object 1“, obtenemos una parte de código JavaScript y el siguiente error:

Parece que pasa algo con el objeto. Lo mejor que podemos hacer es volcar el objeto completo y analizarlo fuera de peepdf:

El fichero resultado ocupa … ¡91.1Mb!. Definitivamente, algo huele muy mal en este PDF. Si lo abrimos con vi obtenemos la siguiente información:

  • Varios trozos de código JavaScript, ofuscado a conciencia: Nombres de variables sin sentido y enrevesados, funciones anidadas, generación de variables en tiempo de código.
  • Tiene 3 imágenes (que suponemos que serán las empleadas para explotar la vulnerabilidad), una de ellas de un tamaño descomunal (la causante del espacio ocupado por el fichero).
  • El shellcode no aparece por ningún lado (en muchos casos suele ser una variable más del JavaScript, fácilmente localizable).

Está claro que toca remangarnos la camisa, ponernos las botas de pocero y analizar en profundidad el JavaScript… pero eso será en el siguiente post ;-)

UPDATE: Debido a que, como decía un usuario, se aprende mucho más cacharreando que leyendo, os adjuntamos el pdf malicioso objeto del análisis. Para analizarlo con la seguridad necesaria debéis seguir estos pasos:

1) Disponer de una máquina virtual Linux (insistimos, el “bicho” está vivo y si lo ejecutáis en una máquina física Windows la infectará y tendréis que reinstalar el sistema operativo. Avisados quedáis).
2) Descomprimir el .zip que está protegido por la contraseña “infected”.
3) Renombrar el fichero pdf_malicioso.SAW a pdf_malicioso.pdf.

Comments

  1. ostras

    con ganas de ver la segunda parte

    @alisterwhitehat

  2. Hola,

    ¿podríamos tener acceso al PDF en cuestión para poder replicar el análisis? Leer está bien, pero practicando/salseando es como realmente se aprende.

    Gracias.

  3. Muy buenas tardes, Juanan

    Tienes toda la razón, caballero. Estoy en un curso, cuando llegue a la oficina :)

    Un saludo,

    Antonio Sanz
    S2 Grupo – Área de Seguridad

  4. Hola,

    gracias por subir el PDF. Por si hay otros usuarios Linux a los que les ocurre esto al intentar descomprimir (probado en Ubuntu 14.04):

    $ unzip pdf_malicioso.SAW_.pass_infected.zip
    Archive: pdf_malicioso.SAW_.pass_infected.zip
    skipping: pdf_malicioso.SAW need PK compat. v5.1 (can do v4.6)

    Que sepan que es un problema de incompatibilidad entre el unzip de Ubuntu (última versión) y el programa de compresión usado en el origen.

    Solución:

    $ sudo apt-get install p7zip-full
    $ 7z e pdf_malicioso.SAW_.pass_infected.zip

    Introducimos la clave y listo.

    Hope it helps.

  5. Un detalle más. Si en Linux (al menos en Ubuntu 14.04), al ejecutar el comando

    PPDF> js_analyse object 1

    os dice que no encuentra el módulo pyv8, e intentáis instalarlo vía pip como se indica aquí: http://code.google.com/p/pyv8/
    veréis que la instalación os arroja un error. Lo he intentado solucionar de varias formas y no lo he conseguido, así que he ido por la vía dura, compilar pyv8 desde las fuentes, siguiendo estas instrucciones: http://askubuntu.com/a/331613/106417

    Ahora sí, he podido seguir el tutorial. ¡Espero la segunda parte! :-)