Post

Dumps de memoria RAM en Linux

Repaso y guía rapida de algunos comandos para realizar volcados de memoria RAM en linux

Dumps de memoria RAM en Linux

Diferencia entre Linux y Windows

A diferencia de las herramientas “estándar” utilizadas en windows, en linux debido a la forma en la que el hardware se comunica por el software (el kernel) hay que tener en cuenta la versión del mismo ya que a diferencia de windows este no ha ido manteniendo la misma estructura exacta ni las mismas funcionalidades.

Es por esto que realizar un dump de memoria en linux suele ser algo más delicado o que suele llevar un mayor proceso para realizarlo.

Punto de partida

  • Distribución Debian 10.9.0 de 64 bits con kernel version 4.9.0-16-amd
  • Distribución Linux kali 6.11.2-amd64 Kali 6.11.2-1kali1 (2024-10-15) x86_64 GNU/Linux
  • Herramientas de extracción de memoria: memdump, fmem, LiME y avml

En caso de ser necesario; link de descarga.

Descarga de herramientas

En este caso el link utilizado ha sido temporal para realizar la descarga.

DD (con /dev/mem)

Esta herramienta es parte de los sistemas linux y hace falta que sea instalado.
Si recordamos es la herramienta con la que se pueden realizar clonados de disco.

Aunque vamos a revisar el funcionamiento de esta herramienta para clonar la memoria ram de un linux, este método ya no es confiable en sistemas modernos debido a restricciones de seguridad.
Esto quiere decir que en versiones modernas de linux no es funcional.

1
sudo dd if=/dev/mem of=/ruta/destino/memoria.dump bs=1M*

Para ejecutar este comando es necesario ser root.

Efectivamente dd nos devuelve un error debido a que no tiene capacidad para acceder a la memoria de linux por seguridad.
Confirmamos así que “dd” está obsoleto a la hora de realizar dumps de memoria RAM.

MemoryDump(memdump)

Esta herramienta debe ser instalada antes de poder utilizarla.

1
2
3
sudo apt-get install memdump* 

sudo memdump \> /ruta/destino/memoria.dump

En este caso la herramienta memdump tampoco ha sido capaz de crear el volcado de memoria RAM ya que el tamaño del volcado generado es de 1024 mB al igual que el generado con “dd” indicando que no lo ha completado.

Fmem

Llegados a este punto lo ideal es usar una herramienta que interactúe de forma directa con el kernel del sistema operativo, de esta forma es posible “evitar” las trabas que nos impone el sistema por seguridad a la hora de acceder a la memoria RAM.

FMEM es un módulo del kernel de Linux diseñado específicamente para forense.

Funcionamiento

  1. Crea un dispositivo /dev/fmem
  2. Permite acceso directo a la memoria física
  3. Evita las restricciones de /dev/mem

Instalación

Kernel versión 4.10 o anterior

Aunque al inicio se ha proporcionado la herramienta lista para su uso en este apartado vamos a mostrar como se puede compilar nuestro propio módulo de kernel.

1
2
3
4
5
git clone https://github.com/NateBrune/fmem.git   
cd fmem   
make  
sudo insmod fmem.ko  
sudo ./run.sh

Cabe destacar que en este caso el kernel del sistema debian es anterior al 4.9 por lo que debe funcionar sin problema.

Kernel version > 6.11

En el caso del siguiente ejemplo práctico vemos como se usa un sistema kali. Si en el sistema a realizar no se puede compilar es por la necesidad de instalar las cabeceras del kernel y las herramientas necesarias para compilar.

1
sudo apt install linux-headers-$(uname \-r) build-essential

Existen versiones de fmem modificadas por internet para realizar dumps en estas versiones de kernel pero realmente (al menos hasta ahora me ha funcionado) es modificar un par de líneas en el código del archivo lkm.c

Modificación del código fuente.
  • Cambiar esta línea:
    • mem\_class \= class\_create(THIS\_MODULE, "fmem");
  • Por esta:
    • mem\_class \= class\_create("fmem");

Adicionalmente para evitar ciertos warnings en pantalla al compilar.

  • Agregamos prototipos de funciones justo después de los includes en el código.
    • void my\_unxlate\_dev\_mem\_ptr(unsigned long phys, void \*addr);
    • void my\_unxlate\_dev\_mem\_ptr(unsigned long phys, void \*addr);
    • int find\_symbols(void);

Ejecución en kali

Ahora si podremos compilar y ejecutar fmem igual que en el anterior debian.

Antes de continuar con el dump vamos a hablar sobre el mensaje “uncachable” ya que es muy interesante.

Cuando el sistema marca una región como “uncacheable”, significa que esta memoria no puede ser almacenada en la caché del CPU.

Típicamente esta memoria se usa entonces para

  • Memoria de dispositivos (memory-mapped I/O)
  • Regiones de memoria que necesitan ser accedidas directamente
  • Áreas donde se requiere consistencia inmediata de datos

El mensaje indica que FMEM ha detectado una región de memoria que comienza en la dirección 0x0c0000000 (3072MB), tiene un tamaño de 1024MB y es “uncachable” (no se puede cachear).

Esto lo muestra así FMEM porque está identificando específicamente regiones de memoria con características especiales y “no muestra” toda la memoria del sistema, solo las regiones que tienen marcadores especiales.

Si añadimos el mensaje mostrado justo antes de terminar la ejecución indica que no se olvide el marcador “count=” al realizar el dump. Idealmente FMEM está “sugiriendo” que solo existen 1024Gb de memoria no cacheable lo que suele ser más “interesante” pero realmente lo hace por versatilidad a la hora de ejecutar esta herramienta en un sistema donde pueda tener una cantidad de ram exagerada para su extracción.

Esto es una sugerencia y nosotros podemos elegir hacer un dump completo del dispositivo generado por FMEM /dev/fmem.

Clonando /dev/fmem {#clonando-/dev/fmem}

1
sudo dd if=/dev/fmem of=/ruta/dump.mem bs=1M count=?

Para el tamaño sugerido por FMEM

Para el tamaño completo de la RAM del sistema

AVML(Acquire Volatile Memory for Linux)

AVML es una herramienta desarrollada por Microsoft para la adquisición de memoria volátil en sistemas Linux.

  • Herramienta standalone (no requiere dependencias)
  • Código abierto escrito en Rust
  • Diseñada para ser rápida y confiable
  • Genera dumps en formato raw

Descarga

1
wget https://github.com/microsoft/avml/releases/download/v0.10.0/avml 

Ejecución

1
2
3
chmod \+x avml   
sudo ./avml memoria.raw *\# Sin compresión*   
sudo ./avml memoria.raw.gz *\# Con compresión*

Compilación y ejecución AVML

Ya que esta herramienta está construida bajo el lenguaje RUST será necesario instalar sus dependencias para poder compilar este programa.

Instalar RUST

  • Instalar Rust y Cargo (el gestor de paquetes de Rust)
    curl \--proto '=https' \--tlsv1.2 \-sSf https://sh.rustup.rs | sh

  • Reiniciar la shell o cargar Rust en el path
    source $HOME/.cargo/env

  • Instalar dependencias de desarrollo
    sudo apt-get install build-essential pkg-config

Clonar y compilar AVML

  • Clonar el repositorio
    1
    2
    
    git clone [https://github.com/microsoft/avml.git](https://github.com/microsoft/avml.git)  
    cd avml
    
  • Compilar en modo release
    1
    
    cargo build \--release
    

Existen otras opciones de compilación:

  • Compilación con todas las características
    1
    
    cargo build \--release \--features full
    
  • Compilación para sistemas más antiguos
    1
    
    cargo build \--release \--features legacy
    

Permisos y comprobación

LIME

LiME es un Módulo de Kernel de Linux (LKM) diseñado específicamente para adquirir memoria volátil de sistemas Linux. Es una de las herramientas más confiables para el análisis forense.

Compilación e instalación

1
2
3
git clone https://github.com/504ensicsLabs/LiME  
cd LiME/src  
make  

Uso de LIME

Lime cuenta con tres modo de salida .lime .raw .padded

1
2
3
4
5
sudo insmod ./lime-6.11.2-amd64.ko "path=/ruta/memoria.lime format=lime"  
  
sudo insmod ./lime-6.11.2-amd64.ko "path=/ruta/memoria.raw format=raw"      
   
sudo insmod ./lime-6.11.2-amd64.ko "path=/ruta/memoria.padded format=padded"

También soporta dump de memoria por red

  • En el sistema objetivo
    sudo insmod ./lime.ko "path=tcp:4444 format=lime"

  • En el sistema de análisis
    nc localhost 4444 \> memoria.lime

This post is licensed under CC BY 4.0 by the author.