Dans ma quête d’apprentissage du forensique, je me suis frotté au challenge annuel de cybersécurité français organisé par l’ANSSI. C’était la première fois que je participais à celui-ci, j’y suis donc allé tranquille en résolvant les épreuves qui me feraient apprendre le plus de choses.
Etant totalement nouveau dans le domaine du forensique, j’ai appris sur le tas grâce à ce challenge, et je me suis dit qu’il était bon de partager le challenge que j’ai pris le plus de plaisir à résoudre.
Objectif du challenge
Vous étiez en train de consulter vos belles photos de chats quand patatra, votre fichier super secret sur votre Bureau change d’extension et devient illisible…
Vous faites une capture mémoire pour comprendre ce qu’il s’est passé, dans le but de récupérer ce précieux fichier.
Selon l’intitulé, nous avons visiblement affaire à un ransomware qui aurait chiffré un fichier précis sur le bureau.
Grace à la capture mémoire fournie, nous allons remonter cette piste et trouver un moyen de récupérer ce fichier.
Trouver le malware
La première étape consiste à trouver le malware dans la capture mémoire. Nous allons analyser celle-ci grâce à l’outil d’analyse mémoire volatility3.
J’ai commencé par la partie compliquée. J’ai analysé les handles vers le bureau avec l’option windows.handles. pour faire simple, en programmation Windows, un handle est un objet retourné par une fonction permettant d’interagir avec des objets Windows (programmes, fichiers, clés de registre..), quand un processus agit sur un de ces objets, il obtient d’abord un handle sur celui-ci.
Comme nous savons que le processus agit sur le bureau, il est naturel de penser qu’un handle vers le bureau doit être associé à un processus particulier :
|
|
Le seul processus “non système” ayant un handle sur le bureau est svchost.exe avec un PID de 5540.
Maintenant, la méthode plus simple :
|
|
On peut remarquer que svchost.exe a été créé depuis un processus utilisateur (VboxTray) descendant d’explorer.exe, ce qui est suspicieux.
Analyse du malware
Une fois ce processus identifié, il convient de l’extraire de la mémoire pour l’analyser. En effet, la plupart des processus en cours d’exécution lors d’une capture mémoire conservent leur fichier d’exécution à l’intérieur de celle-ci :
|
|
Cette première fonction génère 64 bytes aléatoires et les inscrit dans un fichier à chaque exécution. le fichier contenant ces bytes se trouvera dans “C:\Windows\Temp\MsCmdRun%d.log” où %d sera remplacé par le nombre correspondant à l’exécution.
if ( nbytes ) { op_counter = 0i64; do { *(Heap + op_counter) ^= execution_counter ^ *(bytes + op_counter); ++op_counter; } while ( nbytes != op_counter ); v12 = NumberOfBytesRead[0]; } if ( SetFilePointer(FileW, -v12, 0i64, 1u) == -1 || !WriteFile(FileW, Heap, NumberOfBytesRead[0], &NumberOfBytesWritten, 0i64) || NumberOfBytesRead[0] != NumberOfBytesWritten ) { goto LABEL_12; }
Cet extrait de fonction est responsable du chiffrement du fichier. C’est ici que nous comprenons la logique de chiffrement de ce malware. Elle est simple, les bytes générés aléatoirement servent à XORer les bytes du fichier initial, en plus du numéro d’éxecution.
Le programme scanne le bureau en recherche de tout fichier possédant l’exécution .fcsc. Si il n’en trouve pas, il incrémente un compteur et genère de nouveaux bytes aléatoires.
Nous savons que le XOR est une opération réversible. Ainsi, en ayant le compteur d’exécution, le fichier des bytes aléatoire et le fichier chiffré, nous pouvons retrouver le fichier originel.
Reste encore à récupérer ces fichiers..
Récupération des fichiers
Volatility3 contient une commande permettant de lister les fichiers présents en mémoire :
|
|
Voici les fichiers de bytes aléatoires présents en mémoire. Ce n’est pas suffisant car nous ne savons pas lequel a été utilisé pour chiffrer notre fichier. De plus, la mémoire ne contient pas le fichier chiffré présent sur le bureau.
C’est là qu’entre en jeu la MFT (Master File Table), pour faire simple, dans un système de fichiers NTFS, il existe un fichier recensant les informations de chaque fichier présent sur le disque (taille, dernière modification, adresse dans le disque), permettant ainsi à Windows de le trouver plus facilement. En revanche, cette table stocke également le contenu des fichiers de petite taille, et une bonne partie est disponible en mémoire.
Volatitility3 ne propose pas encore une analyse poussée de la table MFT, il va ainsi falloir se rabattre sur volatility2 :
|
|
Je trouve dans la table MFT le fichier chiffré. On sait qu’un fichier de bytes aléatoires du nom de MsCmdRun est créé avant d’altérer le fichier flag. Ainsi, je cherche dans cette table un fichier MsCmdRun qui aurait la date de création/modification la plus proche de celle du flag :
|
|
Avec ces deux fichiers, il ne me reste plus qu’à créer un script permettant de déchiffrer le flag.
Au départ, je pensais que le compteur d’exécution s’incrémentait à chaque fichier chiffré. Etant le seul fichier chiffré, je me suis mis en tête que le compteur correspondait à 0. Un XOR par 0 n’ayant pas d’intérêt, j’ai omis cette opération :
|
|
Le flag étant encore chiffré, j’ai cependant remarqué que le début de celui-ci m’était semblable, en effet, les flags de cette compétition commençaient par FCSC, on remarque la présence de 2 M correspondant aux deux C de l’entête du flag. Il me restait donc à trouver la valeur qui me permettrait d’obtenir C en XORant M par plusieurs valeurs. C’est la faiblesse des algorithmes XOR lorsqu’un morceau de la chaîne initiale est connue, il est possible de bruteforcer celle-ci afin d’obtenir la chaîne finale.
La valeur 14 permettait d’afficher le flag. C’est ainsi que j’ai remarqué l’importance du compteur d’exécution, et que celui-ci était inscrit dans le fichier de bytes aléatoires (MsCmdRun14)
|
|
Conclusion
Ainsi s’achève cette épreuve de forensics. Elle était très intéressante et m’en a fait apprendre énormément sur l’analyse mémoire et d’autres internals de Windows. Mes compétences en reverse engineering m’ont permis de passer aisément l’épreuve d’analyse du malware, là où d’autres ont sûrement échoué dû à ce manque de compétences.