Bienvenidos a un nuevo post en ByteMind. En el caso de hoy les enseñaremos a realizar un análisis forense con volatility, una herramienta muy útil para la respuesta de incidentes y análisis de malware de un volcado de memoria creado previamente.
Índice
¿Por qué Volatility?
Volatility es una herramienta forense de código abierto para la respuesta a incidentes y el análisis de malware. Está escrito en Python y es compatible con Microsoft Windows, Mac OS X y Linux.
Es capaz de instalarse en cualquier sistema sobre el cual se disponga de Python, por lo que es compatible con multitud de sistemas ya utilicemos Windows, Linux o Mac, lo que facilita mucho el uso del mismo en diferentes sistemas operativos.
Dispone además de una API extensible y programable, donde además de los propios módulos que ofrece el propio Volatility es posible la creación de módulos personalizados con el fin de llevar a cabo análisis de una forma automática, la creación de una interfaz web o GUI personalizada o simplemente explorar la memoria del kernel de una forma automatizada. Los analistas pueden agregar nuevos espacios de direcciones, complementos, estructuras de datos y superposiciones para soldar el marco de trabajo a las necesidades de un momento dado.
Es posible explorar la documentación propia de dicho módulo desde su página oficial para conocer más a fondo sus componentes internos.
Volatility proporciona capacidades que por defecto el propio depurador del kernel de Windows no permite, como podría ser hacer un carving de un histórico de comandos, buffer de entrada/salida de la consola, objetos de usuario y estructuras de datos relacionados con la red.
Ofrece también una cobertura completa de formatos de archivo donde ofrece la posibilidad de analizar volcados sin procesar, por caída, archivos de hibernación, estados guardados de virtualizadores como VMware o volcados del núcleo de VirtualBox, LiME (Linux Memory Extractor), expert witness (EWF) y memoria física directa sobre Firewire. Además también es posible convertir entre los diferentes formatos disponibles por si utilizamos una herramienta diferente a esta y necesitamos un formato concreto.
Dispone además de una serie de algoritmos rápidos y eficientes que le permiten analizar los volcados de memoria RAM de sistemas de gran volumen sin un consumo de recursos excesivo y en muy poco tiempo.
Instalación de Volatility
Para la instalación de Volatility, necesitaremos en primer lugar disponer de Python en la versión 2.7 o superior instalado en nuestro sistema.
Completada esta instalación deberemos de descargarnos el código del mismo desde su repositorio oficial en github con el siguiente comando:
1 |
git clone https://github.com/volatilityfoundation/volatility.git |
Completado este paso tendríamos dos opciones, instalar el mismo en nuestro sistema o ejecutar directamente el fichero .py disponible en dicho código.
En caso de desear instalar el mismo es tan sencillo como ejecutar el fichero setup.py
1 |
sudo python setup.py install |
Este comando anterior se encargará de instalar las dependencias necesarias para el mismo así como los propios paquetes del mismo, creando a su vez también un fichero ejecutable en la ruta /usr/bin/volatility
Si la opción no es instalarla, podemos ejecutar el mismo directamente con el siguiente comando:
1 |
python vol.py [options] |
Primeros pasos con volatility
Como siempre, al igual que en la gran mayoría de herramientas disponemos de una amplia ayuda con la opción –help
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
# volatility --help Volatility Foundation Volatility Framework 2.6 Usage: Volatility - A memory forensics analysis platform. Options: -h, --help list all available options and their default values. Default values may be set in the configuration file (/etc/volatilityrc) --conf-file=/root/.volatilityrc User based configuration file -d, --debug Debug volatility --plugins=PLUGINS Additional plugin directories to use (colon separated) --info Print information about all registered objects --cache-directory=/root/.cache/volatility Directory where cache files are stored --cache Use caching --tz=TZ Sets the (Olson) timezone for displaying timestamps using pytz (if installed) or tzset -f FILENAME, --filename=FILENAME Filename to use when opening an image --profile=WinXPSP2x86 Name of the profile to load (use --info to see a list of supported profiles) -l LOCATION, --location=LOCATION A URN location from which to load an address space -w, --write Enable write support --dtb=DTB DTB Address --output=text Output in this format (support is module specific, see the Module Output Options below) --output-file=OUTPUT_FILE Write output in this file -v, --verbose Verbose information --shift=SHIFT Mac KASLR shift address --physical_shift=PHYSICAL_SHIFT Linux kernel physical shift address --virtual_shift=VIRTUAL_SHIFT Linux kernel virtual shift address -g KDBG, --kdbg=KDBG Specify a KDBG virtual address (Note: for 64-bit Windows 8 and above this is the address of KdCopyDataBlock) --force Force utilization of suspect profile --cookie=COOKIE Specify the address of nt!ObHeaderCookie (valid for Windows 10 only) -k KPCR, --kpcr=KPCR Specify a specific KPCR address |
Vista la ayuda del comando vamos a ver ahora diferentes comandos que nos ayudarán a obtener información del dump así como podría ser el sistema operativo del cual se ha realizado, los procesos que corren en la misma, etc.
Identificación de imágenes
Imageinfo
Una de las opciones más sencillas y el primer paso en la mayoría de situaciones es descubrir de qué sistema operativo se ha realizado el dump sobre el cual vamos a realizar el análisis, para ello utilizaremos el módulo imageinfo el cual nos indicará esta información. El comando para lograr esto sería el siguiente:
1 |
# volatility imageinfo -f <filename> |
Y que podemos apreciar en la siguiente captura de pantalla donde lo hemos utilizado para conocer el sistema de un dump de memoria de windows:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# volatility imageinfo -f memory.img Volatility Foundation Volatility Framework 2.6 INFO : volatility.debug : Determining profile based on KDBG search... Suggested Profile(s) : WinXPSP2x86, WinXPSP3x86 (Instantiated with WinXPSP2x86) AS Layer1 : IA32PagedMemory (Kernel AS) AS Layer2 : FileAddressSpace (/tmp/memory.img) PAE type : No PAE DTB : 0x39000L KDBG : 0x8054cf60L Number of Processors : 1 Image Type (Service Pack) : 3 KPCR for CPU 0 : 0xffdff000L KUSER_SHARED_DATA : 0xffdf0000L Image date and time : 2018-10-20 23:53:02 UTC+0000 Image local date and time : 2018-10-21 01:53:02 +0200 |
Como vemos en el ejemplo anterior, al realizar la función de imageinfo, este nos ha sugerido varios perfiles a los cuales puede pertenecer el dump, que en este caso pertenece a un sistema Windows XP SP2 y cuya arquitectura es x86.
Conocido el perfil, ahora necesitaremos indicarle el mismo para realizar un análisis más exhaustivo con alguno de los módulos que tengamos disponibles, para indicar el mismo utilizaríamos la opción –profile como vemos a continuación:
1 |
volatility -f memory.img --profile=WinXPSP2x86 |
Kdbgscan
A diferencia de imageinfo, que nos ofrece una serie de perfiles sugeridos, kdbgscan nos ofrece un perfil exacto de la imagen analizada así como el identificados exacto de KDBG. Este plugin escanea las firmas de las cabeceras de la imagen y las contrarresta con los perfiles almacenados en la base de datos de volatility, reduciendo con ello el número de posibles falsos positivos.
Podemos ver un ejemplo en la siguiente imagen donde podemos observar que nos saca el perfil exacto, dando más información de la obtenida anteriormente con imageinfo
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
# volatility -f memory.img --profile=WinXPSP2x86 kdbgscan Volatility Foundation Volatility Framework 2.6 ************************************************** Instantiating KDBG using: Kernel AS WinXPSP2x86 (5.1.0 32bit) Offset (V) : 0x8054cf60 Offset (P) : 0x54cf60 KDBG owner tag check : True Profile suggestion (KDBGHeader): WinXPSP3x86 Version64 : 0x8054cf38 (Major: 15, Minor: 2600) Service Pack (CmNtCSDVersion) : 3 Build string (NtBuildLab) : 2600.xpsp_sp3_qfe.130704-0421 PsActiveProcessHead : 0x805614d8 (33 processes) PsLoadedModuleList : 0x8055b340 (104 modules) KernelBase : 0x804d7000 (Matches MZ: True) Major (OptionalHeader) : 5 Minor (OptionalHeader) : 1 KPCR : 0xffdff000 (CPU 0) ************************************************** Instantiating KDBG using: Kernel AS WinXPSP2x86 (5.1.0 32bit) Offset (V) : 0x8054cf60 Offset (P) : 0x54cf60 KDBG owner tag check : True Profile suggestion (KDBGHeader): WinXPSP2x86 Version64 : 0x8054cf38 (Major: 15, Minor: 2600) Service Pack (CmNtCSDVersion) : 3 Build string (NtBuildLab) : 2600.xpsp_sp3_qfe.130704-0421 PsActiveProcessHead : 0x805614d8 (33 processes) PsLoadedModuleList : 0x8055b340 (104 modules) KernelBase : 0x804d7000 (Matches MZ: True) Major (OptionalHeader) : 5 Minor (OptionalHeader) : 1 KPCR : 0xffdff000 (CPU 0) |
Kpcrscan
Se puede utilizar este comando para buscar posibles estructuras de KPCR comprobando los miembros con autorreferencia. En un sistema multinúcleo, cada procesador tiene su propio KPCR. Por lo tanto, se podrán ver detalles para cada procesador, incluidas las direcciones IDT y GDT; hilos actuales, inactivos y siguientes, número de CPUs, proveedor y velocidad; y valor CR3.
1 2 3 4 5 6 7 8 9 10 11 12 |
# volatility -f memory.img --profile=WinXPSP2x86 kpcrscan Volatility Foundation Volatility Framework 2.6 ************************************************** Offset (V) : 0xffdff000 Offset (P) : 0x40000 KdVersionBlock : 0x8054cf38 IDT : 0x8003f400 GDT : 0x8003f000 CurrentThread : 0xffbc94b8 TID 396 (Memoryze.exe:1896) IdleThread : 0x80559b40 TID 0 (-:0) Details : CPU 0 (GenuineIntel @ 2595 MHz) CR3/DTB : 0x39000 |
Si KdVersionBlock no es nulo, entonces es posible encontrar la dirección KDBG de la máquina a través del KPCR. De hecho, el método de respaldo para encontrar KDBG utilizado por complementos como pslist es aprovechar kpcrscan y luego llamar a la función de la API KPCR.get_kdbg().
Identificación de procesos
pslist
Para la enumeración de los procesos de un sitema, utilizaremos el plugin pslist. Este recorrerá la lista vinculada que apunta a PsActiveProcessHead y mostrará el desplazamiento, nombre del proceso, ID del proceso e ID del proceso padre del mismo, el número de subprocesos, número de identificadores, así como la fecha y hora en la cuál dicho proceso empezó y terminó. A partir de la versión 2.1 muestra también el ID de sesión y si dicho proceso es un Wow64, es decir, que utiliza un espacio de dirección de 32 bits en un sistema de 64 bits.
Hay que tener en cuenta también que los procesos System y smss.exe no dispondrán de un ID de sesión debido a que el sistema se inicia antes de que se establezcan dichas sesiones. Podemos ver un ejemplo del mismo a continuación:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
# volatility -f memory.img --profile=WinXPSP2x86 pslist Volatility Foundation Volatility Framework 2.6 Offset(V) Name PID PPID Thds Hnds Sess Wow64 Start Exit ---------- -------------------- ------ ------ ------ -------- ------ ------ ------------------------------ ------------------------------ 0x80eed020 System 4 0 55 251 ------ 0 0x80d42da0 smss.exe 368 4 3 19 ------ 0 2018-10-20 22:45:17 UTC+0000 0x80d407e0 csrss.exe 592 368 12 497 0 0 2018-10-20 22:45:18 UTC+0000 0xffba6020 winlogon.exe 616 368 18 449 0 0 2018-10-20 22:45:18 UTC+0000 0x80dbe7e8 services.exe 660 616 16 260 0 0 2018-10-20 22:45:18 UTC+0000 0xffbd4228 lsass.exe 672 616 22 355 0 0 2018-10-20 22:45:18 UTC+0000 0x80d357e8 VBoxService.exe 828 660 8 105 0 0 2018-10-20 22:45:18 UTC+0000 0xffbbb578 svchost.exe 872 660 19 218 0 0 2018-10-20 23:45:19 UTC+0000 0x80d23938 svchost.exe 960 660 12 285 0 0 2018-10-20 23:45:19 UTC+0000 0xff9f5790 svchost.exe 1052 660 83 1431 0 0 2018-10-20 23:45:19 UTC+0000 0xff9edc10 svchost.exe 1112 660 6 62 0 0 2018-10-20 23:45:19 UTC+0000 0xffb98c20 svchost.exe 1192 660 11 164 0 0 2018-10-20 23:45:19 UTC+0000 0xff9c8c38 spoolsv.exe 1396 660 10 116 0 0 2018-10-20 23:45:19 UTC+0000 0xffba7890 explorer.exe 1608 1552 0 -------- 0 0 2018-10-20 23:45:26 UTC+0000 2018-10-20 23:46:29 UTC+0000 0xffbb5da0 VBoxTray.exe 1760 1608 11 132 0 0 2018-10-20 23:45:27 UTC+0000 0x80d5e900 ctfmon.exe 1768 1608 1 79 0 0 2018-10-20 23:45:27 UTC+0000 0xffb9b7e8 cmd.exe 1976 1608 1 32 0 0 2018-10-20 23:45:48 UTC+0000 0xffb76a78 svchost.exe 944 660 5 104 0 0 2018-10-20 23:46:29 UTC+0000 0x80d26da0 explorer.exe 1868 616 21 733 0 0 2018-10-20 23:46:33 UTC+0000 0xff948b20 alg.exe 248 660 6 105 0 0 2018-10-20 23:46:34 UTC+0000 0xff92c738 wscntfy.exe 1124 1052 1 39 0 0 2018-10-20 23:46:36 UTC+0000 0xff912438 msiexec.exe 1160 660 8 201 0 0 2018-10-20 23:47:01 UTC+0000 0xffbc5a78 msiexec.exe 1968 1160 0 -------- 0 0 2018-10-20 23:47:04 UTC+0000 2018-10-20 23:47:07 UTC+0000 0xff8ff020 IEXPLORE.EXE 1624 1868 16 508 0 0 2018-10-20 23:47:12 UTC+0000 0x80e02bb8 msimn.exe 536 1868 11 323 0 0 2018-10-20 23:47:14 UTC+0000 0xff8f4020 msmsgs.exe 496 872 4 195 0 0 2018-10-20 23:47:14 UTC+0000 0xff8fbda0 msninst.exe 2256 1868 13 412 0 0 2018-10-20 23:47:33 UTC+0000 0xff956020 regedit.exe 2664 1868 1 53 0 0 2018-10-20 23:49:26 UTC+0000 0xff8db020 cmd.exe 3468 1868 1 30 0 0 2018-10-20 23:50:06 UTC+0000 0xff91e570 cmd.exe 1080 1868 1 32 0 0 2018-10-20 23:50:43 UTC+0000 0xffb82aa0 IEXPLORE.EXE 3728 1868 15 486 0 0 2018-10-20 23:52:15 UTC+0000 0xff913c98 cmd.exe 300 1868 1 32 0 0 2018-10-20 23:52:27 UTC+0000 0xff9d37f0 Memoryze.exe 1896 300 1 69 0 0 2018-10-20 23:53:02 UTC+0000 |
pslist por defecto mostrará los offsets virtuales para _EPROCESS pero podemos ver los offsets físicos mediante la opción -P:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
# volatility -f memory.img --profile=WinXPSP2x86 pslist -P Volatility Foundation Volatility Framework 2.6 Offset(P) Name PID PPID Thds Hnds Sess Wow64 Start Exit ---------- -------------------- ------ ------ ------ -------- ------ ------ ------------------------------ ------------------------------ 0x011f5020 System 4 0 55 251 ------ 0 0x0104ada0 smss.exe 368 4 3 19 ------ 0 2018-10-20 22:45:17 UTC+0000 0x010487e0 csrss.exe 592 368 12 497 0 0 2018-10-20 22:45:18 UTC+0000 0x04f0c020 winlogon.exe 616 368 18 449 0 0 2018-10-20 22:45:18 UTC+0000 0x010c67e8 services.exe 660 616 16 260 0 0 2018-10-20 22:45:18 UTC+0000 0x04ade228 lsass.exe 672 616 22 355 0 0 2018-10-20 22:45:18 UTC+0000 0x0103d7e8 VBoxService.exe 828 660 8 105 0 0 2018-10-20 22:45:18 UTC+0000 0x04cf7578 svchost.exe 872 660 19 218 0 0 2018-10-20 23:45:19 UTC+0000 0x0102b938 svchost.exe 960 660 12 285 0 0 2018-10-20 23:45:19 UTC+0000 0x07b70790 svchost.exe 1052 660 83 1431 0 0 2018-10-20 23:45:19 UTC+0000 0x07d5bc10 svchost.exe 1112 660 6 62 0 0 2018-10-20 23:45:19 UTC+0000 0x0501ac20 svchost.exe 1192 660 11 164 0 0 2018-10-20 23:45:19 UTC+0000 0x099a9c38 spoolsv.exe 1396 660 10 116 0 0 2018-10-20 23:45:19 UTC+0000 0x04f0b890 explorer.exe 1608 1552 0 -------- 0 0 2018-10-20 23:45:26 UTC+0000 2018-10-20 23:46:29 UTC+0000 0x04d7dda0 VBoxTray.exe 1760 1608 11 132 0 0 2018-10-20 23:45:27 UTC+0000 0x01066900 ctfmon.exe 1768 1608 1 79 0 0 2018-10-20 23:45:27 UTC+0000 0x04fd77e8 cmd.exe 1976 1608 1 32 0 0 2018-10-20 23:45:48 UTC+0000 0x052bca78 svchost.exe 944 660 5 104 0 0 2018-10-20 23:46:29 UTC+0000 0x0102eda0 explorer.exe 1868 616 21 733 0 0 2018-10-20 23:46:33 UTC+0000 0x0b8deb20 alg.exe 248 660 6 105 0 0 2018-10-20 23:46:34 UTC+0000 0x0a409738 wscntfy.exe 1124 1052 1 39 0 0 2018-10-20 23:46:36 UTC+0000 0x0a0cb438 msiexec.exe 1160 660 8 201 0 0 2018-10-20 23:47:01 UTC+0000 0x04c2da78 msiexec.exe 1968 1160 0 -------- 0 0 2018-10-20 23:47:04 UTC+0000 2018-10-20 23:47:07 UTC+0000 0x0181f020 IEXPLORE.EXE 1624 1868 16 508 0 0 2018-10-20 23:47:12 UTC+0000 0x0110abb8 msimn.exe 536 1868 11 323 0 0 2018-10-20 23:47:14 UTC+0000 0x0086b020 msmsgs.exe 496 872 4 195 0 0 2018-10-20 23:47:14 UTC+0000 0x0883ada0 msninst.exe 2256 1868 13 412 0 0 2018-10-20 23:47:33 UTC+0000 0x00bf3020 regedit.exe 2664 1868 1 53 0 0 2018-10-20 23:49:26 UTC+0000 0x07330020 cmd.exe 3468 1868 1 30 0 0 2018-10-20 23:50:06 UTC+0000 0x05a41570 cmd.exe 1080 1868 1 32 0 0 2018-10-20 23:50:43 UTC+0000 0x05230aa0 IEXPLORE.EXE 3728 1868 15 486 0 0 2018-10-20 23:52:15 UTC+0000 0x0a988c98 cmd.exe 300 1868 1 32 0 0 2018-10-20 23:52:27 UTC+0000 0x093f17f0 Memoryze.exe 1896 300 1 69 0 0 2018-10-20 23:53:02 UTC+0000 |
pstree
Podemos ver también esta lista de procesos en forma de árbol utilizando el plugin pstree, lo que enumerará los procesos con la misma técnica utilizada en pslist pero con una vista diferente de la misma y que puede ayudar a identificar de una forma más rápida el padre de cada uno de estos.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
# volatility -f memory.img --profile=WinXPSP2x86 pstree Volatility Foundation Volatility Framework 2.6 Name Pid PPid Thds Hnds Time -------------------------------------------------- ------ ------ ------ ------ ---- 0x80eed020:System 4 0 55 251 1970-01-01 00:00:00 UTC+0000 . 0x80d42da0:smss.exe 368 4 3 19 2018-10-20 22:45:17 UTC+0000 .. 0x80d407e0:csrss.exe 592 368 12 497 2018-10-20 22:45:18 UTC+0000 .. 0xffba6020:winlogon.exe 616 368 18 449 2018-10-20 22:45:18 UTC+0000 ... 0x80dbe7e8:services.exe 660 616 16 260 2018-10-20 22:45:18 UTC+0000 .... 0xff912438:msiexec.exe 1160 660 8 201 2018-10-20 23:47:01 UTC+0000 ..... 0xffbc5a78:msiexec.exe 1968 1160 0 ------ 2018-10-20 23:47:04 UTC+0000 .... 0xff9f5790:svchost.exe 1052 660 83 1431 2018-10-20 23:45:19 UTC+0000 ..... 0xff92c738:wscntfy.exe 1124 1052 1 39 2018-10-20 23:46:36 UTC+0000 .... 0xffb98c20:svchost.exe 1192 660 11 164 2018-10-20 23:45:19 UTC+0000 .... 0xffb76a78:svchost.exe 944 660 5 104 2018-10-20 23:46:29 UTC+0000 .... 0x80d357e8:VBoxService.exe 828 660 8 105 2018-10-20 22:45:18 UTC+0000 .... 0x80d23938:svchost.exe 960 660 12 285 2018-10-20 23:45:19 UTC+0000 .... 0xffbbb578:svchost.exe 872 660 19 218 2018-10-20 23:45:19 UTC+0000 ..... 0xff8f4020:msmsgs.exe 496 872 4 195 2018-10-20 23:47:14 UTC+0000 .... 0xff9edc10:svchost.exe 1112 660 6 62 2018-10-20 23:45:19 UTC+0000 .... 0xff9c8c38:spoolsv.exe 1396 660 10 116 2018-10-20 23:45:19 UTC+0000 .... 0xff948b20:alg.exe 248 660 6 105 2018-10-20 23:46:34 UTC+0000 ... 0xffbd4228:lsass.exe 672 616 22 355 2018-10-20 22:45:18 UTC+0000 ... 0x80d26da0:explorer.exe 1868 616 21 733 2018-10-20 23:46:33 UTC+0000 .... 0xff956020:regedit.exe 2664 1868 1 53 2018-10-20 23:49:26 UTC+0000 .... 0xff8db020:cmd.exe 3468 1868 1 30 2018-10-20 23:50:06 UTC+0000 .... 0xffb82aa0:IEXPLORE.EXE 3728 1868 15 486 2018-10-20 23:52:15 UTC+0000 .... 0xff8ff020:IEXPLORE.EXE 1624 1868 16 508 2018-10-20 23:47:12 UTC+0000 .... 0x80e02bb8:msimn.exe 536 1868 11 323 2018-10-20 23:47:14 UTC+0000 .... 0xff913c98:cmd.exe 300 1868 1 32 2018-10-20 23:52:27 UTC+0000 ..... 0xff9d37f0:Memoryze.exe 1896 300 1 69 2018-10-20 23:53:02 UTC+0000 .... 0xff91e570:cmd.exe 1080 1868 1 32 2018-10-20 23:50:43 UTC+0000 .... 0xff8fbda0:msninst.exe 2256 1868 13 412 2018-10-20 23:47:33 UTC+0000 0xffba7890:explorer.exe 1608 1552 0 ------ 2018-10-20 23:45:26 UTC+0000 . 0xffb9b7e8:cmd.exe 1976 1608 1 32 2018-10-20 23:45:48 UTC+0000 . 0xffbb5da0:VBoxTray.exe 1760 1608 11 132 2018-10-20 23:45:27 UTC+0000 . 0x80d5e900:ctfmon.exe 1768 1608 1 79 2018-10-20 23:45:27 UTC+0000 |
psscan
Para escanear los diferentes procesos existentes en la imagen utilizamos el plugin psscan que nos permitirá obtener también el ID del offset físico de cada uno de los procesos. Este plugin puede encontrar procesos inactivos, es decir, que terminaron previamente, y procesos que han sido ocultos o desvinculados por un rootkig.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
# volatility -f memory.img --profile=WinXPSP2x86 psscan Volatility Foundation Volatility Framework 2.6 Offset(P) Name PID PPID PDB Time created Time exited ------------------ ---------------- ------ ------ ---------- ------------------------------ ------------------------------ 0x000000000086b020 msmsgs.exe 496 872 0x034e6000 2018-10-20 23:47:14 UTC+0000 0x0000000000bf3020 regedit.exe 2664 1868 0x04dfc000 2018-10-20 23:49:26 UTC+0000 0x000000000102b938 svchost.exe 960 660 0x07994000 2018-10-20 23:45:19 UTC+0000 0x000000000102eda0 explorer.exe 1868 616 0x0bf3b000 2018-10-20 23:46:33 UTC+0000 0x000000000103d7e8 VBoxService.exe 828 660 0x0730c000 2018-10-20 22:45:18 UTC+0000 0x00000000010487e0 csrss.exe 592 368 0x06770000 2018-10-20 22:45:18 UTC+0000 0x000000000104ada0 smss.exe 368 4 0x05a58000 2018-10-20 22:45:17 UTC+0000 0x0000000001066900 ctfmon.exe 1768 1608 0x0b2fb000 2018-10-20 23:45:27 UTC+0000 0x00000000010c67e8 services.exe 660 616 0x06ca9000 2018-10-20 22:45:18 UTC+0000 0x000000000110abb8 msimn.exe 536 1868 0x01ba3000 2018-10-20 23:47:14 UTC+0000 0x00000000011f5020 System 4 0 0x00039000 0x000000000181f020 IEXPLORE.EXE 1624 1868 0x0a7de000 2018-10-20 23:47:12 UTC+0000 0x0000000001ae9020 msmsgs.exe 496 872 0x034e6000 2018-10-20 23:47:14 UTC+0000 0x0000000004ade228 lsass.exe 672 616 0x06cb3000 2018-10-20 22:45:18 UTC+0000 0x0000000004c2da78 msiexec.exe 1968 1160 0x022f0000 2018-10-20 23:47:04 UTC+0000 2018-10-20 23:47:07 UTC+0000 0x0000000004cf7578 svchost.exe 872 660 0x07616000 2018-10-20 23:45:19 UTC+0000 0x0000000004d7dda0 VBoxTray.exe 1760 1608 0x0b1ab000 2018-10-20 23:45:27 UTC+0000 0x0000000004f0b890 explorer.exe 1608 1552 0x0a579000 2018-10-20 23:45:26 UTC+0000 2018-10-20 23:46:29 UTC+0000 0x0000000004f0c020 winlogon.exe 616 368 0x06935000 2018-10-20 22:45:18 UTC+0000 0x0000000004fd77e8 cmd.exe 1976 1608 0x02950000 2018-10-20 23:45:48 UTC+0000 0x000000000501ac20 svchost.exe 1192 660 0x08f3c000 2018-10-20 23:45:19 UTC+0000 0x0000000005230aa0 IEXPLORE.EXE 3728 1868 0x07449000 2018-10-20 23:52:15 UTC+0000 0x00000000052bca78 svchost.exe 944 660 0x0836b000 2018-10-20 23:46:29 UTC+0000 0x0000000005a41570 cmd.exe 1080 1868 0x068ff000 2018-10-20 23:50:43 UTC+0000 0x0000000007330020 cmd.exe 3468 1868 0x0808b000 2018-10-20 23:50:06 UTC+0000 0x0000000007b70790 svchost.exe 1052 660 0x07b5a000 2018-10-20 23:45:19 UTC+0000 0x0000000007d5bc10 svchost.exe 1112 660 0x07d71000 2018-10-20 23:45:19 UTC+0000 0x00000000083df020 cmd.exe 3468 1868 0x0808b000 2018-10-20 23:50:06 UTC+0000 0x000000000883ada0 msninst.exe 2256 1868 0x0535b000 2018-10-20 23:47:33 UTC+0000 0x0000000009093da0 msninst.exe 2256 1868 0x0535b000 2018-10-20 23:47:33 UTC+0000 0x00000000093f17f0 Memoryze.exe 1896 300 0x0616c000 2018-10-20 23:53:02 UTC+0000 0x00000000099a9c38 spoolsv.exe 1396 660 0x09981000 2018-10-20 23:45:19 UTC+0000 0x0000000009f19da0 msninst.exe 2256 1868 0x0535b000 2018-10-20 23:47:33 UTC+0000 0x000000000a0cb438 msiexec.exe 1160 660 0x01990000 2018-10-20 23:47:01 UTC+0000 0x000000000a409738 wscntfy.exe 1124 1052 0x02770000 2018-10-20 23:46:36 UTC+0000 0x000000000a988c98 cmd.exe 300 1868 0x082d9000 2018-10-20 23:52:27 UTC+0000 0x000000000b8deb20 alg.exe 248 660 0x01c83000 2018-10-20 23:46:34 UTC+0000 |
Si un proceso ha finalizado previamente, el campo Hora de salida mostrará la hora de salida. Si desea investigar un proceso oculto (como mostrar sus DLL), necesitará un desplazamiento físico del objeto _EPROCESS, que se muestra en la primera columna. Casi todos los complementos relacionados con el proceso tomarán un parámetro offset para que pueda trabajar con procesos ocultos.
dlllist
El plugin dlllist nos permite ver que librerías del sistema está utilizando el mismo, así como obtener el offset de las mismas, el tamaño que ocupan, ruta en la cuál se almacenan, etc.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
# volatility -f memory.img --profile=WinXPSP2x86 dlllist Volatility Foundation Volatility Framework 2.6 ************************************************************************ System pid: 4 Unable to read PEB for task. ************************************************************************ smss.exe pid: 368 Unable to read PEB for task. ************************************************************************ csrss.exe pid: 592 Command line : C:\WINDOWS\system32\csrss.exe ObjectDirectory=\Windows SharedSection=1024,3072,512 Windows=On SubSystemType=Windows ServerDll=basesrv,1 ServerDll=winsrv:UserServerDllInitialization,3 ServerDll=winsrv:ConServerDllInitialization,2 ProfileControl=Off MaxRequestThreads=16 Service Pack 3 Base Size LoadCount LoadTime Path ---------- ---------- ---------- ------------------------------ ---- 0x4a680000 0x5000 0xffff \??\C:\WINDOWS\system32\csrss.exe 0x7c910000 0xb8000 0xffff C:\WINDOWS\system32\ntdll.dll 0x75af0000 0xb000 0xffff C:\WINDOWS\system32\CSRSRV.dll 0x75b00000 0x10000 0x3 C:\WINDOWS\system32\basesrv.dll 0x75b10000 0x4b000 0x2 C:\WINDOWS\system32\winsrv.dll 0x77ef0000 0x49000 0x5 C:\WINDOWS\system32\GDI32.dll 0x7c800000 0x103000 0x10 C:\WINDOWS\system32\KERNEL32.dll 0x7e390000 0x91000 0x6 C:\WINDOWS\system32\USER32.dll 0x76980000 0xb1000 0x1 C:\WINDOWS\system32\sxs.dll 0x77da0000 0xac000 0x5 C:\WINDOWS\system32\ADVAPI32.dll 0x77e50000 0x93000 0x3 C:\WINDOWS\system32\RPCRT4.dll 0x77fc0000 0x11000 0x2 C:\WINDOWS\system32\Secur32.dll ************************************************************************ |
Es posible además especificar el ID del proceso sobre el cual queremos realizar este análisis, para ello podemos utilizar la opción -p o –pid como vemos en el siguiente ejemplo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
# volatility -f memory.img --profile=WinXPSP2x86 dlllist -p 1896 Volatility Foundation Volatility Framework 2.6 ************************************************************************ Memoryze.exe pid: 1896 Command line : Memoryze.exe -o "C:\Archivos de programa\MANDIANT\Memoryze" -script "C:\Archivos de programa\MANDIANT\Memoryze\out.txt" -encoding none -allowmultiple Service Pack 3 Base Size LoadCount LoadTime Path ---------- ---------- ---------- ------------------------------ ---- 0x00400000 0x815000 0xffff C:\Archivos de programa\MANDIANT\Memoryze\Memoryze.exe 0x7c910000 0xb8000 0xffff C:\WINDOWS\system32\ntdll.dll 0x7c800000 0x103000 0xffff C:\WINDOWS\system32\kernel32.dll 0x597f0000 0x56000 0xffff C:\WINDOWS\system32\NETAPI32.dll 0x77da0000 0xac000 0xffff C:\WINDOWS\system32\ADVAPI32.dll 0x77e50000 0x93000 0xffff C:\WINDOWS\system32\RPCRT4.dll 0x77fc0000 0x11000 0xffff C:\WINDOWS\system32\Secur32.dll 0x77be0000 0x58000 0xffff C:\WINDOWS\system32\msvcrt.dll 0x76c50000 0x29000 0xffff C:\WINDOWS\system32\imagehlp.dll 0x71a30000 0x17000 0xffff C:\WINDOWS\system32\WS2_32.dll 0x71a20000 0x8000 0xffff C:\WINDOWS\system32\WS2HELP.dll 0x76d20000 0x19000 0xffff C:\WINDOWS\system32\IPHLPAPI.DLL 0x7e390000 0x91000 0xffff C:\WINDOWS\system32\USER32.dll 0x77ef0000 0x49000 0xffff C:\WINDOWS\system32\GDI32.dll 0x77f40000 0x76000 0xffff C:\WINDOWS\system32\SHLWAPI.dll 0x77bd0000 0x8000 0xffff C:\WINDOWS\system32\VERSION.dll 0x77a50000 0x98000 0xffff C:\WINDOWS\system32\CRYPT32.dll 0x77af0000 0x12000 0xffff C:\WINDOWS\system32\MSASN1.dll 0x7e6a0000 0x822000 0xffff C:\WINDOWS\system32\SHELL32.dll 0x774b0000 0x13e000 0xffff C:\WINDOWS\system32\ole32.dll 0x76f20000 0x2d000 0xffff C:\WINDOWS\system32\WLDAP32.dll 0x76bf0000 0x2e000 0xffff C:\WINDOWS\system32\WINTRUST.dll 0x76340000 0x1d000 0x2 C:\WINDOWS\system32\IMM32.DLL 0x773a0000 0x103000 0x1 C:\WINDOWS\WinSxS\x86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_6.0.2600.6028_x-ww_61e65202\comctl32.dll 0x58c30000 0x9a000 0x1 C:\WINDOWS\system32\comctl32.dll 0x77660000 0x21000 0x1 C:\WINDOWS\system32\NTMARTA.DLL 0x71b90000 0x13000 0x1 C:\WINDOWS\system32\SAMLIB.dll 0x68000000 0x36000 0x1 C:\WINDOWS\system32\rsaenh.dll 0x013b0000 0x2d6000 0x1 C:\WINDOWS\system32\xpsp2res.dll |
dlldump
Para extraer un DLL desde un proceso del espacio de memoria y analizar el mismo podemos utilizar el comando dlldump. Este comando dispone además de los siguientes parámetros:
- Hacer un dump de todos los DLL de todos los procesos
- Hacer un dump de todos los DLL de un determinado proceso con la opción -p pid o –pid=pid
- Hacer un dump de los DLL desde un proceso oculto con –offset=OFFSET
- Hacer un dump de un PE desde cualquier lugar de la memoria del proceso con –base=BASEDIR, esta opción es útil para extraer archivos DLL ocultos
- Hacer un dump de uno o más DLL que coincidan con una expresión regular con la opción –regex=REGEX. También se puede especificar si es case sensitive o no con la opción –ignore-cas
Para especificar un directorio de salida se utilizaría la opción –dump-dir=DIR o -D DIR.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
# volatility -f memory.img --profile=WinXPSP2x86 dlldump -D dlls Volatility Foundation Volatility Framework 2.6 Process(V) Name Module Base Module Name Result ---------- -------------------- ----------- -------------------- ------ 0x80d407e0 csrss.exe 0x04a680000 csrss.exe OK: module.592.10487e0.4a680000.dll 0x80d407e0 csrss.exe 0x07c910000 ntdll.dll Error: DllBase is paged 0x80d407e0 csrss.exe 0x075b10000 winsrv.dll OK: module.592.10487e0.75b10000.dll 0x80d407e0 csrss.exe 0x076980000 sxs.dll OK: module.592.10487e0.76980000.dll 0x80d407e0 csrss.exe 0x07e390000 USER32.dll OK: module.592.10487e0.7e390000.dll 0x80d407e0 csrss.exe 0x077da0000 ADVAPI32.dll Error: DllBase is paged 0x80d407e0 csrss.exe 0x077fc0000 Secur32.dll Error: DllBase is paged 0x80d407e0 csrss.exe 0x07c800000 KERNEL32.dll Error: DllBase is paged 0x80d407e0 csrss.exe 0x075af0000 CSRSRV.dll OK: module.592.10487e0.75af0000.dll 0x80d407e0 csrss.exe 0x075b00000 basesrv.dll Error: DllBase is paged 0x80d407e0 csrss.exe 0x077e50000 RPCRT4.dll OK: module.592.10487e0.77e50000.dll 0x80d407e0 csrss.exe 0x077ef0000 GDI32.dll Error: DllBase is paged 0xffba6020 winlogon.exe 0x001000000 winlogon.exe OK: module.616.4f0c020.1000000.dll 0xffba6020 winlogon.exe 0x07c910000 Error: DllBase is paged 0xffba6020 winlogon.exe 0x077ba0000 midimap.dll OK: module.616.4f0c020.77ba0000.dll ... |
cmdscan
El complemento cmdscan busca en la memoria de csrss.exe en XP, 2003, Vista y 2008 y conhost.exe en Windows 7 los comandos que los atacantes ingresaron a través de una consola (cmd.exe). Este es uno de los comandos más poderosos que puede usar para obtener visibilidad de las acciones de los atacantes en un sistema víctima, ya sea que abran cmd.exe a través de una sesión RDP o que ingresen/elaboren un comando desde un backdoor en red.
Este complemento busca estructuras conocidas como COMMAND_HISTORY buscando un valor constante conocido (MaxHistory) y luego aplicando chequeos de saneo. Es importante tener en cuenta que el valor de MaxHistory se puede cambiar haciendo clic derecho en la esquina superior izquierda de una ventana cmd.exe y yendo a Propiedades. El valor también se puede cambiar para todas las consolas abiertas por un usuario determinado modificando la clave de registro HKCU\Console\HistoryBufferSize. El valor predeterminado es 50 en los sistemas Windows, lo que significa que se guardan los 50 comandos más recientes. Puede ajustarlo si es necesario utilizando el parámetro –max_history=NUMBER.
Las estructuras utilizadas por este complemento no son públicas (es decir, Microsoft no produce PDB para ellas), por lo tanto, no están disponibles en WinDBG ni en ningún otro marco forense. Fueron modificados por Michael Ligh los binarios conhost.exe y winsrv.dll.
Además de los comandos ingresados en un shell, este complemento muestra:
- El nombre del proceso de host de la consola (csrss.exe o conhost.exe)
- El nombre de la aplicación que usa la consola (cualquier proceso que esté usando cmd.exe)
- La ubicación de las memorias intermedias del historial de comandos, incluido el recuento actual de la memoria intermedia, el último comando agregado y el último comando mostrado
- El proceso de la solicitud de manejo
Debido a la técnica de escaneo que utiliza este complemento, tiene la capacidad de encontrar comandos de las consolas activas y cerradas.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
# volatility -f memory.2244013c.img --profile=WinXPSP2x86 cmdscan Volatility Foundation Volatility Framework 2.6 ************************************************** CommandProcess: csrss.exe Pid: 592 CommandHistory: 0x544d88 Application: cmd.exe Flags: Allocated, Reset CommandCount: 2 LastAdded: 1 LastDisplayed: 1 FirstCommand: 0 CommandCountMax: 50 ProcessHandle: 0x410 Cmd #0 @ 0x541eb8: cd Escritorio Cmd #1 @ 0x10f3338: get_info.bat ************************************************** CommandProcess: csrss.exe Pid: 592 CommandHistory: 0x11299a0 Application: cmd.exe Flags: Allocated, Reset CommandCount: 11 LastAdded: 10 LastDisplayed: 10 FirstCommand: 0 CommandCountMax: 50 ProcessHandle: 0x49c Cmd #0 @ 0x548008: cd .. Cmd #1 @ 0x541f90: cls Cmd #2 @ 0x10ffc58: dir Cmd #3 @ 0x548070: cd "Archivos de programa" Cmd #4 @ 0x5480b0: dir Cmd #5 @ 0x5480c0: cls Cmd #6 @ 0x5480d0: cd MANDIANT Cmd #7 @ 0x548150: dir Cmd #8 @ 0x548160: cd Memoryze Cmd #9 @ 0x548180: dir Cmd #10 @ 0x10ffbf0: MemoryDD.bat |
Memoria de procesos
memmap
El comando memmap muestra exactamente las páginas que residen en la memoria, dado un proceso específico DTB (o kernel DTB si usa este complemento en el proceso inactivo o del sistema). Muestra la dirección virtual de la página, el desplazamiento físico correspondiente y el tamaño de la misma. La información de mapa generada por este complemento proviene del método get_available_addresses del espacio de direcciones subyacente.
A partir de la versión 2.1, la nueva columna DumpFileOffset ayuda a correlacionar la salida de memmap con el archivo de volcado producido por el plugin memdump .
Podemos ver un ejemplo de su uso a continuación:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
# volatility -f memory.2244013c.img --profile=WinXPSP2x86 memmap Volatility Foundation Volatility Framework 2.6 System pid: 4 Virtual Physical Size DumpFileOffset ---------- ---------- ---------- -------------- 0x00010000 0x0178e000 0x1000 0x0 0x00012000 0x01790000 0x1000 0x1000 0x00013000 0x01791000 0x1000 0x2000 0x00014000 0x01792000 0x1000 0x3000 0x00016000 0x01794000 0x1000 0x4000 0x00017000 0x01795000 0x1000 0x5000 0x00018000 0x01796000 0x1000 0x6000 0x0001a000 0x01798000 0x1000 0x7000 0x00021000 0x0179f000 0x1000 0x8000 0x00050000 0x03815000 0x1000 0x9000 0x7c910000 0x02238000 0x1000 0xa000 0x7c914000 0x02b98000 0x1000 0xb000 0x7c915000 0x02b99000 0x1000 0xc000 ... |
memdump
Para extraer todas las páginas residentes en la memoria de un proceso en un archivo individual, existe el comando memdump. Se deberá indicar el directorio de salida con -D o –dump-dir = DIR como vemos en el siguiente ejemplo:
1 2 3 4 5 6 7 |
# volatility -f memory.2244013c.img --profile=WinXPSP2x86 memdump -p 4 -D dump/ Volatility Foundation Volatility Framework 2.6 ************************************************************************ Writing System [ 4] to 4.dmp # ls -l dump/4.dmp -rw-r--r-- 1 root root 52977664 Feb 27 11:25 dump/4.dmp |
procdump
El comando procdump se utiliza para extraer el ejecutable utilizado por un proceso. Opcionalmente se pueden añadir las opciones -u o –unsafe para omitir ciertas comprobaciones de saneo utilizadas para analizar el encabedo del mismo. Algunos programas maliciosos podrían falsicicar intencionalmente los campos de tamaño del encabezado para provocar que herramientas de volcado de memoria fallasen.
Se puede utilizar también la opción –memory para indicar un espacio entre las secciones de PE que no están alineados con la página. Si no se indica este parámetro, el resultado será un arhivo que se parecerá más al archivado en el disco antes de que se expandan las secciones oportunas.
1 2 3 4 5 6 7 8 |
# volatility -f memory.2244013c.img --profile=WinXPSP2x86 procdump -p 592 -D dump/ Volatility Foundation Volatility Framework 2.6 Process(V) ImageBase Name Result ---------- ---------- -------------------- ------ 0x80d407e0 0x4a680000 csrss.exe OK: executable.592.exe # ls -l dump/executable.592.exe -rw-r--r-- 1 root root 6144 Feb 27 11:28 dump/executable.592.exe |
Hasta aquí el post sobre análisis forense con volatility, por ahora, y ya es bastante largo. Más adelante añadiré más post con algunos de los plugins más utilizados en volatility, así como los más específicos a la hora de analizar una imagen en busca de malware. Espero les sea de agrado y si tienen algo que decir o dudas al respecto no duden en exponerlas en la sección de comentarios.
PD: ya está disponible la segunda parte de volatility en el siguiente enlace Cazando malware con Volatility
Hola,
Muy buen detelle de como funciona volatility, me falta la segunda parte de como se puede encontrar el Malware. Los comandos són muy utiles pero llevados a una prueba real aun lo son mas.
No dejes de hace la segunda parte.
Hola BitOverun,
Gracias por tu apoyo. Ya está disponible la segunda parte, te dejo a continuación el enlace a la misma:
https://byte-mind.net/cazando-malware-con-volatility/
Saludos
buenas, estoy analizando la misma imagen , pero no consiguo descubrir el nombre del malware instalado.
Podrias indicarme cual es ??
Un saludo.-
Hola,
A qué imagen te refieres?
Hola, muy valiosa tu información.
¿Qué pasa cuando lanzo el comando imageinfo y no me aparecen sSuggested Profiles?
Determining profile based on KDBG search…
Suggested Profile(s) : No suggestion (Instantiated with no profile)
AS Layer1 : FileAddressSpace (D:\ddd.raw)
PAE type : No PAE
Hola Alexander,
En ese caso puedes utilizar el escaner de kdbgscan o kpcrscan.
En caso de que siga sin identificarlo tal vez necesites actualizar los perfiles, que podrás obtener en el mismo repositorio de github del que te descargas la herramienta o añadir algunos extra que no vienen por defecto.
Saludos
Hola, excelente información.
Favor puedes apoyarme con el github de la herramienta
Saludos