-
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.