domingo, 21 de diciembre de 2008

Analizando volcados de memoria: MANDIANT Memorize

Una de sus utilidades, que ya mencioné en una entrada anterior, es la de volcar el contenido de la memoria física en un fichero con formato raw, de forma que ésta pueda ser analizada con posterioridad. Por otra parte también puede realizarse el análisis de un sistema en ejecución, previa instalación del programa en el sistema objeto del análisis.

Según sus creadores, Memorize soporta los siguientes sistemas, todos ellos en sus versiones de 32 bits:

  • Windows 2000 Service Pack 4
  • Windows XP Service Pack 2 y Service Pack 3
  • Windows 2003 Service Pack 2

Instalación y primeras observaciones

Una vez descargado el programa, y si lo hemos instalado con las opciones predeterminadas, podremos encontrarlo en el directorio %ProgramFiles%\Mandiant\Memorize.

El binario principal, Memorize.exe, puede ser utilizado de dos formas diferentes:
  • Pasándole como argumento un fichero xml con las opciones de ejecución.
  • Utilizar algunos de los scripts batch, indicándole los parámetros adecuados.

Los ficheros batch, de ejecución directa, y xml, de configuración para la ejecución de Memorize, proporcionados con la instalación son:
  • MemoryDD.bat y AcquireMemory.Batch.xml
    Permiten realizar una imagen de la memoria física.

  • ProcessDD.bat y AcquireProcessMemory.Batch.xml
    Permiten adquirir una imagen del espacio de direcciones del proceso.

  • DriverDD.bat y AcquireDriver.Batch.xml
    Permiten adquirir una imagen de un driver cargado en la memoria.

  • DriverWalkList.bat y DriverAuditModuleList.Batch.xml
    Analizan la lista mantenida por el kernel con los drivers y módulos cargados en la memoria.

  • DriverSearch.bat y DriverAuditSignature.Batch.xml
    Analizan la memoria en busca de estructuras utilizadas para cargar drivers e informa de ello.

  • Process.bat y ProcessAuditMemory.Batch.xml
    Muestran información sobre los procesos encontrados: handles, memoria virtual, puertos y cadenas de texto.

  • HookDetection.bat y RootkitAudit.Batch.xml
    Muestran los hooks detectados en el sistema operativo de análisis.

Ejemplos de uso

Vamos a utilizar el primer volcado de memoria de un sistema Windows 2000 proporcionado con el DFRWS 2005 y que podemos descargar desde aquí.

En primer lugar obtedremos información sobre los procesos que se econtraban en ejecución en el sistema mediante el siguiente comando:
Process.bat -input dfrws2005-physical-memory1.dmp -output dfrws2005

Utilizamos el flag -input seguido del nombre de fichero con el volcado de memoria que deseamos analizar. El flag -output seguido de un nombre de directorio, el cual deberá existir, provoca que los ficheros de resultados se almacenen en el directorio: dfrws2005\Audits\EQUIPO\YYYYMMDDHHMMSS, donde EQUIPO se corresponde con el nombre del equipo en el que se está ejecutando Memorize y la cadena final se sustituye por la fecha y hora en que se ejecutó el comando. Si no se indica un directorio de salida para los resultados éstos se almacenarán por defecto en el subdirectorio "Audits" del directorio actual, el cual se creará en caso de no existir previamente.

Los ficheros de resultados obtenidos pueden ser abiertos mediante cualquier visor xml, como por ejemplo Internet Explorer. Una breve descripción de su propósito y contenido sería:
  • BatchResult.xml
    La primera parte, y que estaría formada por la entidad xml "Processor" contiene información general sobre los módulos que incluye Memorize así como una breve descripción de los parámetros admitidos por cada uno de ellos.
    La segunda parte, formada por la entidad xml "moduleresult", incluye información sobre los parámetros de ejecución utilizados (etiqueta "config") y el nombre del fichero que contiene los resultados solicitados, "mir.w32processes-memory.xml".

  • Issues.BatchResult.xml
    Información referente a los namespaces con la estructura de las entidades xml utilizadas así como la localización de los mismos.

  • issues.mir.w32processes-memory.253b2e08.xml
    Contiene mensajes de información relacionados con el proceso de ejecución, los cuales pueden indicar errores, advertencias o únicamente información de depuración.

  • mir.w32processes-memory.253b2e08.xml
    Serían los resultados finales de la ejecución del comando y, por lo tanto, el fichero con la información relevante para el proceso de análisis.

En todos los casos los resultados se organizan en forma de objetos o items xml que pueden tener o no atributos asociados. Podemos, utilizando Internet Explorer, contraer o expandir los diferentes objetos de forma que sea mas fácil el análisis.

Si queremos obtener información ampliada sobre alguno de los procesos listados mediante el comando anterior utilizaremos alguno de los flags admitidos:
  • -handles true
    Mostrará todos los manejadores de objeto abiertos por el proceso, los cuales se corresponderán con cada una de las propiedades "Handle" dentro de la sección "HandleList" en el fichero de resultado.

  • -sections true
    Muestra todas las secciones de memoria utilizadas por el proceso, donde cada una de las entradas estaría identificada por un elemento "MemorySection" dentro de la sección "SectionList".

  • -ports true
    Muestra la lista de puertos TCP/IP asociados al proceso, indicando su estado, y que serán cada uno de los elementos "PortItem" dentro de la sección "PortList".

  • -strings true
    Muestra una lista con las cadenas de texto encontradas en el espacio de memoria del proceso, ofreciendo así un contexto para las mismas. En este caso observaremos elementos "string" dentro de la sección "StringList".

No recomiendo el uso de los parámetros anteriores sin especificar un proceso determinado, dada la cantidad de información obtenida lo que dificultaría el análisis de los resultados. Para especificar el proceso que se desea analizar utilizaremos indistintamente el flag -pid seguido del identificador de proceso o el flag -process seguido del nombre completo del ejecutable para el proceso o, en su defecto, los primeros 16 carácteres.

Un ejemplo de uso, para obtener todas las cadenas de texto asociadas al proceso con PID 668 (UMGR32.EXE), y volcando los resultados en el subdirectorio dfrws2005:
Process.bat -input dfrws2005-physical-memory1.dmp -pid 668 -strings true

-output dfrws2005

Para obtener el mismo resultado utilizando el fichero de configuración ProcessExample.xml ejecutaríamos:
Memorize.exe -o dfrws2005 -script ProcessExample.xml -encoding none

Y el contenido del fichero ProcessExample.xml utilizado como parámetro para el comando anterior puede descargarse desde aquí.

Volcando objetos desde la memoria

Una de las funcionalidades más destacables de la suite Mandiant Memorize es la posibilidad de volcar elementos desde la memoria como son el ejecutable encargado de iniciar un proceso determinado, todos los ficheros asociados y el contenido de las páginas de memoria que componen el heap y el stack del proceso.

Para volcar todos los ficheros y contenido de la memoria asociada al proceso con PID 668 (UMGR32.EXE) en el directorio de salida dfrws2005 ejecutaremos el siguiente comando:
ProcessDD.bat -input dfrws2005-physical-memory1.dmp -pid 668 -output dfrws2005

Obtendremos como resultado la imagen del ejecutable UMGR32.EXE así como varios ficheros utilizados por el mismo: .clb, .nls, .dll, .dat, etc. Tambien obtendremos ficheros con extensión .vad y cuyo nombre estará formado por el rango de posiciones que ocupan en el fichero de volcado. Mas información sobre los Virtual Address Descriptors en el paper "The VAD tree: A process-eye view of physical memory" y la presentación correspondiente.

En general todos los scripts de comandos que incluyen las letras DD servirán para obtener diferentes elementos desde el fichero de volcado de memoria:
  • MemoryDD.bat: obtener el contenido de la memoria física del sistema.
  • ProcessDD.bat: volcar ejecutables desde la memoria activa o desde un fichero de volcado.
  • DriverDD.bat: volcar drivers o módulos del kernel desde la memoria activa o desde un fichero de volcado.

Análisis final

No he incluido ejemplos para todas las funcionalidades de la herramienta en primer lugar porque únicamente pretendía realizar una introducción y en segundo lugar porque el manual en formato PDF que se incluye es suficientemente descriptivo.

Sin duda la elección de xml como formato para los resultados puede resultar un poco artificial a priori, pero dadas las enormes posibilidades de transformación mediante el uso de ficheros xslt y aplicaciones de parseo como Saxon se trata de la opción mas potente para la generación de informes de manera automatizada.

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

Addendum 03/01/2009:

Podemos utilizar Microsoft Office Excel 2007 para analizar los ficheros de resultados obtenidos. Una vez seleccionado nos preguntará como deseamos abrir el fichero, donde escogeremos "Tabla XML" de entre las opciones posibles. Es probable que aparezca algún mensaje de advertencia, pero si lo obviamos podremos analizar los resultados con toda la potencia que nos permite Excel 2007.

Addendum 06/01/2009:

Vía blog de Sergio Hernando me entero de la existencia de AuditViewer, una utilidad que no sólo permite su utilización como parser para los resultados generados por Mandiant Memorize, sino que tambien se integra con él de forma que facilita su ejecución para determinadas tareas.

¡Gracias por la información, Sergio!