miércoles, 18 de marzo de 2009

Tuneando Volatility

Ya todos conocemos el framework Volatility, un potentísima herramienta que permite el análisis de volcados de memoria de sistemas Windows XP (32bits) Service Pack 2 y 3. También sabemos de la existencia de numerosos plugins que extienden su funcionalidad añadiéndole nuevas y potentes características.

Pues bién, de eso trata este artículo, de los plugins disponibles y el proceso de instalación de los mismos así como intentar centralizar la información referente a cada uno de ellos.

En este caso el sistema utilizado para el proceso de instalación es una Ubuntu GNU Linux 8.10 Desktop Edition.

La mayoría de plugins han sido desarrollados por Brendan Dolan (aka moyix) y pueden encontrarse, junto con una referencia al mensaje de su blog en el que realiza una pequeña introducción al uso y características del mismo, en la siguiente dirección:

http://www.cc.gatech.edu/~brendan/volatility/

Otra gran fuente de información con una recopilación de los plugins disponibles así como una breve descripción de la funcionalidad ofrecida por cada uno de ellos la podemos encontrar en:

http://www.forensicswiki.org/wiki/List_of_Volatility_Plugins

En este caso los créditos van para Jesse Kornblum, al que también debemos agradecer la creación de dos de los plugins disponibles: cryptoscan.py y suspicious.py.

Nótese que para ejecutar cualquiera de los plugins será preciso invocarlos sin indicar su extensión, es decir, suprimiendo el .py final:

$ python volatility suspicious --help

El ejemplo anterior nos mostrará la ayuda del plugin suspicious.py, indicando las opciones y parámetros requeridos.

Instalación de volatility

Lo primero, evidentemente, descargar volatility desde la página oficial:
$ cd /usr/local
$ wget https://www.volatilesystems.com/volatility/1.3/Volatility-1.3_Beta.tar.gz


Ahora desempaquetamos el contenido e incluiremos un enlace simbólico al directorio obtenido, de forma que siempre apunte a la ultima versión del framework que tengamos instalada:
$ tar xvzf Volatility-1.3_Beta.tar.gz
$ rm -f Volatility-1.3_Beta.tar.gz
$ ln -s Volatility-1.3_Beta/ volatility

Ahora vamos a tunearlo un poco.

Plugin getsids.py

Permite obtener el SID para la cuenta de usuario de Windows que se utilizó para lanzar cada uno de los procesos, ofreciendo de esta forma un mayor contexto a los resultados del análisis.
$ cd /usr/local/volatility/memory_plugins/
$ wget http://www.cc.gatech.edu/~brendan/volatility/dl/getsids.py

Más información sobre sus características y funcionamiento aquí. Y el siguiente paper que escribí hace ya algún tiempo para los foros de Wadalbertia quizás resulte interesante para entender un poco mejor el tema de los SIDs.

Librería lists.py

En este caso no se trata realmente de un plugin, sino de una librería que permite recorrer una lista enlazada, la forma en la que Windows, por ejemplo, mantiene la información referente a los procesos ejecutándose en el sistema.

Su instalación resulta trivial:
$ cd /usr/local/volatility/forensics/win32/
$ wget http://www.cc.gatech.edu/~brendan/volatility/dl/lists.py

Plugin ssdt.py

Este plugin nos muestra la SSDT del equipo Windows cuyo volcado de memoria estamos analizando. La SSDT es una tabla que contiene punteros a las llamadas del sistema implementadas por los diferentes módulos (dlls). Estas llamadas del sistema constituyen una interfaz entre el modo usuario y el modo kernel, por lo que son un claro objetivo para establecer hooks (ganchos).

Estos hooks son funciones que reemplazan el código de las verdaderas llamadas del sistema para, por ejemplo, ocultar sockets (rootkits) o actuar como una barrera ante posibles infecciones (antivirus).

Para que este plugin funcione correctamente será necesario haber instalado la librería lists.py.

Pasos necesarios para su instalación:
$ cd /usr/local/volatility/memory_plugins/
$ wget http://www.cc.gatech.edu/~brendan/volatility/dl/ssdt.py

Más información sobre sus características y funcionamiento aquí.

Plugin threadqueues.py

Muestra un lista de los hilos de ejecución encontrados en el volcado de memoria y los mensajes de windows que cada uno de ellos tiene pendientes de gestionar.

Un mensaje, desde el punto de vista de una aplicación, es una notificación de que ha ocurrido algún suceso que debe ser gestionado (una pulsación o movimiento del ratón, una aplicación que necesita algún dato, etc). Todo programa que se ejecuta bajo Windows (incluyendo el propio Windows) tiene su propia cola de mensajes, encargándose de gestionarlos en la forma adecuada. De esta forma, y basándonos en los mensajes almacenados en la cola de una determinada aplicación, podemos conocer el estado en que se encontraba dicha aplicación en el pasado.

Para que este plugin funcione correctamente será necesario haber instalado la librería lists.py.

El proceso de instalación sería:
$ cd /usr/local/volatility/forensics/win32/
$ wget http://www.cc.gatech.edu/~brendan/volatility/dl/lists.py

Más información sobre sus características y funcionamiento aquí.

Plugin moddump.py

Este plugin nos vá a permitir volcar módulos ejecutándose en modo kernel, de la misma forma que el comando integrado procdump nos permite volcar programas ejecutándose en modo usuario.

Pasos necesarios para la instalación:
$ cd /usr/local/volatility/memory_plugins/
$ wget http://www.cc.gatech.edu/~brendan/volatility/dl/moddump.py

Más información sobre sus características y funcionamiento aquí.

Conjunto de plugins volreg

En este caso se trata de varios plugins englobados dentro de una misma categoría dado que su funcionalidad está relacionada: permiten acceder a datos del registro de Windows almacenados en un volcado de memoria.

Una breve descripcion para cada uno de sus componentes:
  • hivescan
    Localiza una estructura CMHIVE en el volcado de memoria, la cual está compuesta por varias claves del registro.

  • hivelist
    Toma la dirección física dentro del volcado para una estructura CMHIVE y retorna la dirección virtual y el nombre para cada una de las claves que la componen.

  • printkey
    Dada la dirección virtual y el nombre para una determinada clave obtiene la fecha de última modificación para la misma así como los valores que ésta contiene.

  • hashdump
    Vuelca los hashes NT y LanMan almacenados en el registro para las cuentas existentes en el sistema del que procede el volcado de memoria.

  • lsadump
    Vuelca la caché de secretos LSA (sin cifrar) desde el registro.

  • cachedump
    Vuelca todos los hashes para las contraseñas de cuentas de dominio almacenadas en el sistema del que procede el volcado de memoria.

Debe hacerse notar que los plugins hashdump, lsadump y cachedump requieren de la librería pycrypto, cuyo proceso de instalacion sería:
$ cd /usr/local  
$ wget http://www.amk.ca/files/python/crypto/pycrypto-2.0.1.tar.gz
$ tar xvzf pycrypto-2.0.1.tar.gz
$ cd pycrypto-2.0.1/
$ python setup.py build
$ python setup.py install

Ahora sí, procedamos a instalar el conjunto de plugins que componen volreg:
$ cd /usr/local
$ wget http://www.cc.gatech.edu/~brendan/volatility/dl/volreg-0.4.zip
$ cd volatility/
$ unzip ../volreg-0.4.zip

Más información sobre sus características y funcionamiento aquí. Y en este enlace podremos encontrar un ejemplo de aplicación práctica, el cual también describe el amigo Pedro en esta entrada de su blog, y algo más superficialmente yo mismo en este hilo de Wadalbertia. También puede resultar interesante este paper para entender la diferencia entre los hashes LanMan y NT.

Plugin volshell

Se trata de una shell de Python interactiva creada con la finalidad de permitir el análisis forense de volcados de memoria.

Su instalación resulta trivial siguiendo los siguientes pasos:
$ cd /usr/local/volatility/memory_plugins/
$ wget http://www.cc.gatech.edu/~brendan/volatility/dl/volshell.py

Sin duda es uno de los plugins que más documentación necesitará consultarse para comprender su funcionamiento, y este resultará un buen punto de partida.

Plugin volrip

Este plugin es realmente potente y está relacionado con el análisis de los fragmentos del registro de Windows que podemos localizar en un volcado de memoria. Auna la potencia de Volatility y Regripper y ya hemos hablado de él en una entrada anterior, por lo que recomiendo su lectura para encontrar los pasos detallados necesarios para su instalación y una descripción de su funcionamiento.

Más información sobre Regripper de nuevo en el blog de Pedro, en concreto en esta entrada, y tambien aquí, en un artículo anterior.

Plugin malfind.py

En este caso se trata de un plugin desarrollado por Michael Hale el cual nos vá a permitir detectar y volcar código malicioso inyectado en otros procesos.

Su funcionamiento requiere de la librería pydasm, la cual está incluida con libdasm y que podremos instalar siguiendo los siguientes pasos:
$ cd /usr/local
$ wget http://www.klake.org/~jt/misc/libdasm-1.5.tar.gz
$ tar xvzf libdasm-1.5.tar.gz
$ cd libdasm-1.5/
$ make
$ make install
$ ldconfig
$ cd pydasm/
$ python setup.py build_ext
$ cp build/lib.linux-i686-2.5/pydasm.so /usr/lib/python2.5/site-packages/.

Una vez instaladas las dependencias los pasos para instalar el plugin serían:
$ cd /usr/local/volatility/memory_plugins/
$ wget http://mhl-malware-scripts.googlecode.com/files/malfind.py

Más información incluyendo un vídeo demostrando su funcionamiento aquí.

Plugins cryptoscan.py y suspicious.py

Ambos han sido desarrollados por Jesse Kornblum:
  • cryptoscan
    Realiza un scan de un volcado de memoria en busca de passphrases de TrueCrypt.

  • suspicious
    Muestra la línea de comandos utilizada para ejecutar procesos sospechosos, considerando como tales aquellos que contengan la palabra TrueCrypt o comiencen por una letra de unidad en minúsculas.

Los pasos para su instalación serían:
$ cd /usr/local/volatility/memory_plugins/
$ wget http://jessekornblum.com/tools/volatility/cryptoscan.py
$ wget http://jessekornblum.com/tools/volatility/suspicious.py
$ mv example3.py example3.py.bak
$ mv example3.pyc example3.pyc.bak

El último paso es necesario para que la ejecución de suspicious.py no muestre ningún error.

Para obtener más información consultar el siguiente enlace.

Plugin pstree.py

Este plugin modifica el formato de salida obtenido de forma que la lista de procesos se muestre como un árbol, permitiendo identificar de un vistazo las relaciones existentes entre los diferentes procesos en ejecución.

Su instalación sería:
$ cd /usr/local/volatility/memory_plugins/
$ wget http://www.pyflag.net/volatility/pstree.py

Más información en el siguiente enlace.

Plugin vol2html

Se trata de un script de perl que puede ejecutarse de forma independiente y que formatea la salida obtenida por Volatility obteniendo un informe en formato html. Para ello redirigiremos el resultado de la ejecución de cualquiera de los comandos o plugins implementados por Volatility a un fichero de texto que posteriomente le pasaremos a vol2html.

Desarrollado por Jamie Levy supone, sin lugar a dudas, un enorme valor añadido a la potencia de Volatility. Más información aquí y aquí.

Notas finales

Ahora ya tenemos una instalación de Volatility totalmente funcional y con todas las características adicionales disponibles en el momento de escribir estas líneas.

Y esto ha sido todo, en breve más, y mejor, espero.