Volatility 2 & 3
Concepto
En esta sección vamos a realizar un ejemplo de uso medio/avanzado de la herramienta Volatility 2 y 3.
En el proceso vamos a ir obteniendo diferentes datos sobre el sistema a partir de un volcado de memoria ram.
Instalación
Volatility 2
Github oficial de volatility 2
Volatility 3
Github oficial de volatility 3
1
pip install volatility3
Recursos
En el link anterior encontramos el volcado de memoria utilizado en esta sección.
Perfil del sistema operativo
1
2
3
4
5
6
7
8
-Vol3
vol -f "/path/to/file" windows.info
-Vol2
vol.py -f "/path/to/file" imageinfo
vol.py -f "/path/to/file" kdbgscan
Vol3
 _Identifica el sistema como 7601.17514.amd64fre.win7sp1_rtm.
Vol2
Aqui de igual forma indica windows 7 sp1
Procesos en ejecución
1
2
3
4
5
6
7
8
9
10
11
12
-Vol3
vol.py -f "/path/to/file" windows.pslist
vol.py -f "/path/to/file" windows.psscan
vol.py -f "/path/to/file" windows.pstree
-Vol2
vol.py -f "/path/to/file" ‑‑profile <profile> pslist
vol.py -f "/path/to/file" ‑‑profile <profile> psscan
vol.py -f "/path/to/file" ‑‑profile <profile> pstree
vol.py -f "/path/to/file" ‑‑profile <profile> psxview
Vol3
Vol2
Total de 42 procesos
Árbol de procesos
1
2
3
4
5
6
7
-Vol3
vol.py -f "/path/to/file" windows.pstree
-Vol2
vol.py -f "/path/to/file" ‑‑profile <profile> pstree
Vol3
(Como vemos no parsea demasiado bien el contenido)
Vol2
Por ejemplo podemos ver con más claridad el PPID de cada uno de los procesos.
Registro de Windows
Lista de hives
1
2
3
4
5
6
7
8
9
-Vol3
vol.py -f "/path/to/file" windows.registry.hivescan
vol.py -f "/path/to/file" windows.registry.hivelist
-Vol2
vol.py -f "/path/to/file" ‑‑profile <profile> hivescan
vol.py -f "/path/to/file" ‑‑profile <profile> hivelist
Vol3
Vol2
En ambos coincide que existen 12 hives en el registro
Claves de registro
1
2
3
4
5
6
7
8
9
-Vol3
vol.py -f "/path/to/file" windows.registry.printkey
vol.py -f "/path/to/file" windows.registry.printkey ‑‑key "Software\Microsoft\Windows\CurrentVersion"
-Vol2
vol.py -f "/path/to/file" ‑‑profile <profile> printkey
vol.py -f "/path/to/file" ‑‑profile <profile> printkey -K "Software\Microsoft\Windows\CurrentVersion"
Vol3
Por ejemplo vemos que en SYSTEM existen 9 claves incluyendo las volátiles
Vol2
Claves especificas
1
2
3
4
5
6
7
-Vol3
vol.py -f "/path/to/file" windows.registry.printkey ‑‑key"Software\Microsoft\Windows\CurrentVersion"
- Vol2
vol.py -f "/path/to/file" ‑‑profile <profile> printkey -K "Software\Microsoft\Windows\CurrentVersion"
Vol3
Vol2
Hash de contraseñas
1
2
3
4
5
6
7
-Vol3
vol.py -f <ruta_a_la_imagen> windows.hashdump
- Vol2
vol.py -f "/path/to/file" ‑‑profile <profile> hashdump
Vol3
Vol2
En este caso la contraseña es sencilla
Conexiones externas
1
2
3
4
5
6
7
-Vol3
vol.py -f <ruta_a_la_imagen> windows.netstat
- Vol2
vol.py -f <ruta_a_la_imagen> --profile=<perfil_de_sistema> netscan
Vol3
Vol2
En este caso volatility 2 es más capaz
Estructuras FILE_OBJECT
1
2
3
4
5
6
7
-Vol3
vol.py -f <ruta_a_la_imagen> windows.filescan
- Vol2
vol.py -f <ruta_a_la_imagen> --profile=<perfil_de_sistema> filescan
Vol3
Vol2
Extracción de ficheros
1
2
3
4
5
6
7
-Vol3
vol.py -f [ImageName] -o "dump" windows.dumpfile --pid 1328 --virtaddr 0xbf0f6abe9740
- Vol2
vol.py -f "/path/to/file" ‑‑profile <profile> dumpfiles ‑‑dump-dir="/path/to/dir" -p <PID>
Localizar un fichero
Vol3
Vol2
Rutas de ficheros
1
2
3
4
5
6
7
-Vol3
vol.py -f "/path/to/file" windows.filescan
- Vol2
vol.py -f "/path/to/file" ‑‑profile <profile> filescan
Vol3
Vol2
Tabla MFT
1
2
3
4
5
6
7
-Vol3
vol.py -f <ruta_a_la_imagen> windows.mftscan.MFTScan
- Vol2
vol.py -f <ruta_a_la_imagen> --profile=<perfil_de_sistema> mftparser
Vol3
Vol2
Aqui podemos ver las fechas de acceso, modificacion, etc de los archivos de los que tengamos interés
URLs en memoria
1
2
3
4
5
6
7
-Vol3
vol.py -f "/path/to/file" windows.vadyarascan --yara-rules "https://" | grep -A 5 -B 5 "Process firefox"
- Vol2
vol.py -f <imagen_memoria> --profile=<perfil> yarascan -Y "https://" | grep -A 5 -B 5 "Process firefox"
Vol2
Podemos ver diferentes URL almacenadas en la memoria
Fechas de ejecución
1
2
3
4
5
6
7
-Vol3
vol.py -f <imagen_memoria> windows.registry.printkey --key "Software\\Mozilla\\Firefox"
- Vol2
vol.py -f <imagen_memoria> --profile=<perfil> printkey -K "Software\\Mozilla\\Firefox"
Vol3
Vol2
Mas o menos podemos deducir las ultimas fechas en función de las ultimas modificaciones de las llaves en el registro de windows
Fechas de navegación a URLs
Si necesitamos visualizar la fecha y hora en la que se visualizó una URL podemos acceder a la base de datos sqlite que genera el navegador.
En este caso firefox genera varias bases de datos en las que almacena cookies, bookmarks, historiales, etc por lo que deberían estar en memoria ya que el proceso está en ejecución.
Localizamos el proceso principal del navegador
Volcamos toda los datos del proceso. En este caso se ha usado volatility 2 pero es indiferente
Podemos verificar que en el volcado podemos encontrar estas bases de datos gestionadas por el navegador
Ahora que sabemos que los documentos están en uso por el proceso vamos a volcar toda los datos en memoria cargados pero de forma individual
Esto nos va a generar muchos archivos que tendremos que filtrar ahora
Por ejemplo podemos filtrar los archivos por tipo ya que el nombre que le asigna volatility es la dirección de memoria que ocupa y el proceso del que viene.
En este caso simplemente con un explorador de archivos organizamos por tipo de fichero y nos quedamos los sqlite.
Vamos a tener que comprobar el contenido a mano de cada uno pero lo más normal es que el fichero sqlite más grande sea el que contiene el historial, bookmarks y otros datos.
Le podemos cambiar el nombre para que sea más fácil de referenciar
Ahora que tenemos el documento podemos abrir la base de datos con sqlite y acceder a los datos
En este caso podemos la URL que vimos anteriormente mediante YARA
La fecha de visita es el número en la tercera columna pero no es visible. Esto es por cómo son almacenadas las fechas en sqlite pero es un cálculo sencillo.
Bonus
Contexto
En esta sección bonus vamos a realizar un analisis más profundo sobre un proceso en concreto.
El objetivo es sencillo; anteriormente conseguimos encontrar un fichero 7z en memoria, el problema es que viene conmprimido con contraseña por lo que tenenmos dos opciones.
1- Intentar crackear el fichero 2- Buscar en el dump de memoria si la contraseña puede estar en algún proceso abierto
Podemos proceder de la siguiente forma:
Mientras dejamos algun software de crackeo intentar descifrar el archivo vamos a indagar en el dump.
En este apartado vamos a estar utilizando únicamente volatility 3.
Listar procesos
1
vol.py -f <imagen_memoria> windows.pslist
Vemos los dos procesos que nos pueden interesar, de uno ya tenemos el 7z y ahora podemos ver que hay contenido en el proceso del notepad
Para este proceso existen numerosos comandos que nos pueden dar más información sobre el contenido en memoria del proceso notepad.exe
1
2
3
vol -f dump.raw windows.memmap --pid <PID_notepad> --dump
vol -f dump.raw windows.vadinfo --pid <PID_notepad>
Estos comandos nos proporcionarán bastante información e incluso es posible que el contenido del fichero que estuviese editando el usuario en el momento de la captura pero analizar el dump puede ser tedioso y alargarse demasiado, es por eso que existen plugins ya hechos por la comunidad para ciertas tareas y es lo que vamos a estar utilizando aquí.
Enlace al plugin
Este plugin lo debemos mover a la ruta donde tengamos localizado nuestro volatility.
En este caso como lo instalamos mediante pip y en linux la ruta debería ser:
1
/home/kali/.local/lib/python3.12/site-packages/volatility3/framework/plugins/windows/
Ahora si podemos ejecutar el plugin de la siguiente forma
1
vol.py -f dump.raw windows.notepad
Aunque el contenido es algo lioso quizás la mejor manera de proceder es identificar la zona que el usuario podría estar viendo en pantalla, es decir la interfaz de usuario.
Cuando identifiquemos el posible texto que necesitamos podemos proceder a intentar descifrar el fichero obtenido anteriormente.
En este caso vamos 4 ficheros porque anteriormente realizamos la extración con volatility 2 y 3