[FCSC 2019] - 3615 Incident (1/3)
Introduction 📌
Une victime de plus tombée sous le coup d’un rançongiciel. Le paiement de la rançon n’est pas envisagée vu le montant demandé. Nous sommes appelés pour essayer de restaurer les fichiers chiffrés. La première partie de ce challenge requiert de trouver :
- le nom du fichier exécutable de ce rançongiciel,
- son identifiant de processus (PID),
- le SHA1 du nom du fichier
flag.docx
une fois chiffré.
La réponse attendue au format : ECSC{nom_du_rançongiciel.exe:pid:sha1}
.
Le fichier mem.dmp.tar.xz
nous est fourni. Il s’agit d’une image mémoire de l’ordinateur de la victime. Concrètement, celle-ci correspond au contenu de la mémoire volatile (autrement dit la RAM) au moment de l’acquisition et nous allons voir que cela se révèle être une excellente source d’informations pour de l’investigation numérique.
1. À la recherche du rançongiciel 🔎
Volatility3
Pour analyser une image mémoire, plusieurs outils s’offrent à nous. Dans le cadre de ce challenge, nous utiliserons Volatility3
et grep
(plus utile qu’il n’y paraît :p).
Volatility3 est un outil open-source permettant d’extraire des informations d’un dump mémoire en provenance d’un système sous Windows, MacOS ou Linux par le biais de plugins.
L’installation est très rapide :
|
|
Et voilà, l’outil est prêt à être utilisé. 😄
Identification du système d’exploitation
En premier lieu, il est nécessaire de connaître de quel système d’exploitation provient le dump. Pour ce faire, nous pouvons utiliser grep
dans un premier temps en filtrant sur des termes comme Windows
, Linux version
, etc.
|
|
Compte-tenu du résultat, il semblerait que l’image mémoire provienne d’un système sous Windows
. Pour s’en assurer, nous pouvons utiliser le plugin windows.info
:
(-f
est l’option permetant de spécifier le chemin du dump mémoire.)
|
|
Il semblerait donc que le système d’exploitation soit :
- un Windows 10 (champ
NtMajorVersion
), - architecture 64 bits (champ
Is64Bit
àtrue
), - build 10586 (champ
Major/Minor
).
Maintenant que nous détenons ces informations, nous allons pouvoir utiliser les bons plugins.
Analyse des processus
Pour pouvoir trouver le nom du fichier exécutable du rançongiciel, nous pouvons commencer par lister les processus en cours d’exécution à l’aide du plugin windows.pstree
. Il permet d’en dresser une arborescence, montrant les processus et leur parent, leur identifiant de processus (PID), leur date de création, etc.
|
|
(Ici, j’ai volontairement enlevé la plupart des résultats à des fins de lisibilité)
Après analyse, nous constatons plusieurs processus qui semblent légitimes (firefox.exe
, notepad.exe
, OneDrive.exe
, …). Cependant, l’un d’entre eux semble suspect. Il s’agit d’assistance.exe
ayant pour PID 5208
.
|
|
En effet, ce n’est pas un processus que nous observons habituellement. Pour en avoir le coeur net, analysons-le plus en profondeur.
Analyse de l’exécutable assistance.exe
Afin d’en apprendre plus sur assistance.exe
, nous devons d’abord l’extraire du dump mémoire. Pour ce faire, nous pouvons utiliser différentes méthodes :
- L’extraire à l’aide de son
PID
. Il suffit ensuite d’utiliser le pluginwindows.dumpfiles
avec l’option--pid <PID>
. - Trouver l’emplacement de l’exécutable sur l’OS et l’extraire par le biais de l’adresse virtuelle associée.
La première méthode étant plus commune (et pratique), nous allons donc utiliser la deuxième. :)
Pour scanner les fichiers de l’image mémoire, nous pouvons utiliser le plugin windows.filescan
. De plus, comme nous connaissons le nom de l’exécutable, nous pouvons filtrer à l’aide de grep
.
|
|
Nous constatons qu’il possède plusieurs adresses différentes. Nous pouvons prendre l’une de celles-ci. Ensuite, nous devons dump l’exécutable. Ici, c’est le plugin windows.dumpfiles
que nous utilisons. Il est accompagné de l’option --virtaddr <ADDR>
qui permet de spécifier l’adresse virtuelle précécemment trouvée.
|
|
(l’option -o
permet de spécifier le répertoire de destination pour l’exécutable)
Maintenant que nous disposons de l’exécutable, vérifions rapidement qu’il en soit bien un à l’aide de la commande file
.
|
|
Tout semble correct ! A présent, vérifions si c’est malware. Si tel est le cas, il est probable qu’il soit reconnu par VirusTotal. Nous pouvons donc y télécharger l’exécutable.
Visiblement, il s’agirait bien d’un malware appartenant à la famille des rançongiciels. Approfondissons légèrement l’analyse en l’ouvrant dans PEStudio
. C’est un outil qui permet de rapidement trouver des artifacts (informations de valeur pour l’investigation) au sein d’un exécutable.
En naviguant dans la section strings
, nous remarquons la présence d’un repo Github : https://github.com/mauri870/ransomware. Il contient vraisemblablement le code source du rançongiciel. Quelle aubaine !
À ce stade du challenge, nous avons donc les 2/3 du flag : ECSC{assistance.exe:5208
.
- le nom du fichier exécutable de ce rançongiciel,
- son identifiant de processus (PID),
- le SHA1 du nom du fichier
flag.docx
une fois chiffré.
Il ne manque plus qu’à trouver le dernier élément de cette liste. Nous allons pouvoir utiliser le code source qui est à présent à notre disposition.
2. Recherche de flag.docx
🧭
Rapide analyse du code source
Pour comprendre comment le chiffrement fonctionne, nous devons analyser le fichier ransomware.go situé dans /cmd/ransomware
. À l’intérieur, nous retrouvons la fonction encryptFiles()
qui, comme son nom l’indique, est en charge du chiffrement des fichiers.
(Celle-ci étant de taille conséquente, je l’ai raccourci à la partie intéressante (de la ligne 256 à 268)).
|
|
Nous pouvons constater que cette fonction renomme les fichiers après les avoir chiffrés. Le nom de substitution est le nom du fichier original encodé en base64
auquel on y ajoute une extension définie par l’attaquant dans le fichier common.go (ligne 99
).
|
|
Localisation du fichier chiffré dans le dump mémoire
Nous savons à présent que le nom hypothétique de flag.docx
après chiffrement est celui-ci encodé en base64
. Nous pouvons obtenir la chaîne de caractère de la manière suivante :
|
|
Nous pouvons désormais chercher s’il existe un fichier ayant le nom ZmxhZy5kb2N4
dans le dump mémoire. Pour ce faire, nous allons utiliser le plugin windows.filescan
et filtrant sur le nom de fichier à l’aide de grep
.
|
|
Effectivement, le fichier existe bel et bien. Par ailleurs, nous remarquons que l’extension de fichier n’est plus .encrypted
mais .chiffré
. Nous n’avons plus qu’à calculer le SHA1
du nom de fichier complet à l’aide de sha1sum
:
|
|
Nous obtenons ainsi le dernier morceau du flag : :c9a12b109a58361ff1381fceccdcdcade3ec595a}
et pouvons ainsi cocher le dernier élément de notre liste.
- le SHA1 du nom du fichier
flag.docx
une fois chiffré.
3. Flag 🚩
Grâce à notre analyse, nous obtenons le flag suivant : ECSC{assistance.exe:5208:c9a12b109a58361ff1381fceccdcdcade3ec595a}
Cela marque la conclusion de cette première partie du challenge 3615 Incident
. J’espère que ce writeup vous aura permis de comprendre les tenants et les aboutissants de cette épreuve. Bon courage pour la deuxième partie ! :)