samedi 20 juin 2020

Analyse par un minidump d'un processus

I.    Introduction

L'intérêt d'un minidump est de disposer le l'ensemble d'une photo de l'ensembles des éléments en mémoire d'un processus en exécution. que ce soit le TEB, PEB , les handles utilisés par le processus. Ainsi que tout la mémoire du processus.

cela permet de faire des recherches dans le processus et de récupérer tous ce qu'il peut utiliser ou stocker pour son fonctionnement

Exemple qui revient souvent et l'utilisation de ce format de fichier par Mimikatz

Rappelons brièvement le principe utilisé par Mimikatz , effectue un Minidump à distance sur machine sur le processus lsass (  Local Security Authority SubSystem )

Car c’est dans ce processus que se trouvent les différents ou SSP(Security Service Providers) gérant les différents types d’authentification. Pour des raisons pratiques, les identifiants entrés par un utilisateur sont très souvent enregistrés dans l’un de ces blocs pour qu’il n’ait pas à les entrer une nouvelle fois quelques secondes ou minutes plus tard.

En effectuant un minidump sur ce processus , Mimikatz obtient une photo mémoire du processus. Et donc tous les éléments. Cela lui permet ensuite extraire de la mémoire les hachs NTLM des credentials ou tous simplement de transmettre la chaîne de hachage exacte à l’ordinateur cible pour se connecter. les hackeurs n’ont même pas besoin de craquer le mot de passe, il leur suffit d’utiliser la chaîne de hachage pour accéder à la cible.

Mais ce n'est pas cela qui nous intéresse ici, nous souhaitons expliquer le format des minidump pour permettre son utilisation dans l'analyse de Malware et l'extraction d'information des processus analysé. Par exemple cela permet d'avoir le code finale après dépaquetage en mémoire.


II.    Dumper la mémoire d'un processus

 

Il existe plusieurs techniques permettant de dumper le processus.

La plus simple et graphiquement, on peut passer par le gestionnaire de tâches afin de créer un "fichier de vidage":

Ce qui créera le fichier mindump dans le répertoire

c:\\Users\%USERNAME%\AppData\local\Temp

Nous pouvons également crée le minidump via l'outil "procdump.exe" de SysInternals.

On pourra obtenir le minidump d'un processus au travers de son PID de cette manière:

procdump.exe -ma <PID> C:\MyDumpSample

dans note exemple cela donne comme le pid de notre processus est 4916 pour le "simple2.exe"

procdump.exe -ma 4916 C:\MyDumpSample

Un vidage peut également être créé à l'aide de l'api MiniDumpWriteDump

Vous trouverez plusieurs exemples de code en C++ sur le web. Nous mettons quelques liens

http://ntcoder.com/bab/2014/10/14/how-to-create-full-memory-dumps-using-minidumpwritedump/

https://ired.team/offensive-security/credential-access-and-credential-dumping/dumping-lsass-passwords-without-mimikatz-minidumpwritedump-av-signature-bypass

 Nous avons également une tools perso (EzMiniDumpCreator.exe) permettant d'effectuer la création de minidump soit en pointant le programme via une cible comme Spy++, soit en sélectionnant via la liste des processus en cours.

Dans notre exemple le processus ciblé est sample2.exe qui est une boite de dialogue écrit en assembleur via MASM32. Nous avons prise ce processus car il est épuré au maximum et donc l'explication sera plus simple pour la recherche des blocs mémoire et la structuration sera plus réduite dans le Minidump.


Vous pouvez aussi effectué un minidump sans passer par un programme tiers sur une machine cible.

Car comme le gestionnaire de tâches par défaut à la fonctionnalité pour effectuer un vidage de processus. Elle est accessible via sa dll  (comscvs.dll ). Dans cette dll , il y a la fonction exporté "MiniDump"

Note : l'appel de la fonction exportée MiniDump de comsvcs.dll, elle même ne fait que appeller l'API  "MiniDumpWriteDump" utilisé par les outils cité.

Ce qui rend cette technique comscvs.dll pratique, c'est qu'un vidage peut être créé directement à partir de la ligne de commande, sans avoir à cliquer sur les contrôles de l'interface graphique du gestionnaire de tache et surtout ne nécessite pas d'outil présent sur le poste.

il sera aussi possible d'effectuer un dump mémoire via la DLL comsvcs.dll:

rundll32.exe c:\windows\System32\comsvcs.dll, MiniDump <PID>  C:\\file.dmp full

Dans notre exemple cela donne ma ligne de commande suivant:

 

rundll32.exe c:\\windows\\System32\\comsvcs.dll, MiniDump 4916 C:\\MyDumpSample\\Sample2.dmp full

 


Maintenant que vous pouvez effectué des minidump, nous allons rentré dans la partie intéressante.

III.    Lecture d'un minidump et Analyse

Nous disposons maintenant d'un dump valide de la mémoire du processus sample2.exe

Vous pouvez utiliser l'outil "Minidump Explorer" qui est disponible en téléchargement à l'url suivant: 

https://archive.codeplex.com/?p=minidumps

Nous avons passer notre mindump crée de simple2.exe via cette outil. Il permet de voir la structure du fichier. Vous retrouvez les informations sur la pile en mémoire , la pile d'exécution et les threads

ainsi que le code assembleur et les pages mémoire ou les informations sur les modules

Il y a également le TEB et le PEB du processus.

Voici une capture écran montrant la partie des page mémoire inclus dans notre MiniDump avec l'outil












Il existe d'autre tools comme "BlueScreenView" de nirsoft , il est disponible à l'url suivante:

https://www.nirsoft.net/utils/blue_screen_view.html

















Nous avons notre propre tools d'analyse des MiniDump "EzMiniDumpAnalyzer" , cette outil avait été conçu pour permettre d'extraire le code assembleur après dépaquetage du code par le malware.

Il permet aussi de disposer des chaînes en mémoire.

IV.    Structure d'un Minidump

 Le format du fichier minidump est composant en premier d'une structure Header qui est suivi par  N structures décrivant la localisation des différentes structure possible référencent les données contenues. Chaque structure décrit les éléments propre et aussi l'emplacement du bloc de data le correspondant dans le fichier au travers d'un offset de démarrage de la zone

Nous avons crée une représentation graphique du fichier .dmp en dessous:


Tout d'abord, les 32 premiers octets du fichier sont l'en-tête du fichier Minidump.

Il contient l'identification permettant propre au fichier minidump, la version du format, la somme de contrôle, l'horodatage et certains signes. La structure des données est la suivante:

typedef struct _MINIDUMP_HEADER {
  DWORD Signature;
  DWORD Version;
  DWORD NumberOfStreams;
  DWORD StreamDirectoryRva;   //RVA (relative virtual address)
  DWORD CheckSum;
  union {
    DWORD Reserved;
    DWORD TimeDateStamp;
  };
  DWORD64 Flags;
} MINIDUMP_HEADER, *PMINIDUMP_HEADER;

Nous avons également la représentation en mode TreeView du fichier au travers notre outils

Cela vous permet de voir la partie signature et également la date décodé de la prise du dump














Nous allons nous intéressé à la partie mémoire contenu dans le dump. Cela permet par exemple d'avoir le code assembleur après qu'il est subit le dépaquetage en mémoire.

Dans notre exemple étant un programme basic, il y a pas de packer. 

On peut quand même voir le parcours dans la mémoire du dump de notre Sample2.exe.  Le programme étant chargé à l'addresse 0x00400000 et la section ".text" en 0x00401000













Nous avons donc bien dans le dump le code et les variables ou les chaînes de texte





























Qui représente bien les chaînes du binaire comme on le voir avec notre outils de lecture mémoire d'un processus en cours.
















V.    L'utilisation dans le monde des malwares

Nous venons de voir que au travers d'un minidump d'un processus, nous avons une photo de l'ensemble du processus . C'est grâce que l'on peu extraire des credentials comme différent logiciel font "Mimikatz" ou sa variante python "pypykatz" qui à partir des blocs mémoires contenu dans le dump du processus lsass ( Local Security Authority SubSystem ) extraire les identifiant des utilisateurs connectés.

Mais au final, ce n'est que de l'extraction des informations de la mémoire qui peu être effectué également par un programme malveillant en intégrant dans son code la mécanique cité sans avoir besoin de passer par un dump. L'important étant de connaître ou ce situe les données en mémoire et comme les rendre lisible ou exploitable

Tous simplement par force de sa notoriété, les processus comme Minikatz ou même la demande de dump sur le processus lsass fait avec l'outil microsoft "ProcDump" son vu comme des comportement anormal par Windows Defender ou MalwareByte et le résultat et qu'il supprime le fichier générer du minidump.

le code source étant disponible de Mimikatz et semble évident qu'il sera porté dans des malware ou des parties conceptuel comme la recherche des secrets

Il devient donc évidant que les programmes doivent etre attentif à la neutralisation des informations persistante en mémoire lors de leurs codages. Cela ne ce limite pas uniquement à l'authentification primaire. Mais également identique pour es authentification secondaire au sein d'application métier ou sensible.

VI.    Conclusions

 

Il est intéressant de comprendre le format d'un Minidump, car il permet également de voir les éléments persistant en mémoire qui ne devrait pas resté présent

et donc les programmateurs du logiciel cible. On des bugs de sécurité par le fait de la persistance d'information qui ne devrait pas l'être s'il elle ne sont plus neccessaire après utilisation par le logiciel concerné.

En générale, après utilisation d'une donnée critique ou sensible celle-ci devrait être supprimer de la mémoire. Mais cela est à la charge du développeur qui n'est pas toujours au fait des mécanismes pour mettre celle-ci en évidence dans l'analyse mémoire des processus.

l'exemple de Mimikatz est parlant de lui-même, il ce retrouve utilisé par des malware comme NotPetya

NotPetya utilise Mimikatz pour extraits des informations d'identifications du processus lsass.exe. Après l'extraction, les informations d'identification sont transmises à PsExec ou à WMIC pour la propagation du malware au sein du réseau.

Il est assez, intéressant de croisé les méthodes et les techniques cela pour cartographier les outils du monde du pentest avec les malwares.

Nous espérons que ce petit exemple sur le stockage mémoire des processus dans un format standard le Minidump, vous a permis de comprendre l'intérêt pour l'analyse des malwares et aussi l'analyse des logiciels que vous développé pour mieux ciblé les informations qu'il ne devrait pas être en mémoire en persistant.

Car des que vous avez cette photo de la mémoire d'un malware, votre analyse sera plus simple. Et il est bon de construire ses propres outils et pas ce contenté des tools existantes pour scanné les blocs mémoires ou effectué recherche de séquence particulière. Cela permet aussi d'automatisé la recherche automatique par des jeux de test d'information qu'il ne devrait pas être persistante.