
Plugin Volatility pour extraire X captures d'écran d'un dump mémoire
L'objectif de ce plugin volatility est d'extraire une capture d'écran de toutes les fenêtres X ouvertes à partir d'un dump mémoire.
Le plugin volatility linux_xwindows réalisé par Adam Bridge (https://github.com/bridgeythegeek/linux_xwindows) extrait diverses métadonnées des objets fenêtre enregistrés dans X, qui sont identifiés en parcourant les structures de données du serveur X. Par exemple, pour chaque fenêtre, il liste les coordonnées de la fenêtre, les dimensions de largeur et hauteur, et l'identifiant de la fenêtre. Le README d'Adam contient une bonne discussion sur ces détails, donc nous suggérons de les lire si vous êtes intéressé !
À titre de référence, voici une figure représentant les structures principales de X et leurs interdépendances :

Pour extraire ces captures d'écran, nous réutilisons une partie du code du serveur X.
Le plugin commence par dumper les mappages mémoire du serveur X. Ces mappages sont ensuite donnés en entrée à un programme C (loader), ainsi que la sortie du plugin d'Adam. Ce programme C effectue un mmap (avec le flag MAP_FIXED) des mappages mémoire de Xorg dans son propre espace d'adressage. De cette manière, nous recréons l'espace d'adressage de Xorg, en garantissant qu'aucune référence entre code et données n'est brisée. Le chargeur appelle ensuite une fonction (compGetImage) contenue dans le code de Xorg et sauvegarde le résultat dans un fichier. Nous avons identifié cette fonction « magique » en observant comment X sert une requête de capture d'écran lors d'une utilisation normale. Heureusement, cette fonction peut toujours être trouvée avec précision car struct _Screen contient un pointeur vers elle.
Une autre bonne caractéristique de cette approche est qu'elle permet de récupérer la capture d'écran même si l'écran était verrouillé au moment du dump, et même des fenêtres cachées derrière d'autres fenêtres !
Après avoir cloné ce dépôt, compilez le chargeur :
gcc -Wall -o loader loader.c
Pour utiliser les plugins :
vol.py --plugins=$PWD/plugins/ --profile=XXX -f ./vbox.dmp linux_screenshot_xwindows --out-dir /tmp/xwds/
Pour convertir les résultats de xwd en png :
find /tmp/xwds/ -type f -name "*.xwd" -exec convert {} {}.png \;
Nous avons réussi à récupérer la capture d'écran à partir des configurations suivantes :
Ubuntu 14.04 LTS - X.Org X Server 1.15.1 (Date de sortie : 2014-04-13)
Ubuntu 16-04 LTS - X.Org X Server 1.18.4 (Date de sortie : 2016-07-19)
Debian 9 Testing - X.Org X Server 1.19.6 (Date de sortie : 2017-12-20)
Kubuntu 18.04 LTS - X.Org X Server 1.19.6 (Date de sortie : 2017-12-20)
Quelques notes aléatoires mais importantes :
Afin de limiter le processus aux seules images « dessinables », nous sélectionnons dans le plugin volatility uniquement les images de taille raisonnable.
Cet outil ne fonctionne *qu'*avec le rendu logiciel de Xorg. Ce n'est généralement pas le cas sur les machines physiques mais c'était utilisé par défaut sur les machines VirtualBox que nous avons testées.
N'oubliez pas que vous exécutez sans couture du code extrait d'un dump mémoire. Il n'est probablement pas difficile pour un attaquant de falsifier le dump et d'obtenir une exécution de code sur votre machine. Prenez donc les précautions nécessaires.
Ce projet a été réalisé dans le cadre d'un projet semestriel à l'automne 2017 à Eurecom, et réalisé par deux étudiants d'Eurecom : Hamdi Ammar et Ahmed Mkadem. Il a été supervisé par Fabio Pagani et Davide Balzarotti