Cuando analizamos una pieza de malware, la misma puede estar hecha en diferentes lenguajes de programación, puede ser un script, puede ser un downloader o puede ser un archivo ejecutable para el sistema operativo Windows, Linux u otro.

Por estos motivos, vamos a mencionar diferentes herramientas gratuitas para Linux que nos permitan analizar distintas piezas de malware que apunten a distintos sistemas operativos. Es importante tener en cuenta que cuando vayamos a realizar el análisis, el mismo se haga sobre una máquina virtual. Si es necesario ejecutar el malware, utilizar una máquina virtual que pueda correr el sistema operativo al que apunta el malware. Por ejemplo, en el caso de un malware desarrollado para Windows, es recomendable tener otra máquina virtual que corra Windows.

Por otro lado, también es importante recordar los dos tipos de análisis más conocidos que pueden realizarse sobre un malware: el análisis estático y el análisis dinámico.

El análisis estático se basa en obtener toda la información posible de una pieza de malware sin ejecutarla. De esta forma, logramos recolectar toda información que pueda ser de utilidad para tener un mejor entendimiento de la amenaza y realizar otros tipos de análisis; por ejemplo, el análisis de código, donde se realiza ingeniería inversa, o el análisis dinámico, donde se ejecuta la muestra en cuestión.

En el análisis dinámico o análisis de comportamiento, el objetivo es ejecutar la muestra de malware para ver cómo interactúa con la máquina y recolectar información de esta interacción. Por ejemplo, dónde realiza persistencia, si se comunica contra un servidor, capturar ese tráfico de red, entre otras cosas. En algunos casos, el debugging es considerado parte del análisis dinámico, ya que la muestra se está ejecutando a medida que vamos analizando su código.

Primeros pasos y comandos útiles en Linux

Cuando comenzamos a analizar una pieza de malware de la cual podemos tener o no conocimientos previos, es recomendable empezar por una recolección básica de la información que podamos obtener de la misma para luego utilizar una herramienta que nos permita hacer un análisis más extensivo. Por ende, vamos a mencionar distintos comandos que trae Linux, los cuales pueden ser de mucha ayuda en esta primera etapa.

Comando file

Este comando, el cual viene embebido en el sistema operativo, nos va a permitir determinar el formato y tipo de un archivo, más allá de la extensión que pueda llegar a tener. Por ejemplo, a veces sucede que los desarrolladores de malware modifican las extensiones de los archivos para engañar a sus víctimas.

Su forma de ejecutarlo es file nombre_archivo.

Ilustración 1. Obteniendo información básica de distintos archivos mediante el comando file

Comando objdump

Este comando muestra distinta información del archivo que vamos a analizar, desde las secciones que puede tener hasta el código assembler del mismo.

Algunas de las opciones con las que puede ejecutarse este comando son:

  • -x, --all-headers - Muestra el contenido de los encabezados de un archivo
  • -d, --disassemble - Muestra el contenido del código assembler de la sección ejecutable de un archivo
  • -T, --dynamic-syms - Muestra el contenido de la tabla de símbolos dinámica para un archivo ELF
  • -M, --disassembler-options=OPT - Solo soportado para algunos archivos, le pasa información específica al objdump de cómo mostrar el código assembler. Algunas de las opciones pueden ser:
    • x86-64
    • att (AT&T)
    • intel
    • i386

Ilustración 2. Obteniendo los encabezados de un archivo con el comando objdump

Ilustración 3. Visualización del código assembler utilizando la herramienta objdump

Comando xxd

Este comando nos va a permitir ver la representación hexadecimal, entre otras, de un archivo. Algo similar a lo que podríamos hacer con la herramienta HxD en Windows.

Algunas opciones con las que puede ejecutarse son:

  • -C - Muestra los bytes de un archivo y su respectiva representación en ASCII, si es que tienen.
  • -l - longitud Muestra la información del archivo hasta la longitud deseada.

Ilustración 4. Obteniendo solo los primeros 200 bytes de un archivo con su representación en ASCII.

Comando strings

Similar a la herramienta de Sysinternals de Windows, este comando nos va a permitir obtener las cadenas de caracteres (strings) de un archivo. Si bien esta herramienta puede llegar a obtener strings que no nos brinden información importante, desde el laboratorio de ESET se hizo una herramienta llamada LOTS para extraer las strings más relevantes de un archivo que nos sirvan durante un análisis.

Ilustración 5. Ejemplo de uso del comando strings

Comando hexedit

Este comando no solo permite ver un archivo en su representación hexadecimal, como lo puede hacer el comando xxd, sino que también permite editar el archivo. Puede ser de utilidad cuando estamos analizando un malware y necesitamos realizar cambios en su código, por ejemplo, cambiar un salto condicional, modificar la llamada a una función que haga que el programa quede inactivo durante un tiempo determinado, entre otros.

Es importante tener una copia del archivo antes de realizarle algún tipo de modificación.

Algunas opciones para utilizar este comando son:

  • F2 - Guardar el archivo
  • F3 - Cargar un archivo
  • Ctrl+G - Moverse hasta una posición X del archivo
  • Tab - Moverse entre la vista hexadecimal y su representación en ASCII

Ilustración 6. Visualización de un archivo con la herramienta hexedit

Ingeniería inversa y análisis dinámico

Con las herramientas mencionadas anteriormente podemos recolectar información básica de un archivo, lo cual nos puede ser de mucha utilidad al momento de realizar ingeniería inversa, análisis dinámico u otro análisis que sea más exhaustivo. Por ende, en esta parte vamos a enfocarnos sobre distintas herramientas que nos permitan realizar ingeniería inversa, debugging y análisis dinámico.

Para el caso de la ingeniería inversa hay muchas herramientas que se utilizan tanto en Windows como en Linux, como IDA o Ghidra, entre otras. En este caso vamos a hablar de radare2, ya que ofrece unas características interesantes.

Radare2

Radare2 es un framework de código abierto que se usa por medio de línea de comando y que nos permite realizar análisis estático, ingeniería inversa o debugging sobre el archivo que queremos analizar.

Algunas características interesantes de Radare2 que podemos mencionar son:

  • Soporte para múltiples arquitecturas, como x86-64, ARM, MIPS, SPARC, Gameboy, entre otros.
  • Soporte para distintos tipos de archivo, como ELF, PE, MZ, Java, Android, Nintendo DS ROM, entre otros
  • Soporte para distintos sistemas operativos, como Windows, Linux, SerenityOS, entre otros
  • Ofrece distintos plugins, como r2ghidra, el cual integra el decompilador de la herramienta Ghidra sobre radare2.

Algunos comandos que podemos usar sobre este framework son:

  • aaa - Análisis de todas las funciones en el archivo
  • afl - Listar las funciones detectadas en el archivo
  • pdf @ nombre_función - Mostrar el código assembler de una función puntual
  • iS - Mostrar las secciones del archivo
  • izz - Buscar y mostrar las strings dentro de todo el archivo
  • s <address> - Busca una dirección y se posiciona sobre la misma
  • V - Muestra la vista hexadecimal de forma similar al comando xxd que mencionamos anteriormente
  • VV - Activa la vista gráfica donde estemos ubicados en el archivo
  • ? - Comando ayuda utilizado para mostrar más información de los comandos a utilizar

Ilustración 7. Cargando y analizando una muestra sobre el framework Radare2

Ilustración 8. Representación hexadecimal de un archivo desde Radare2

Ilustración 9. Distintas opciones para usar sobre el comando pd en Radare2

Ilustración 10. Vista grafica del IDA Freeware vs vista grafica de Radare2

Comandos ltrace y strace

Para el análisis dinámico, dos comandos a tener en cuenta son ltrace y strace. Estos sirven para hacer un seguimiento de las llamadas a funciones de librerías (ltrace ) o a funciones del sistema (strace) durante la ejecución de un archivo.

Estos comandos sirven para archivos que puedan ser ejecutados por el sistema operativo Linux, por ejemplo, un archivo ELF.

Algunas opciones con las que se puede ejecutar el comando ltrace son:

  • -o nombre_archivo - Guardar la información en un archivo
  • -s - Muestra también las llamadas al sistema (system calls)
  • -c - Muestra la cantidad de veces que se llamó a cada función

Algunas opciones con las que se puede ejecutar el comando strace son:

  • -o nombre_archivo - Guarda la información en un archivo
  • -e trace=syscall - Permite especificar qué tipo de llamadas al sistema se quieren ver. Algunas de estas opciones pueden ser:
    • Network
    • Process
    • Memory

Ilustración 11. Ejemplos de ltrace

Ilustración 12. Ejemplo de strace

GNU Debugger (GDB)

GDB o GNU Debugger es un debugger que nos da la posibilidad de ejecutar un programa instrucción por instrucción para ir analizando su comportamiento, similar al x64dbg para Windows. Soporta distintos tipos de lenguajes como Assembly, C++, Go, Rust, entre otros y está disponible para distintas plataformas Unix, como también para algunas variantes de Windows y Mac OS.

Ilustración 13. Cargando un archivo en gdb

A continuación, mencionamos distintos comandos para ejecutar en gdb que nos van a permitir realizar distintas acciones:

  • starti - Ejecutar el programa y colocando un breakpoint en la primera instrucción
  • b/break - Colocar un breakpoint en un determinado lugar del programa.
  • r/run - Ejecutar el programa
  • info opción - Lista distinta información en base a la opción deseada, algunos ejemplos pueden ser:
    • breakpoints
    • registers
    • functions
  • disassemble - Muestra el código assembler de una función o un fragmento de una función, ej: disassemble main
  • set disassembly-flavor SINTAXIS - Permite modificar el tipo de sintaxis con la que se muestra el código assembler. Ej set disassembly-flavor Intel
  • ni - ejecutar hasta la próxima instrucción
  • c/continue - continuar la ejecución del programa

Ilustración 14. Ejemplo de un malware debuggeado con gdb

A su vez GDB permite el uso de layouts, los cuales nos permiten visualizar distinta información mientras se está debuggeando un archivo, como los valores de los registros o el código assembler, entre otros.

Ilustración 15. Configuración de layouts y sintaxis del lenguaje assembler en GDB

Por defecto, GDB no ofrece una interfaz muy amigable, más allá de que el uso de layouts puede ser de gran ayuda. Es por esto que existen distintos plugins que se pueden integrar para que uno pueda usar la herramienta de forma más cómoda.

Uno de estos plugins es pwndbg. Este complemento permite integrar distintos datos sobre la línea de comandos al momento de debuggear un archivo, como los valores de los registros, la siguiente instrucción a ejecutarse, la información del stack del programa, entre otras cosas.

Ilustración 16. Plugin pwndbg integrado sobre gdb.

Análisis de trafico de red

En esta sección vamos a hablar de dos herramientas que nos van a permitir capturar y analizar el tráfico de red generado por el malware que estamos analizando.

FakeNet-NG

FakeNet-NG es una herramienta freeware desarrollada por el equipo de FLARE para la captura de paquetes de trafico de red. Esta herramienta nos ayudará a realizar algunas de las siguientes acciones:

  • Interceptar el tráfico de red de la máquina
  • Redirigir todo el tráfico o solo un protocolo con la posibilidad de simular un servicio de red
  • Almacenar todo el tráfico capturado
  • Ejecutar comandos automáticamente en base al comportamiento del malware
  • Configurar un proxy para detectar comunicaciones y poder redireccionarlas
  • Generar una blacklist o whitelist para ignorar el tráfico de algún servicio, por ejemplo, el puerto 53 para TCP/UDP

Para poder realizar alguna o todas las acciones mencionadas anteriormente, FakeNet-NG cuenta con un archivo de configuración en el que se puede cargar distintas reglas para realizar estas acciones.

Ilustración 17. Ejecución de FakeNet-NG donde se puede ver la ruta del archivo de configuración.

Ilustración 18. FakeNet-NG archivo de configuración

Todo el tráfico que es capturado por la herramienta se almacena en un archivo con extensión .pcap, el cual se puede abrir con distintas herramientas, como Wireshark o NetworkMiner. Esta última la mencionaremos a continuación.

NetworkMiner

NetworkMiner es una herramienta de código abierto (open source en inglés) que permite capturar el tráfico que se genere en una máquina, de forma similar al Wireshark, para distintos sistemas operativos, como Windows, Linux, MAC OS o FreeBSD.

Por otro lado, esta herramienta puede abrir archivos .pcap para analizarlos. Luego de abrir uno de estos archivos, la información contenida se muestra dividida en distintas pestañas donde vamos a poder ver, por ejemplo, los hosts detectados en la captura de tráfico y distinta información sobre ellos como, la dirección MAC, cantidad de paquetes enviados y recibidos, hostname, entre otros.

Ilustración 19. NetworkMiner

Conclusión

Hemos hecho un recorrido por diferentes herramientas que pueden utilizarse para realizar un análisis de malware sobre Linux. Si bien una buena práctica para alguien que recién empieza es crear una máquina virtual desde cero e ir instalando y probando estas y otras herramientas, una alternativa puede ser utilizar remnux, una máquina virtual que puede descargarse de forma gratuita y posee las herramientas mencionadas anteriormente y muchas otras. Por ejemplo, la herramienta ILspy, que permite analizar archivos desarrollados en el framework .NET.