• Extraer archivos de un volcado de memoria RAM con Volatility2

    Cuando un sistema operativo accede y utiliza archivos, estos se almacenan en la memoria caché para mejorar el rendimiento. Desde una perspectiva forense, la caché de memoria se convierte en una fuente valiosa, ya que permite recuperar archivos correctamente mapeados en dicha memoria, evitando los problemas asociados con la extracción de archivos mediante técnicas como el carving. Bien es cierto que puede que dichos archivos pueden no estar completamente cargados por razones de rendimiento, y las secciones faltantes pueden estar rellenadas con ceros pero aún así, es una fuente de información muy valiosa desde el punto de vista de la forénsica informática.

    Para realizar esta tarea, volatility2 ofrece el argumento dumpfiles. Esta es su forma de uso:

    DEFINICIÓN DE CONSTANTES PREVIAS

    Antes, vamos a definir cuatro constantes:

    • La ruta de vol.py.
    • La ruta al archivo del dump de memoria.
    • El perfil a usar.
    • La ruta a la carpeta donde guardar los archivos extraídos.

    Lo hacemos con:

    cRutaAVolatility2="$HOME/HackingTools/Forensics/volatility2/vol.py"
    cRutaAlArchivoDeDump="$HOME/Descargas/memory.dump"
    cPerfilAconsejado='Win2016x64_14393'
    cCarpetaDondeGuardar="$HOME/Descargas/Archivos"

    Y, ahora sí, procedemos con la extracción:

    MEDIANTE EXPRESIONES REGULARES

    Podemos encontrar archivos en el volcado de RAM mediante expresiones regulares usando el parámetro -r:

    Archivos de imágenes:

    "$cRutaAVolatility2" -f "$cRutaAlArchivoDeDump" --profile="$cPerfilAconsejado" dumpfiles -r '\.(jpg|jpeg|png|gif|bmp|webp)$' -D "$cCarpetaDondeGuardar"

    Archivos de scripts:

    "$cRutaAVolatility2" -f "$cRutaAlArchivoDeDump" --profile="$cPerfilAconsejado" dumpfiles -r '\.(bat|ps1|py|sh)$' -D "$cCarpetaDondeGuardar" -n

    Archivos de documentos:

    "$cRutaAVolatility2" -f "$cRutaAlArchivoDeDump" --profile="$cPerfilAconsejado" dumpfiles -r '\.(doc|docx|odt|xls|xlsx|ods|pdf)$' -D "$cCarpetaDondeGuardar" -n

    Archivos de logs y eventos:

    "$cRutaAVolatility2" -f "$cRutaAlArchivoDeDump" --profile="$cPerfilAconsejado" dumpfiles -r '\.(log|evtx)$' -D "$cCarpetaDondeGuardar" -n

    Archivos ejecutables:

    "$cRutaAVolatility2" -f "$cRutaAlArchivoDeDump" --profile="$cPerfilAconsejado" dumpfiles -r '\.(com|exe|dll|sys|msimui)$' -D "$cCarpetaDondeGuardar" -n

    Un archivo específico:

    "$cRutaAVolatility2" -f "$cRutaAlArchivoDeDump" --profile="$cPerfilAconsejado" dumpfiles -r 'Instrucciones\.txt' -D "$cCarpetaDondeGuardar" -n

    Archivos de dentro de la carpeta Users:

    "$cRutaAVolatility2" -f "$cRutaAlArchivoDeDump" --profile="$cPerfilAconsejado" dumpfiles -r '\\Users\\' -D "$cCarpetaDondeGuardar" -n

    Archivos de dentro de la carpeta Users\wolverine:

    "$cRutaAVolatility2" -f "$cRutaAlArchivoDeDump" --profile="$cPerfilAconsejado" dumpfiles -r '\\Users\\wolverine\\' -D "$cCarpetaDondeGuardar" -n

    Archivos de dentro de la carpeta Users\pepe o \Users\PEPE:

    "$cRutaAVolatility2" -f "$cRutaAlArchivoDeDump" --profile="$cPerfilAconsejado" dumpfiles -r '\\Users\\pEpE\\' -i -D "$cCarpetaDondeGuardar" -n

    Archivos de dentro de la carpeta Users\Volverine\Downloads o \users\wolverine\downloads:

    "$cRutaAVolatility2" -f "$cRutaAlArchivoDeDump" --profile="$cPerfilAconsejado" dumpfiles -r '\\Users\\wolverine\\downloads' -i -D "$cCarpetaDondeGuardar" -n

    Archivos de dentro de la carpeta Users\Volverine\Downloads y Users\Volverine\Desktop:

    "$cRutaAVolatility2" -f "$cRutaAlArchivoDeDump" --profile="$cPerfilAconsejado" dumpfiles -r -r '\\Users\\wolverine\\(Downloads|Desktop)\\' -i -D "$cCarpetaDondeGuardar" -n

    Todos los archivos del disco:

    "$cRutaAVolatility2" -f "$cRutaAlArchivoDeDump" --profile="$cPerfilAconsejado" dumpfiles -r '\..+$' -D "$cCarpetaDondeGuardar" -n

    La opción -n se pone para que, además de asignar al nombre de archivos el offset de memoria donde está el archivo, anexe también el nombre de archivo con el que está en el disco.

    La opción -i se usa para que no distinga entre minúsculas y mayúsculas, como ocurre cuando usamos grep.

    CONOCIENDO EL NÚMERO DE PROCESO

    Podemos extraer todos los archivos abiertos por un proceso específico conociendo el número del proceso. Para ello, primer listamos todos los procesos en ejecución, con:

    "$cRutaAVolatility2" -f "$cRutaAlArchivoDeDump" --profile="$cPerfilAconsejado" pslist | sort -k9,10

    Con «sort -k9,10» ordenamos cronológicamente los procesos basándonos en la columna 9, primero y en la 10, después.

    Vemos una salida como esta:

    Volatility Foundation Volatility Framework 2.6.1
    Offset(V)          Name                    PID   PPID   Thds     Hnds   Sess  Wow64 Start                          Exit                          
    ------------------ -------------------- ------ ------ ------ -------- ------ ------ ------------------------------ ------------------------------
    0xffffc4861bfad080 dllhost.exe            4300    676      6        0      1      0 2024-09-04 15:01:58 UTC+0000
    0xffffc48618f1d080 MpCmdRun.exe           3492   4944      6        0      0      0 2024-09-04 15:06:34 UTC+0000
    0xffffc48614d58080 MobaXterm_Pers         6372   2200      2        0      1      1 2024-09-04 15:40:11 UTC+0000
    0xffffc486186f3080 msedge.exe             5712   3704      9        0      1      0 2024-09-04 15:41:32 UTC+0000
    0xffffc48613f2c780 XWin_MobaX.exe         3512   6372      5        0      1      1 2024-09-04 15:41:43 UTC+0000
    0xffffc4861ad9d780 SkypeHost.exe          8308    676     11        0      1      0 2024-09-04 15:42:13 UTC+0000
    ...

    Luego, si por ejemplo queremos extraer los archivos que tiene abiertos el proceso 6372, hacemos:

    "$cRutaAVolatility2" -f "$cRutaAlArchivoDeDump" --profile="$cPerfilAconsejado" dumpfiles -p 6372 -D "$cCarpetaDondeGuardar" -n

    También podemos descargar todos los archivos que tiene abiertos el proceso padre del 6372 (también extraerá todos los del 6372):

    "$cRutaAVolatility2" -f "$cRutaAlArchivoDeDump" --profile="$cPerfilAconsejado" dumpfiles -p 2200 -D "$cCarpetaDondeGuardar" -n

    Como podemos observar, los archivos se guardan con nombres que respetan las siguientes nomenclaturas:

    • file.[PID].[OffsetVirtual].[NombreCompletoDeArchivo].img
    • file.[PID].[OffsetVirtual].[NombreCompletoDeArchivo].dat
    • file.[PID].[OffsetVirtual].[NombreCompletoDeArchivo].vacb

    Qué significa cada extensión

    • .dat → DataSectionObject
      Son datos del archivo mapeados en memoria.
      Normalmente es el contenido real del fichero.
      Es el más útil para recuperar archivos.
      Si queremos abrir el archivo extraído: usa el .dat.
    • .img → ImageSectionObject
      El archivo está mapeado como imagen ejecutable (EXE, DLL, SYS).
      Contiene el binario cargado por el sistema.
      Puede estar:
      – reubicado.
      – sin cabeceras completas.
      – o con secciones ya en memoria.
      Es útil para análisis de malware/binarios en ejecución.
    • .vacb → SharedCacheMap / VACB
      Es un volcado de la caché de Windows (Cache Manager).
      VACB = Virtual Address Control Block.
      Contiene páginas cacheadas del archivo, a veces:
      – parciales
      – fragmentadas
      – no contiguas

    ORDENAR Y LIMPIAR NOMBRES DE ARCHIVOS

    Si queremos limpiar los archivos, podemos ejecutar estos dos scripts:

    curl -sL https://raw.githubusercontent.com/nipegun/dfir-scripts/refs/heads/main/DFIRWindows/Artefactos-ArchivosExtraidos-Reubicar.sh | bash -s [CarpetaConArchivosExtraidos]
    curl -sL https://raw.githubusercontent.com/nipegun/dfir-scripts/refs/heads/main/DFIRWindows/Artefactos-ArchivosExtraidos-Reubicar.sh | bash -s [CarpetaBase]

    El primer script reubica los archivos en subcarpetas dat, img y vacb.

    El segundo script quita del nombre de los archivos el texto correspondiente al offset y todo lo anterior.

    Los comentarios están cerrados.