Un volcado de memoria consiste en almacenar todo lo que está en la RAM de nuestro sistema a un fichero para poder analizarlo posteriormente.
En la RAM se almacena toda aquella información volátil (que se destruye al apagar el sistema) y que contiene información útil sobre la ejecución de los procesos en funcionamiento en nuestro sistema operativo. Ahí también se almacenan contraseñas que están en uso para desbloquear por ejemplo ficheros o particiones cifradas. Así que la opción de “tirar del cable del servidor” para mitigar el problema, puede ser el peor error cometido. ¿Como demuestras quien estaba conectado a la máquina en el momento que ocurrió el problema? ¿Qué procesos se estaban ejecutando?
Nos puede interesar realizar un volcado de memoria por ejemplo si un ransomware está en ejecución y está cifrando los datos de nuestro sistema, para localizar datos se acceso a programas y servicios, identificar fallos y problemas con un software o analizar el funcionamiento de nuestro sistema.
Hay varias formas de realizar un dump de la memoria, todas se basan en el dispositivo “/dev/mem”. La más conocida es memdump, pero en algunos sistemas ejecutar memdump > fichero.dump implica un fallo total de nuestro sistema (¡Vamos! Que se reinicia solo). En resumen: “NO HAGAS ESTO!” (y aún menos en un sistema en producción). La mejor opción si queremos exportar el contenido de “/dev/mem” es hacer uso de dd
# dd if=/dev/mem of=volcado.mem bs=1M
Si esto nos devuelve un fichero de un tamaño mucho inferior al total de RAM disponible en el sistema, es posible que esté activada una restricción del kernel.
# cat /usr/src/linux-headers-`uname -r`/.config |grep “CONFIG_STRICT_DEVMEM” CONFIG_STRICT_DEVMEM=y
En el caso que esté activada, podemos desactivarla y volver a recompilar el kernel o quizás otra opción a valorar es usar otro programa llamado LiME (Linux Memory Extractor).
LiME, es una herramienta opensource que permite la adquisición de la memoria RAM de sistemas basados en Linux. LiME trabaja a nivel de kernel. La forma de hacerlo es mediante la insercción de un módulo en el kernel de Linux (insmod). Vamos a ver como hacemos la extracción en un fichero en local del sistema o opción mucho mas recomendable, abriendo una “puerta” (puerto) para poder realizar la extracción de forma remota. Tengo LiME instalado en una máquina (carboni) y voy a realizar la extracción en este PC en el que estoy (melatonina).
Para instalar LiME he usado
root@carboni:~# git clone https://github.com/504ensicsLabs/LiME.git root@carboni:~# cd LiME/src root@carboni:~/LiME/src# make root@carboni:~/LiME/src# ls |grep amd lime-4.9.0-3-amd64.ko
Para una extracción en local
root@carboni:~/LiME/src# insmod lime-4.9.0-3-amd64.ko "path=/root/2022_06_24-memdump_carboni format=lime" root@carboni:~/LiME/src# cd root@carboni:~# ls -lh |grep memdump r-r—r-- 1 root root 7,8G jun 24 19:42 2022_06_24-memdump_carboni
Para una extracción en remoto
root@carboni:~/LiME/src# rmmod lime root@carboni:~/LiME/src# insmod lime-4.9.0-3-amd64.ko "path=tcp:444 format=lime" root@carboni:~/LiME/src# ifconfig |grep 192.168 inet 192.168.1.149 netmask 255.255.255.0 broadcast 192.168.1.255 root@melatonina:~# nc 192.168.1.149 4444 > 2022_06_24-memdump_carboni_remote root@melatonina:~# ls -lh |grep memdump -rw-r--r-- 1 root root 7,8G 24 juny 20:45 2022_06_24-memdump_carboni_remote
En el segundo volcado, cuando hacemos el insmod se va a quedar esperando (no volverá al promt del sistema) y en la otra máquina, el dump tardará en pasar lo que tarde en pasar los Gb de RAM de la máquina origen. Recuerdo que si has hecho previamente el volcado en local, será necesario “descargar” el módulo con rmmod lime
Una vez tenemos el fichero de dump, podremos analizarlo con volatility.
Volatility tiene una versión 2 y una versión 3. Para el ejemplo, vamos a hacer uso de la versión 2 que funciona con python2.7. La 3 funciona con python3 pero me ha dado algunos problemas (algunas veces la última versión no es la mejor al no estar disponible tanta documentación -como es el caso-, además, si alguna cosa no funciona en una máquina, prueba con otra con una instalación “limpia”).
Para instalar volatility
root@melatonina:~# git clone https://github.com/volatilityfoundation/volatility.git root@melatonina:~# chmod +x volatility/vol.py root@melatonina:~# mv volatility /opt/ root@melatonina:~# ln -s /opt/volatility/vol.py /usr/bin/vol.py root@melatonina:~# apt -y install python2.7 root@melatonina:~# ln -s /usr/bin/python2.7 /usr/bin/python root@melatonina:~# pip install distorm3==3.4.4
Para comprobar que funciona y ver los módulos disponibles para Linux, usar
root@melatonina:~# vol.py --info |grep linux
Para ver información sobre la imagen del volcado de memoria (en el dump de casi 8Gb va a tomar un rato a analizar todo el fichero)
root@melatonina:~# vol.py imageinfo -f 2022_06_24-memdump_carboni_remote
Ahora, para analizar el volcado, será necesario crear un perfil dwarf del sistema el cuál hemos hecho el volcado (carboni). Por ello, nos vamos al directorio de herramientas de volatility y ejecutamos lo siguiente
root@carboni:~# apt -y install dwarfdump root@carboni:~# cd /opt/volatility/tools/linux root@carboni:/opt/volatility/tools/linux# make root@carboni:/opt/volatility/tools/linux# zip -j $(lsb_release -i -s)_$(uname -r)_profile.zip module.dwarf /boot/System.map-$(uname -r) root@carboni:~# mv Debian_5.10.0-14-amd64_profile.zip /opt/volatility/volatility/plugins/overlays/linux/
Para inspeccionar que se ha cargado el profile haremos uso de la opción –info
root@carboni:~# ./vol.py --info |grep Debian LinuxDebian_4_9_0-3-amd64_profilex64 – A Profile for Linux Debian_4.9.0-3-amd64_profile x64
Para ver los procesos que estaban en ejecución mientras se estaba realizando el dump de la memoria (recuerda usar vol.py –info |grep linux para visualizar e inspeccionar los módulos disponibles)
root@carboni:~# vol.py --profile=LinuxDebian_4_9_0-3-amd64_profilex64 -f 2022_06_24-memdump_carboni linux_pslist
A continuación muestro varias capturas de pantalla de cosas interesantes que podemos encontrar al analizar el dump de la memoria.
Referencias
Volcado de memoria RAM en Linux Lime
Como analizo un volcado de memoria en Linux?
Linux memory analysis, how to start and what you need to know
Volatility download
Análisis de memoria RAM en Ubuntu 20.10 con LiME
Volatility Memory Samples