Análisis de PDF sospechosos

A raíz de los numerosos correos sospechosos con archivos adjuntos en formato PDF que estamos detectando últimamente, he decidido introducirme en el análisis manual de estos archivos para determinar si son maliciosos y qué comportamiento tienen, en caso de serlo. En este artículo voy a mostrar un sencillo ejemplo de generación y análisis de un PDF malicioso. Para la demostración haré uso de Metasploit para generar el archivo PDF malicioso y REMnux para el análisis del fichero PDF y su contenido. Vayamos por partes, para comenzar.

Generación del PDF

La creación es sencilla: simplemente se elige el exploit para la vulnerabilidad que se quiere aprovechar, en este caso se crea un archivo PDF en blanco con una vulnerabilidad en GetIcon para Adobe Reader (CVE-2009-0927). El código a ejecutar será un conexión inversa a la máquina del atacante.

Una vez definido el ataque, vamos a configurarlo:

Y lo lanzamos…

Ya tenemos el archivo generado. Vamos a analizarlo con peepdf para ver qué detecta. Análisis del archivo Utilizaré peepdf, una completa herramienta desarrollada por José Miguel Esparza (@eternaltodo) cuya versión 0.2 presentó en BlackHat USA 2013, que destripa los archivos PDF para que veamos dónde puede haber código, en principio, sospechoso.

Para tener toda la potencia de peepdf debemos tener instalado spidermonkey, libemu y pylibemu ya que de esta forma podremos analizar código JavaScripty ensamblador. Abrimos el archivo para analizarlo:

Al abrirlo ya nos muestra información con la vulnerabilidad que se intenta aprovechar en el objeto [5]. No obstante vamos a ver qué esconde este objeto para que genere dicha alerta con el comando object5:

Como podemos ver, efectivamente se trata de código JavaScript, donde se observan nombres de variables ofuscadas y al final la llamada a getIcon. Para analizar el código ejecutaremos la orden js_analyze.

Como resultado obtenemos código escapado que parece ininteligible. Vamos a almacenar ese código en una variable y analizarlo con libemu para ver si se trata de un shellcode.

Bien, parece ser que peepdf, más bien sctest, no nos puede dar más información sobre el shellcode. Por esto vamos a usar scdbd para ver si nos revela más información. Previamente vamos a volcar el shellcode a un fichero con el comando js_analyze object 5 > sc.

Análisis del shellcode

Para analizar el shellcode vamos a hacer uso de scdbg. Si tratamos de instalarlo en REMnux según las instrucciones de instalación veremos que da un error en la compilación. Yo lo he solucionando modificando la línea 409 en el archivo libtool, eliminando la referencia a la variable $global_symbol_pipe, dejándola de la siguiente manera:

# The commands to list exported symbols. 
#export_symbols_cmds="\$NM \$libobjs \$convenience | \$global_symbol_pipe | \$SED 's/.* //' | 
   sort | uniq > \$export_symbols" export_symbols_cmds="\$NM \$libobjs \$convenience | 
   \$SED 's/.* //' | sort | uniq > \$export_symbols"

Ahora ya lo tenemos instalado en /opt/libemu/bin/ y podemos ejecutarlo para analizar el código.

Vemos que sí está realizando llamadas a ciertas funciones sospechosas; en concreto vemos que abre una conexión a la dirección 192.168.154.130, puerto 4444/TCP. Aprovechamos para generar una gráfica en DOT y ver la relación de llamadas realizadas.

Análisis de un ejecutable incrustado

Otro ejemplo que quería mostrar que fuera diferente es el caso de la creación y el comportamiento de peepdfcon otro tipo de archivo PDF malicioso con un ejecutable incrustado. Vamos a crear el archivo de la siguiente manera.

Una vez generado, vamos a analizarlo con peepdf. Al abrirlo, nos muestra como elementos sospechosos, que contiene código JavaScript y archivos incrustados, así como acciones Launch.

Con los comandos tree y offsetsobtendremos la estructura del archivo PDF lógica y física. Nos centramos en la parte final, que es la que tiene los elementos sospechosos.

Vemos que el primer elemento es un objecto incrustado, que se encuentra en el objeto 26 y tiene un tamaño de 44247 bytes.

Debido a su tamaño, no cabe en un pantallazo así que para ver su contenido lo extraeremos a un archivo y vemos su contenido.

Vemos que tiene mala pinta, ya que es la típica estructura de un archivo ejecutable. Dejamos apartado temporalmente este archivo y vamos seguir viendo el PDF.

El objecto 27 contiene código JavaScript que guarda el archivo incrustado con el nombre “documentos_resolucion” y posteriormente, en el objecto 28 lo ejecuta.

Por tanto vemos que el PDF descarga un archivo en nuestro equipo y luego muestra un diálogo si queremos ejecutar el siguiente código, que no es más que lanzar el archivo descargado desde cmd.exe.

Esta técnica es la que descubrió Didier Stevens (@DidierStevens) allá en el 2010 cuando descubrió que, si bien el Adobe Reader siempre pregunta antes de abrir un archivo, consiguió engañar al usuario para que no muestre el comando a ejecutar y sí la acción que deseamos que realice (ver texto del objecto 28).

Para finalizar, sólo nos quedaría analizar el funcionamiento del ejecutable con algún debugger pero eso lo dejaremos para otro momento.

Conclusiones

Peepdf nos descubre el interior de un archivo PDF y gracias a la integración de spidermonkey, libemu y scdbg permite analizar JavaScript y Shellcodes. Aunque se trate de ejemplos antiguos, podemos ver dónde se “esconde” habitualmente el malware en este tipo de archivos y cómo analizarlo.

Lenny Zeltser, creador de REMnux, ofrece un resumen del análisis de documentos maliciosos en este enlace, donde indica tanto herramientas como algunos elementos interesantes dentro del PDF. Interesante el apartado de Referencias.

Para la parte de utilizar scdbg me basé en gran medida en el artículo publicado en este blog por Borja Merino (@BorjaMerino), Análisis de shellcodes con scdbg / libemu. La técnica de Didier Stevens la descubrí cuando estaba terminando el artículo, lo que me ayudó a comprender mejor el funcionamiento de la técnica.

Para tener una visión rápida de la estructura de un archivo PDF, tenéis otro artículo de Didier Stevens titulado “About the Physical and Logical Structure of PDF Files”.

Actualización:

Estos últimos días se está publicando en Internet una gran cantidad de artículos que explican cómo analizar documentos PDF. Para aquellos que quieran profundizar más, hay un artículo muy completo que comprende las partes de un archivo, nombra algunas herramientas para analizarlo y qué buscar en un documento PDF, esto último me pareció muy útil y por eso quería compartirlo: http://hiddenillusion.blogspot.jp/2013/12/analyzepdf-bringing-dirt-up-to-surface.html

Comments

  1. Valioso el aporte

  2. Muy bueno el artículo! Y tengo 2 sugerencias para usted:
    – Sería interesante que agregue al artículo cómo instalar spidermonkey, libemu y pylibemu ya que los menciona pero no explica cómo instalarlo.
    – Sería también importante si se publica una 2º parte de este artículo donde se vean las consecuencias de abrir este PDF malicioso del lado del cliente ya que, si bien el artículo habla del análisis de un PDF, me quedé con las ganas de un poco más.

    Espero que le sirva y muchas gracias por compartir sus conocimientos.
    Saludos.

  3. Muchas gracias por su comentario, Mauro.

    La verdad es que no incluí información de cómo instalar esas herramientas para que no quedara muy extenso el artículo y porqué utilicé REMnux, que ya viene con estas herramientas instaladas de serie. Le invito a probar esta distribución y tratar de repetir los pasos del artículo.

    Las consecuencias son las conexión de la máquina infectada a la dirección y puerto indicados en el payload, donde se conectaría (según el ejemplo) a nuestra metasploit desde la que abriríamos una sesión de meterpreter y se tomaría el control de la máquina.

    Espero haber aclarado sus dudas muchas gracias por la sugerencia.