Análisis estático de binarios PE desde linux

En esta entrada veremos como usar algunas herramientas de código abierto en linux para la evaluación inicial de archivos ejecutables de windows potencialmente maliciosos.

Las técnicas que abordaremos forman parte de el análisis estático de malware, la cuál consiste en analizar un archivo sospechoso sin ejecutarlo. El análisis estático corresponde a la técnica más básica de análisis de malware y el objetivo es extraer información del binario.

Precaución: Para este articulo vamos a utilizar un archivo malicioso, bajo ningún motivo ejecute el archivo en un entorno windows, todo el procedimiento se realizará desde una máquina virtual con sistema operativo linux.

Escenario:

Uno de los usuarios de la organización ha reportado actividad extraña en el computador. El equipo de respuesta a incidentes ha logrado identificar la presencia de un archivo sospechoso ubicado en el perfil de la usuaria.

El archivo que usaremos es este:

Folio-854500047700.zip
El archivo está comprimido, para descomprimir utilizar la contraseña “infected”

En la mayoria de escenarios, lo primero que haría un analista de seguridad es obtener un hash del archivo y compararlo en virustotal. Sin embargo, si es un binario reciente probablemente no esté aún en la base de datos de las sandbox públicas y no reconozca el archivo como una amenaza o su detección sea baja. Es probable que cuando evalúe el binario aquí suministrado, este ya esté reportado en varias fuentes de información.

Análisis

Determinar el tipo de archivo

Al descomprimir el archivo encontramos que la extensión es .bin, sin embargo debemos desconfiar de esta información y determinar que tipo de archivo es. Para este propósito se utilizan las cabeceras del archivo (headers) las cuales pueden ser visualizadas con un editor hexadecimal y comparadas contra información que encontremos en internet.

En el caso de los archivos PE, si observamos directamente en la documentación de referencia de Microsoft aparecen varios valores hexadecimales que corresponden a archivos PE. Ejecutaremos la herramienta xxd para obtener las cabeceras y los números mágicos que identifican al tipo de archivo.

xxd -g 1 Folio-854500047700.bin | more

Obtenemos los valores 4d 5a, estos valores perteneces a un ejecutable de windows.

Para obtener más información sobre los números mágicos de las cabeceras de archivo recomiendo el sitio de Gary Kessler.

En linux contamos con una herramienta que hace este análisis de los números mágicos y es la herramienta file.

file Folio-854500047700.bin

Al ejecutar el comando file, obtenemos el siguiente resultado.

El comando file muestra el tipo de archivo y la arquitectura.

file también nos permite obtener el tipo MIME (Multipurpose Internet Mail Extensions) del archivo, para más información ver el rfc2045.

file Folio-854500047700.bin --mime-type

Obtención de valores criptográficos.

Una vez identificado el tipo de archivo, obtenemos el valor del hash, los valores hash son como la huella dactilar (fingerprint) del archivo, los algoritmos hash estándares son MD5,SHA-1 o SHA-256 Estos valores son necesarios ya que permiten identificar al binario por más que este cambie de nombre o extensión.

El valor del hash es usado con frecuencia como indicador de compromiso (IOC) en los procesos de respuesta a incidentes. los comandos md5sum, sha1sum y sha256sum permiten obtener el valor del hash requerido.

Observen como se mantiene el valor del hash, aún si el binario tiene otro nombre.

Introducción a pev

pev es una herramienta de código abierto para el análisis de archivos PE (Portable Executable). pev contiene varias herramientas de análisis, las cuales veremos a continuación.

instalación:

sudo apt install pev

pehash

pehash calcular los hashes del archivo.

pehash Folio-854500047700.bin

Al ejecutar pehash sobre el binario obtuvimos el md5, el sha1, el sha256 del archivo y adicionalmente obtuvimos otros dos valores los cuales explicaremos a continuación.

ssdeep

El valor ssdeep permite comparar archivos mediante un método conocido como fuzzy hashing, el método consiste en determinar un porcentaje de similitud con respecto a otro archivo.

por ejemplo si ejecutdo ssdeep sobre la carpeta en la cuál estoy trabajando los binarios aparecerá que la copia que hice utilizando el nombre cmd tiene un 100% de similitud.

ssdeep -pb *

Import Hash

El imphash o importhash es otra técnica que permite identificar o clasificar malware mediante un hash calculado sobre la IAT (Import Address Table) o tabla de direcciones de importación. Este mecanismo creado por Mandiant permite asociar un especimen contra un grupo de amenazas conocido (threat groups). Para más información: https://www.fireeye.com/blog/threat-research/2014/01/tracking-malware-import-hashing.html

Extracción de cadenas de texto

La extracción de strings permite obtener alguna información básica sobre acciones o funcionalidades del binario. No en todos los casos, pero con algunos binarios podemos extraer nombres de archivos, librerías, urls, dominios, direcciones IP, comandos, entre otros valores.

Para obtener las cadenas de texto usaremos el comando strings.

strings Folio-854500047700.bin

Por defecto strings imprime valores en ASCII, sin embargo, el malware pude utilizar otro tipo de codificaciones como Unicode. Para extraer las cadenas Unicode le pasamos como parámetro el tipo de codificación al comando strings,en este caso -el donde e: es para establecer el tipo de codificción y l: es para decirle que usaremos codificación de 16-bits.

strings -el Folio-854500047700.bin

Al imprimir los valores unicode obtenemos información adicional que no vimos en la primera ejecución de strings

En este caso reconocemos que varios textos están escritos en múltiples idiomas y llamadas a funciones de teclado, lo cuál podría indicar que se trata de un malware con funcionalidades de keylogger.

Nota: la salida del comando strings es bastante extensa por lo que se recomienda combinar con comandos como more o less y el uso de expresiones regulares, por ejemplo:

strings -el Folio-854500047700.bin | grep -E ".exe" --color

En algunos casos al ejecutar el comando strings podríamos no obtener mayor información, esto puede ser debido a que el adversario haya empaquetado u ofuscado el ejecutable.

Identificación de Packers

Los packers, son programas que utilizan mecanismos de compresión para ofuscar el contenido de un binario con el fin de evadir algunos controles de seguridad o simplemente dificultar su análisis.

Ejecutamos pepack y pasamos 2 parámetros, el nombre del binario y un archivo txt que contiene las firmas de múltiples packers.

pepack Folio-854500047700.bin -d userdb.txt

https://dvirus.training/wp-content/uploads/2020/01/userdb.txt

En otra entrada, hablaremos con más detalle sobre los packers y los metodos de desempaquetado.

Otras Propiedades.

Con la herramienta pescan podemos obtener otras propiedades, como la entropía del archivo, la fecha de compilado, funciones para evitar ser desensamblado, entre otras.

pescan -v Folio-854500047700.bin

La entropía permite evaluar el nivel de aleatoriedad de datos que contiene un archivo, con base en el valor de la entropia se podría establecer si el archivo ha sido comprimido o empaquedato.

En linux podemos utilizar el comando ent para calcular la entropía de un archivo, en este caso vemos como el archivo comprimido tiene un valor más alto de entropía.

El timestamp, es un valor que indica en que fecha fue compilado el binario. Este valor puede ser usado como un indicador de compromiso o simplemente para crear una linea de tiempo sobre la campaña que estamos analizando.

Mecanismos de protección

Por último usaremos la herramienta pesec para identificar si el binario utiliza algún esquema de preotección como DEP/NX o ASLR.

pesec Folio-854500047700.bin

peframe

peframe es una herramienta de código abierto escrita en python para el análisis estático de binarios PE, contiene funcionalidades para la detección de packers, mutex y mecanismos de protección.

Instalación

sudo apt install git python3-pip libssl-dev swig
git clone https://github.com/guelfoweb/peframe.git
cd peframe

dentro de la carpeta peframe, ejecutamos

sudo python3 setup.py install

Ejecutamos el comando peframe --help para confirmar que la instalación ha sido exitosa.

En la parte inferior del comando de ayuda aparecerán las rutas en las cuales podemos configurar el api de virustotal y algunas reglas para extracción de strings y las reglas de yara.

En el archivo config-peframe.json se puede agregar el api de virustotal.

Una vez configuradas las opciones necesarias, analizamos el binario con peframe.

peframe Folio-854500047700.bin

La ejecución arrojará varias secciones como por ejemplo:

Acciones relacionadas con el comportamiento: En este caso ha detectado la detección de anti-debuggers, funcionalidades para la toma de pantallazos, escalada de privilegios, toma de capturas de teclado (keylogger) entre otras funciones.

Funciones criptográficas: peframe identifica funciones criptograficas utilizadas por el binario, este hallazgo es importante a la hora de realizar un análisis más en profunidad del binario.

Packers: peframe nos confirma la presencia de packers escritos en Delphi.

Funciones: Observamos varias funciones o librerías dinámicas (DLL’s) del sistema operativo que son importadas por el binario.

APIs: En la sección Possible Breakpoint, observamos el llamado a las APIs de Microsoft Windows

Otra forma de ejecutar peframe, es en modo interactivo, pasamos la bandera -i y podemos interactuar en una consola con comandos propios de la herramienta.

peframe Folio-854500047700.bin -i

Si hemos asociado el API de virustotal podemos verificar si el binario aparece reportado por alguna solución anti-malware

Ejecutamos los comandos virustotal y luego antivirus

Conclusiones:

Con estos simples pasos hemos obtenido información valiosa del archivo sospechoso:

  • El tipo de archivo con base en los magic numbers
  • Los valores criptográficos
    • MD5
    • SHA-1
    • SHA-256
    • SSDEEP
    • IMPHASP
  • strings o cadenas de texto en ASCII o Unicode
  • La presencia de packers
  • Funciones criptográficas usadas por el binario
  • DLL’ s importadas y APIs
  • Valores de entropía
  • La fecha de creación del binario
  • Identificación de mecanismos de protección.

En la próxima entrada veremos como crear reglas de YARA para la detección de archivos maliciosos.

Deja un comentario