Ir atrás

Herramientas de análisis forense: Volatility.

luishcr • 27 March, 2024

Portada del artículo
"TnVuY2EgcGFyZXMgZGUgYXByZW5kZXI="

¿Qué es Volatility?.

Volatility es un framework de código abierto y gratuito para el análisis forense de memoria volátil, principalmente la memoria RAM. Se utiliza para extraer y analizar datos de la memoria volátil, que se pierde al apagar el equipo. Entre sus versiones encotramos Volatility 2, compatible con Windows, Linux y macOS. Volatility 3 que se encuentra en desarrollo, con nuevas funcionalidades y mejoras en el rendimiento.

Principales usos.

  • Investigación de incidentes: Identificar la causa de un incidente de seguridad, como un ataque de malware o una intrusión.
  • Análisis de malware: Estudiar el comportamiento del malware en la memoria y obtener información sobre sus técnicas de evasión.
  • Recuperación de datos: Recuperar archivos eliminados o perdidos de la memoria volátil.
  • Análisis de sistemas operativos: Estudiar el funcionamiento interno del sistema operativo y sus estructuras de datos.

Volatility 2.

Para la instalación de la versión 2, clonamos el repositorio oficial de github y ejecutamos con Python el fichero "vol.py". Necesitaremos una versión de Python >= 2.6 y < 3.

mkdir -p ~/tools/volatility2
cd !$
git clone https://github.com/volatilityfoundation/volatility.git

Volatility2 installation

 

En muchas distros de Linux disponemos de la versión 3 de Python que viene instalada por defecto, como es el caso de la versión actual de ParrotOS (Debian), por lo que tendremos un error de sintaxis al ejecutar el script.

Volatility2 installation

 

Pyenv.

Pyenv es una herramienta que se utiliza para gestionar distintas versiones de Python en un sistema operativo basado en Unix. Permite instalar y cambiar fácilmente entre diferentes versiones de Python, incluyendo versiones de Anaconda, Ironpython, Jython, Micropython, Miniconda, Pypy, Pyston y Stackless.

Algunas de las funciones y características de pyenv incluyen:

  • Gestión de versiones: pyenv permite instalar y gestionar múltiples versiones de Python en un mismo sistema. Esto es útil cuando se trabaja en proyectos que requieren una versión específica de Python.
  • Virtual environments: pyenv también permite crear y gestionar entornos virtuales, que son entornos aislados que contienen una versión específica de Python y las bibliotecas asociadas. Esto permite tener diferentes entornos de desarrollo para diferentes proyectos, evitando conflictos entre las dependencias de cada proyecto.
  • Integración con otros plugins: pyenv se puede integrar con otros plugins, como pyenv-virtualenv, que facilita la gestión de entornos virtuales. Este plugin permite crear, activar y desactivar entornos virtuales de forma sencilla.

 

A continuación instalamos pyenv tal y como se indica en su repositorio:

curl https://pyenv.run | bash
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc
exec "$SHELL"

 

Luego, buscamos la versión de python que queremos instalar, nos sirve cualquier versión >= 2.6, por ejemplo 2.7.0:

Volatility2 installation

Lamentablemente me daba problemas al intentar instalar la versión 2.7.0 por lo que hice lo siguiente.

  • Instalé estas dependencias:
sudo apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev xz-utils tk-dev libffi-dev liblzma-dev python3-openssl
  • Instalé la versión 2.7.13 debido al siguiente "ERROR: The Python ssl extension was not compiled. Missing the OpenSSL lib?" En Debian Stretch (y Ubuntu Bionic), libssl-dev es OpenSSL 1.1.x, pero el soporte para eso solo se agregó en Python 2.7.13. Entonces, si no necesita una versión específica de 2.7, puede instalar 2.7.13 y el error no aparecerá.
pyenv install 2.7.13

 

Ahora podemos cambiar entre versiones a nuestro antojo.

  • Para establecer la versión global de Python que se usará en todos los shells:
pyenv global 2.7.13
  • Para volver a la versión de Python del sistema cuyo binario está en "/usr/bin/python":
pyenv global system

Volatility2 installation

 

Pero ahora al ejecutar "vol.py", el programa nos advierte de que no encuentra algunas dependencias.

Volatility2 installation

Una buena práctica es crear un entorno virtual de python en el que trabajar e instalar los paquetes necesarios para el proyecto. El procedimiento es el siguiente:

  • pyenv {plugin} {versión_de_python} {nombre_del_entorno}
pyenv virtualenv 2.7.13 vol2env
  • pyenv {ámbito} {entorno}
pyenv local vol2env
  • Activación. Desactivación (deactivate).
pyenv activate
  • Instalación de los paquetes necesarios en el entorno:
pip install distorm3
pip install pycrypto

Volatility2 installation

Volatility 3.

La versión 3 requiere Python >= 3.7.0 y la instalación de unas dependencias para su correcto funcionamiento:

mkdir -p ~/tools/volatility3
cd !$
git clone https://github.com/volatilityfoundation/volatility3.git

 

Para ello instalaremos la versión de Python 3.7.0 y crearemos un nuevo entorno virtual.

Para solucionar el "ERROR 139":

pyenv install 3.7.0
Installing Python-3.7.0...

BUILD FAILED (Debian 6.0 using python-build 20180424)

Inspect or clean up the working tree at /tmp/python-build.20240407110809.14988
Results logged to /tmp/python-build.20240407110809.14988.log

Last 10 log lines:
if test "xupgrade" != "xno"  ; then \
    case upgrade in \
        upgrade) ensurepip="--upgrade" ;; \
        install|*) ensurepip="" ;; \
    esac; \
    LD_LIBRARY_PATH=/tmp/python-build.20240407110809.14988/Python-3.7.0 ./python -E -m ensurepip \
        $ensurepip --root=/ ; \
fi
Segmentation fault
make: *** [Makefile:1122: install] Error 139

Se debe instalar con el siguiente parche "alignment.patch":

--- Include/objimpl.h
+++ Include/objimpl.h
@@ -250,7 +250,7 @@
         union _gc_head *gc_prev;
         Py_ssize_t gc_refs;
     } gc;
-    double dummy;  /* force worst-case alignment */
+    long double dummy;  /* force worst-case alignment */
 } PyGC_Head;

 extern PyGC_Head *_PyGC_generation0;
--- Objects/obmalloc.c
+++ Objects/obmalloc.c
@@ -643,8 +643,8 @@
  *
  * You shouldn't change this unless you know what you are doing.
  */
-#define ALIGNMENT               8               /* must be 2^N */
-#define ALIGNMENT_SHIFT         3
+#define ALIGNMENT               16               /* must be 2^N */
+#define ALIGNMENT_SHIFT         4

 /* Return the number of bytes in size class I, as a uint. */
 #define INDEX2SIZE(I) (((uint)(I) + 1) << ALIGNMENT_SHIFT)
pyenv install --patch 3.7.0 < aligment.patch
pyenv virtualenv 3.7.0 vol3env
pyenv local vol3env

Volatility3 installation

pip3 install -r requirements.txt

Volatility3 installation

 

Finalmente podemos observar que no es necesario activar/desactivar el entorno con el comando pyenv activate puesto que ya lo hace pyenv gracias al fichero .python-version que se ha creado en el directorio cuando ejecutamos pyenv local entorno. Ahora cada proyecto usará la versión de Python correspondiente con sus respectivas dependencias.

Volatility3 installation

Volatility3 installation

Análsis de una memoria.

Obtención de la muestra a investigar.

La extracción de un volcado de memoria se puede realizar de numerosas formas, que varían según los requisitos de la investigación. Algunas herramientas interesantes para extraer la memoria de una máquina básica son:

  • FTK Imager
  • Redline
  • DumpIt.exe
  • win32dd.exe/win64dd.exe
  • Memoryze
  • FastDump

 

Resolución de laboratorio.

Para probar la herramienta resolveremos el Brave Blue Team Lab de CyberDefenders. Nos creamos una cuenta y nos descargamos la muestra en la máquina virtual.

 

  • Q1. ¿A qué hora se adquirió la imagen de la RAM según el sistema sospechoso? (AAAA-MM-DD HH:MM:SS).
cd ~/tools/volatility3
python vol.py -f ~/Downloads/lab/20210430-Win10Home-20H2-64bit-memdump.mem windows.info

PoC

 

  • Q2. ¿Cuál es el valor hash SHA256 de la imagen RAM?.
sha256sum ~/Downloads/lab/20210430-Win10Home-20H2-64bit-memdump.mem

PoC

 

  • Q3. ¿Cuál es el ID del proceso de 'brave.exe'?.
python vol.py -f ~/Downloads/lab/20210430-Win10Home-20H2-64bit-memdump.mem windows.pslist > ~/Downloads/lab/pslist
sed -n '3p; /brave/p' ~/Downloads/lab/pslist

PoC

 

  • Q4. ¿Cuántas conexiones de red establecidas había en el momento de la adquisición? (número).
python vol.py -f ~/Downloads/lab/20210430-Win10Home-20H2-64bit-memdump.mem windows.netscan > ~/Downloads/lab/netscan
grep -i 'established' ~/Downloads/lab/netscan | wc -l

PoC

 

  • Q5. ¿Con qué FQDN Chrome tiene una conexión de red establecida?.
grep 'chrome' ~/Downloads/lab/netscan | grep -i 'established'
curl ipinfo.io/185.70.41.130

PoC

 

  • Q6. ¿Cuál es el valor hash MD5 del proceso ejecutable para PID 6988?.
python vol.py -f ~/Downloads/lab/20210430-Win10Home-20H2-64bit-memdump.mem windows.pslist --pid=6988 --dump
md5sum 6988.OneDrive.exe.0x1c0000.dm

PoC

 

  • Q7. ¿Cuál es la palabra que comienza en el desplazamiento 0x45BE876 con una longitud de 6 bytes?.
od -t c -j 0x45BE876 -N 6 20210430-Win10Home-20H2-64bit-memdump.mem 

PoC

 

  • Q8. ¿Cuál es la fecha y hora de creación del proceso principal de 'powershell.exe'? (AAAA-MM-DD HH:MM:SS).
python vol.py -f ~/Downloads/lab/20210430-Win10Home-20H2-64bit-memdump.mem windows.pstree > ~/Downloads/lab/pstree
sed -n '3p; /powershell/p' ~/Downloads/lab/pstree
sed -n '3p; /4352/p' ~/Downloads/lab/pstree

PoC

 

  • Q9. ¿Cuál es la ruta completa y el nombre del último archivo abierto en el Bloc de notas?.
python vol.py -f ~/Downloads/lab/20210430-Win10Home-20H2-64bit-memdump.mem windows.cmdline > ~/Downloads/lab/cmdline
sed -n '3p; /notepad/p' cmdline

PoC

 

  • Q10. ¿Cuánto tiempo usó el sospechoso el navegador Brave? (hh:mm:ss).
python vol.py -f ~/Downloads/lab/20210430-Win10Home-20H2-64bit-memdump.mem windows.registry.userassist.UserAssist > ~/Downloads/lab/userassist
sed -n '3p; /Brave/p' userassist | awk -F'\t' '{print $6" - " $10}'

PoC

Referencias.

Ir atrás
Ir arriba