
Plugin do Volatility para extrair X capturas de tela de um dump de memória
O objetivo deste plugin do Volatility é extrair uma captura de tela de todas as janelas X abertas a partir de um dump de memória.
O plugin do Volatility linux_xwindows desenvolvido por Adam Bridge (https://github.com/bridgeythegeek/linux_xwindows) extrai vários metadados dos objetos de janela registrados no X, que são identificados percorrendo as estruturas de dados do servidor X. Por exemplo, para cada janela ele lista as coordenadas da janela, as dimensões de largura e altura, e o identificador da janela. O README de Adam tem uma boa discussão sobre esses detalhes, então sugerimos a leitura se você estiver interessado!
Como referência, aqui você pode encontrar uma figura representando as estruturas centrais do X e suas interdependências:

Para extrair essas capturas de tela, reutilizamos parte do código do servidor X.
O plugin primeiro despeja os mapeamentos de memória do servidor X. Esses mapeamentos são então fornecidos como entrada para um programa C (loader), juntamente com a saída do plugin de Adam. Este programa C faz mmap (com a flag MAP_FIXED) dos mapeamentos de memória do Xorg para seu próprio espaço de endereçamento. Desta forma, recriamos o espaço de endereçamento do Xorg, garantindo que nenhuma referência entre código e dados seja quebrada. O loader então chama uma função (compGetImage) contida no código do Xorg e salva o resultado em um arquivo. Identificamos esta função "mágica" observando como o X atende a uma solicitação de captura de tela durante o uso normal. Felizmente, esta função pode sempre ser encontrada com precisão, pois struct _Screen contém um ponteiro para ela.
Outra boa característica desta abordagem é que ela é capaz de recuperar a captura de tela mesmo se a tela estivesse bloqueada no momento do despejo, e até mesmo de janelas ocultas atrás de outras janelas!
Após clonar este repositório, compile o loader:
gcc -Wall -o loader loader.c
Para usar os plugins:
vol.py --plugins=$PWD/plugins/ --profile=XXX -f ./vbox.dmp linux_screenshot_xwindows --out-dir /tmp/xwds/
Para converter os resultados de xwd para png:
find /tmp/xwds/ -type f -name "*.xwd" -exec convert {} {}.png \;
Recuperamos com sucesso a captura de tela das seguintes configurações:
Ubuntu 14.04 LTS - X.Org X Server 1.15.1 (Release Date: 2014-04-13)
Ubuntu 16-04 LTS - X.Org X Server 1.18.4 (Release Date: 2016-07-19)
Debian 9 Testing - X.Org X Server 1.19.6 (Release Date: 2017-12-20)
Kubuntu 18.04 LTS - X.Org X Server 1.19.6 (Release Date: 2017-12-20)
Algumas notas aleatórias, mas importantes:
Para limitar o processo apenas a imagens "desenháveis", selecionamos no plugin do Volatility apenas as imagens com tamanho razoável.
Esta ferramenta funciona apenas se o Xorg usar renderização por software. Este não é geralmente o caso em máquinas físicas, mas era usado por padrão nas máquinas VirtualBox que testamos.
Não se esqueça de que você está executando, sem diferença, código extraído de um dump de memória. Provavelmente não é difícil para um atacante adulterar o dump e obter execução de código em sua máquina. Portanto, tome as precauções necessárias.
Este projeto foi concluído durante um Projeto Semestral no outono de 2017 na Eurecom, e realizado por dois estudantes da Eurecom: Hamdi Ammar e Ahmed Mkadem. Foi supervisionado por Fabio Pagani e Davide Balzarotti.