Volatility es una herramienta gratuita de análisis forense de memoria. Es un estándar para respuesta a incidentes y explandible mediante plugins. Un imprescindible para cualquier equipo azul.

En Kali y Debian, Volatility está en los repositorios y se puede instalar con.

sudo apt install volatility

Obteniendo muestras de memoria

Se puede hacer de muchas maneras, pero el más fácil dependerá de aquello con lo que trabajas. Por ejemplo, máquinas encendidas pueden capturar su memoria usando estás herramientas:

  • FTK Imager.
  • Redline. Hay que registrarse.
  • DumpIt.exe
  • win32dd.exe / win64dd.exe.

Estas herramientas suelen proveer de un archivo .raw que contiene un imagen de la memoria del sistema. El formato .raw es uno de los más comunes.

En una máquina apagada puedes conseguir su memoria si el disco no está encriptado. Para sistemas Windows, se puede consiguiendo el siguiente archivo:

%SystemDrive%/hiberfil.sys

Conocido como el archivo de hibernación de Windoes, contiene una imagen comprimida de la memoria del arranque anterior. Sirve para arrancar más rápido y, para nosotros, para hacer análisis forense.

En el caso de máquinas virtuales y capturas de memoria, he aquí algunos archivos según el hipervisor de diferentes máquinas virtuales.

  • VMware - archivo .vmem
  • Hyper-V - archivo .bin
  • Parallels - archivo .mem
  • VirtualBox - archivo .sav que es solo parcial.

Pueden encontrarse en el almacenamiento de datos del hipervisor correspondiente y puede ser copiado simplemente, sin apagar la máquina virtual. Esto preserva la integridad forense de la máquina.

Vamos con las preguntas.

¿Qué formato de memoria es el más común?

.raw

El sistema Windows que analizamos se ha apagado por error. ¿Qué archivo contiene una imagen comprimida de memoria?

hiberfil.sys

¿Y si queremos realizar un análisis forense de memoria en una máquina virtual VMware?

.vmem

Examinando al paciente

Vamos a echar un vistazo a la imagen de memoria que podemos descargar en la página.

Primero, debemos figurarnos qué perfil necesitamos usar. Los perfiles determinan cómo va a tratar Volatility nuestra imagen de memoria, ya que cada versión de Windows es ligeramente distinta. Vamos a ver nuestras opciones con el comando:

volatility -f archivo_de_memoria.raw imageinfo

En mi caso, que he instalado la aplicación en un Ubuntu desde el Github de Volatility, el comando es.

vol.py -f cridexdump.vmem imageinfo

Volatility imageinfo

Vemos que el perfil sugerido es WinXPSP2x86 y es la respuesta a la siguiente pregunta de qué perfil es.

WinXPSP2x86

Ejecutar el comando imageinfo en Volatility nos proveerá con un número de perfiles que podemos probar, sin embargo, solo uno será correcto. Podemos probar esos perfiles con el comando pslist para ver una lista de procesos, validando nuestra selección de perfil por el número de resultados que nos devuelve.

Hagamos esto ahora con:

volatility -f archivo_de_memoria.raw --profile=WinXPSP2x86 pslist

En mi caso:

vol.py -f cridexdump.vmem --profile=WinXPSP2x86 pslist

Echemos un vistazo a los procesos de la imagen. ¿Cuál es el ID para el proceso smss.exe?

368

Además de procesos activos, también podemos ver conexiones de red activas en el momento de la creación de la imagen.

Eso podemos hacerlo con:

volatility -f archivo_de_memoria --profile=PROFILE netscan

Por desgracia, en este caso, al ser de un sistema antiguo, netscan no está soportado.

Es bastante común que un malware trate esconderse junto con su proceso asociado. Podemos ver procesos ocultos adrede con el comando psxview. ¿Qué proceso tiene solo un listado FALSE?

volatility -f archivo_de_memoria --profile=PROFILE psxview

En mi caso.

vol.py -f cridexdump.vmem --profile=WinXPSP2x86 psxview

Procesos ocultos

csrss.exe

Además de ver procesos ocultos, podemos chequear esto mejor con el comando ldrmodules. Aparecerán tres columnas en el medio: InLoad, InInit, InMem. Si alguna de estas es falsa, ese módulo habrá sido inyectado, probablemente. Eso no es bueno.

En un sistema normal, la declaración grep con lo anterior debería retornar algo vacío. ¿Qué proceso tiene las 3 columnas listadas como FALSE además de System?

smss.exe

Ejecutamos.

vol.py -f ~/Descargas/cridexmemdump/cridex.vmem --profile=WinXPSP2x86 ldrmodules | grep "False"

Volatility y procesos más a fondo

csrss.exe

Los procesos no son lo único que debemos examinar en una máquina. Usando el comando apihooks podemos ver parches inesperados en las bibliotecas estándar de sistema DLL’s. Si vemos una instancia del módulo Hooking: <unknown>, eso es malo. Este comando llevará un tiempo ejecutarse, pero mostrará todo código extraño introducido por el malware.

El código inyectado puede ser un tema importante e indicativo de cosas muy malas. Podemos chequear esto con el comando malfind usando:

volatility -f archivo_de_memoria.raw --profile=WinXPSP2x86 malfind -D directorio_de_destino

De esta manera, no solo encontramos el código, sino que lo volcamos a un directorio especificado.

Hagámoslo, ¿cuántos archivos genera esto?

vol.py -f cridexdump.vmem --profile=WinXPSP2x86 malfind -D ./

12

Veamos ahora las DLL’s corriendo en memoria con el comando dlllist

volatility -f archivo_de_memoria --profile=PROFILE dlllist

Por último, hemos visto todas las librerías DLL’s corriendo en memoria. Vamos a ir un paso más allá y vamos a extraerlas con:

volatility -f archivo_de_memoria.raw --profile=PROFILE --pid=PID dlldump -D directorio_de_destino

Donde el PID es el del proceso infectado que hemos visto antes (csrss.exe)

¿Cuántas DLL’s terminamos consiguiendo? (El proceso en cuestión tiene el PID 584)

vol.py -f cridexdump.vmem --profile=WinXPSP2x86 --pid=584 dlldump -D ./

12

Acciones posteriores

Ahora que hemos realizado un análisis forense básico, vamos un paso más allá para ver qué tiene que decir la comunidad sobre lo que hemos descubierto.

Estos dos sitios web sirven para subir el código inyectado que hemos conseguido en la sección anterior.

Subimos los archivos a los dos sitios, ¿con qué malware está infectada nuestra muestra?

Subimos uno de los archivos .dmp obtenidos cuando hemos usado el comando malfind.

Virustotal nos da la respuesta:

cridex