
Plugin de Volatility para extraer X capturas de pantalla de un volcado de memoria
El objetivo de este plugin de volatilidad es extraer una captura de pantalla de todas las ventanas X abiertas a partir de un volcado de memoria.
El plugin de volatilidad linux_xwindows realizado por Adam Bridge
(https://github.com/bridgeythegeek/linux_xwindows) extrae varios metadatos de los objetos de ventana registrados en X, que se identifican recorriendo las estructuras de datos del servidor X. Por ejemplo, para cada ventana enumera las coordenadas de la ventana, las dimensiones de ancho y alto, y el identificador de la ventana. El README de Adam contiene una buena discusión sobre estos detalles, ¡así que sugerimos leerlo si estás interesado!
Como referencia, aquí puedes encontrar una figura que representa las estructuras centrales de X y sus interdependencias:

Para extraer estas capturas de pantalla reutilizamos parte del código del servidor X.
El plugin primero vuelca los mapeos de memoria del servidor X. Estos mapeos se proporcionan como entrada a un programa en C (loader), junto con la salida del plugin de Adam. Este programa en C hace mmap (con la bandera MAP_FIXED) de los mapeos de memoria de Xorg en su propio espacio de direcciones. De esta manera recreamos el espacio de direcciones de Xorg, asegurando que no se rompa ninguna referencia entre código y datos. El loader luego llama a una función (compGetImage) contenida en el código de Xorg y guarda el resultado en un archivo. Identificamos esta función "mágica" observando cómo X atiende una solicitud de captura de pantalla durante el uso normal. Afortunadamente, esta función siempre se puede encontrar con precisión ya que struct _Screen contiene un puntero a ella.
Otra buena característica de este enfoque es que es capaz de recuperar la captura de pantalla incluso si la pantalla estaba bloqueada en el momento del volcado, ¡e incluso de ventanas ocultas detrás de otras ventanas!
Después de clonar este repositorio, compila el loader:
gcc -Wall -o loader loader.c
Para usar los plugins:
vol.py --plugins=$PWD/plugins/ --profile=XXX -f ./vbox.dmp linux_screenshot_xwindows --out-dir /tmp/xwds/
Para convertir los resultados de xwd a png:
find /tmp/xwds/ -type f -name "*.xwd" -exec convert {} {}.png \;
Recuperamos exitosamente la captura de pantalla de las siguientes configuraciones:
Ubuntu 14.04 LTS - X.Org X Server 1.15.1 (Fecha de lanzamiento: 2014-04-13)
Ubuntu 16-04 LTS - X.Org X Server 1.18.4 (Fecha de lanzamiento: 2016-07-19)
Debian 9 Testing - X.Org X Server 1.19.6 (Fecha de lanzamiento: 2017-12-20)
Kubuntu 18.04 LTS - X.Org X Server 1.19.6 (Fecha de lanzamiento: 2017-12-20)
Algunas notas importantes, pero aleatorias:
Para limitar el proceso solo a imágenes "drawable", seleccionamos en el plugin de volatilidad únicamente las imágenes con un tamaño razonable.
Esta herramienta funciona solo si Xorg utiliza renderizado por software. Esto no suele ser el caso en máquinas físicas, pero se usaba por defecto en las máquinas VirtualBox que probamos.
No olvides que estás ejecutando código extraído de un volcado de memoria. Probablemente no sea difícil para un atacante manipular el volcado y obtener ejecución de código en tu máquina. Así que toma las precauciones necesarias.
Este proyecto se completó durante un Proyecto Semestral en el otoño de 2017 en Eurecom, y fue realizado por dos estudiantes de Eurecom: Hamdi Ammar y Ahmed Mkadem. Fue supervisado por Fabio Pagani y Davide Balzarotti.