miércoles, 12 de noviembre de 2008

Volcados de la memoria física desde Windows

En este artículo vamos a dar un breve repaso a los diferentes métodos que existen actualmente para, mediante recursos software, obtener volcados de la memoria física en sistemas Windows. En una futura entrada veremos las herramientas disponibles para analizar cada uno de los tipos de volcados obtenidos.

BSoD (Blue Screen of Death)

El primero de los métodos que voy a analizar se basa en las temidas "pantallas azules de la muerte" de Windows (aka BSoD). Cuando se produce un fallo en alguno de los componentes que se ejecutan en el espacio del kernel, Windows "congela" el contenido de la memoria y realiza un volcado de la misma en un fichero en el sistema.

Existen 3 tipos de volcados, tal y como se define en el artículo Q254649 de la Microsoft Knowledge Base. Estos son: volcado de memoria completo, volcado de memoria del núcleo y volcado de memoria pequeño.

De forma evidente, el tipo de volcado más interesante desde el punto de vista de un análisis forense sería el volcado de memoria completo. Sin embargo existe una pega, y es que no es posible realizar este tipo de volcados en sistemas con 2 GB o más de memoria física, tal y como se indica en el artículo Q274598.

Para configurar las diferentes opciones relacionadas con el tipo de volcado de memoria obtenido por defecto podemos consultar el artículo Q307973.

Sin embargo, y dado que los volcados de Windows únicamente se producen ante un fallo del sistema, no resultará fácil integrarlos de forma voluntaria en un procedimiento de respuesta ante incidentes. Aunque esto no es del todo cierto.

Existe la posibilidad de preconfigurar un sistema Windows para que, como reacción ante el uso de una determinada combinación de teclas pueda obtenerse, ahora sí de forma voluntaria, un volcado completo de la memoria. Los pasos necesarios se describen en el siguiente artículo Q244139.

Ficheros pagefile.sys e hyberfil.sys

El primero de ellos, pagefile.sys, contiene las páginas de memoria que han sido volcadas a disco para dejar espacio a aquellas que son accedidas con mayor frecuencia. Este fichero se almacena en la unidad raíz del sistema (C:, habitualmente) y no es accesible mientra Windows esté en funcionamiento. Dado que es posible que almacene datos confidenciales, puede haberse modificado la configuración por defecto para vaciar su contenido durante el apagado del sistema, tal y como muestra el artículo Q314834.

Por otra parte, el fichero hiberfil.sys se almacenará también en la raíz del sistema (C:, habitualmente). No es un fichero esencial y solo lo encontraremos en aquellos sistemas en los que no se haya deshabilitado explícitamente la opción de hibernar, y se haya entrado en dicho estado en alguna ocasión.

Cuando el equipo entra en estado de hibernación el Administrador de energía realiza un volcado del contenido de la memoria física en este fichero, de forma que pueda recuperarse su estado al salir de él.

VMWare y los ficheros .vmem

VMWare ofrece diferentes productos de forma gratuita que nos permitirán adentrarnos en el mundo de la virtualización de sistemas. Mediante la tecnología ofrecida por sus productos podremos analizar el comportamiento en vivo de software "malicioso", arrancar un sistema en caliente contenido en una imagen forense, congelar el estado de la memoria física de un sistema, etc.

Dado el contenido de esta entrada, evidentemente nos vamos a centrar en la última de las posibilidades mencionadas, es decir, la de congelar el estado de la memoria física de un sistema.

Al igual que ocurría al entrar en modo hibernación es posible "suspender" la ejecución de una máquina virtual, de forma que el contenido de la memoria se almacene en un fichero en el sistema permitiéndonos un análisis a posteriori.



El fichero obtenido, y que podremos encontrar en el directorio donde se almacenan todos los archivos que componen la máquina virtual, tendrá la extensión .vmem, y la principal diferencia respecto al fichero hyberfil.sys mencionado con anterioridad viene dada por el formato de su contenido, siendo el de este último similar al producido por el programa dd, es decir, datos en crudo (raw format).

Ficheros en formato raw

Para obtener un fichero con este formato existen diferentes herramientas, de entre las cuales mencionaré a continuación todas aquellas que son gratuitas y conozco. Si vosotros sabeis de alguna más animaros a dejar un comentario mencionando su nombre y principales características.

La primera de todas, y con más solera, sería la versión del programa "dd" para Windows contenida en el paquete FaU, aka Forensic Acquisition Utilities, de George M. Garner Jr. Sin embargo y por desgracia, en las últimas versiones no está disponible la posibilidad de realizar volcados de la memoria física, seguramente debido a la aparición de un nuevo set de herramientas específicamente diseñadas a tal efecto.

Para realizar el volcado de la memoria física el programa "dd" utilizaba el
dispositivo especial \Device\PhysicalMemory, el cual ha dejado de estar disponible desde el modo usuario a partir de Windows 2003 SP1.

A continuación vamos a analizar la herramienta mdd de ManTech. Dicha herramienta permite el volcado de la memoria física de equipos con hasta 4GB y es ofrecida de forma gratuita. Contiene un driver, mdd.sys, que posibilita su utilización en sistemas Windows 2000 a Windows Server 2008, pasando por Vista, en sus ediciones de 32 bits. Para las versiones de 64 bits de Vista y 2008 será necesario generar un driver firmado. Un ejemplo básico de su uso, para obtener un volcado en el fichero memory.dmp y que muestre por pantalla únicamente mensajes de error durante el proceso sería:

mdd_1.3.exe -o memory.dmp -q

El siguiente programa que analizaremos será win32dd. Se trata de una herramienta open source, por lo que junto a los binarios se distribuye su código fuente. Creada por Matthieu Suiche está compuesta por un ejecutable (win32dd.exe), y su driver correspondiente (win32dd.sys). Posibilita la obtención de volcados de memoria tanto en formato raw como en formato de volcado completo de Microsoft, permitiendo utilizar diferentes métodos para ello. Como ejemplo, para obtener el volcado en
formato raw en el fichero memory.dmp utilizaremos el siguiente comando:
win32dd.exe -r memory.dmp

Mencionar la existencia de diferentes bugs. El primero que he detectado ha sido que al lanzarlo con el flag -h realiza un volcado en el fichero de nombre -h, y que si durante la ejecución intentamos detenerlo mediante la combinación Ctrl+C nos dará error en posteriores ejecuciones hasta que reiniciemos el sistema. A pesar de ello, y dado que se trata de la única de las mencionadas cuyo código fuente es open source desde luego es una opción muy a tener en cuenta.

Además de poder generar volcados en formato raw a partir de la versión 1.2 win32dd también es capaz de obtener volcados en formato "crash dump", es decir, volcados similares a los generados ante un error de sistema en Windows. Por ejemplo, para obtener un volcado completo similar al obtenido tras una BSOD:
win32dd.exe -d memory.dmp

Ahora analizaremos un "conversor entre formatos", creado también por Matthieu Suiche. No es la única funcionalidad que ofrece, dado que en realidad se trata de un framework sobre el que cimentar nuestras aplicaciones, pero sí la que más nos interesa en este momento. Se trata de Sandman, una librería que podemos utilizar en nuestros programas escritos tanto en C como en python.

Su uso nos permitirá convertir un fichero hyberfil.sys en un volcado en formato raw. Para ello utilizaremos uno de los programas proporcionados por el autor a modo de demostración en su conferencia de presentación del framework durante la Black Hat USA 2008.

Si extraemos el contenido del fichero zip encontraremos el programa que vamos a utilizar dentro del directorio Demos\Defensive\Hibernation 2 Memory dump, con nombre hib2mem.exe. Como ejemplo de uso, y suponiendo que en el directorio actual exista un archivo hyberfil.sys obtendremos un volcado en el fichero memory.dmp mediante el comando:
hib2mem.exe hyberfil.sys memory.dmp

La última de las herramientas que vamos a analizar se llama Memorize, y ha sido desarrollada por la empresa Mandiant. Una vez descargado el instalador, y después de ejecutarlo con las opciones por defecto, los binarios y ficheros que componen el programa se ubicarán en C:\Archivos de programa\Mandiant\Memoryze.

La opción de realizar volcados de memoria no es la única que ofrece, pero si la que analizaremos en este momento. Para hacer uso de ella emplearemos el fichero por lotes MemoryDD.bat, el cual admite los siguientes flags:

-offset
Su uso permite especificar el desplazamiento dentro de la memoria física que deseamos obtener en el volcado. Si obviamos dicha opción obtendremos un volcado completo.

-size
Permite especificar la cantidad de memoria física que deseamos obtener en el fichero de volcado. Si obviamos dicha opción obtendremos un volcado completo.

-output
Por defecto se obtendrá el volcado en el directorio .\Audits, pero mediante esta opción podremos especificar el directorio en el que queremos que se almacene el fichero resultante.

Teniendo en cuenta lo anterior, y para obtener un volcado de memoria completo en el directorio C:\Archivos de programa\Mandiant\Memoryze\Audits ejecutaremos:
cd %programfiles%\Mandiant\Memoryze

MemoryDD.bat

Y esto ha sido todo de momento. Mucho más en breve.

Bibliografía

Windows Forensics Analysis DVD Toolkit
Harlan Carvey
Syngress

4 comentarios:

msuiche dijo...

Anyway, "-h" is only to display the help this is only a minor bug, there is no influance on the result. Don't be afraid to mail me about it. Open source initiative is to share and improve through the community.

Why you donnot mention WinDbg to analyze BSOD crash dump ? Moreover, you're using win32dd 1.2 and you are only talking about the generation of raw dump but not about crash dump generation compliant with WinDbg. WinDbg community is far more popular than any other forensics tool community. Moreover, using Microsoft Debug Symbols is a *notable* advantage compared to any other tools.

neofito dijo...

Thanks msuiche for your feedback, I'm very pleased to see you around here!

The main reason I haven't reported you the bug has been my poor English, but I promise to do so from now.

On the other hand I haven't mentioned windbg or any other tool because the analysis of the different possibilities is planned for a future entry. Also in reference to your indication about win32dd I think I've fixed it right now, thank you for showing it up!

GigA ~~ dijo...

Buenas!

Me encontraba buscando alguna herramienta para analizar archivos .vmem (VMWare) cuando me he topado con tu blog, el cual tiene buena pinta :)

Has comentado muchas herramientas para realizar esos volcados, pero no me ha quedado claro cual podría utilizarse para, por ejemplo, ver que procesos hay albergados en esos ficheros, qué estructuras tienen, las strings, etc. ¿Cual usarías con archivos de memoria de sistemas virtuales?

Muchas gracias y un saludo.

neofito dijo...

Hola y gracias por tus comentarios :)

Respecto a tu pregunta, no he comentado ninguno de esos puntos dado que los reservo para una futura entrada. Necesito documentarme y hacer algunas pruebas más antes de escribirla pero espero tenerla en breve.

En teoría, y digo en teoría por que no lo he probado, el formato .vmem es realmente un volcado raw (en crudo) por lo que podrías usar tanto memoryze como volatility. Para utilizar este último tendrás que instalar un entorno de python, pero esto no es problema dado que en Linux seguramente lo tengas de serie y para Windows tienes ActivePython.

Suerte y ya nos contarás!