I. Introduction
Nommé Dyreza ou Dyre ou
réapparu par des souches de son code
dans le malware "TrickBot"
Nous allons dans ces quelques lignes expliquer l'injection utiliser dans des
processus légitimes de ce malware.II. Mode d'injection dans un processus légitime.
Dyreza a une
façon particuliére d'injecter du code dans le processus cible en cours
d'éxecution sur le poste que la plupart des autres malwares.
La plupart des malwares
injecteront du code de différentes manières:
1 ) Créer un processus
suspendu puis le creusé, écrire le code à injecté, Et enfin rediriger le thread
principal du processus sur son code
injecté dans le processus ( Technique de ProcessHollowing )
2 ) Ouvrir un processus
en cours d'execution dans la session, lui inserer du code et enfin crée un
nouveau thread dans le processus exécutant le code écrit.
3) créer un mappage
mémoire entre le processus et le malware, puis démarrer un nouveau thread dans
le processus cible qui exécutera le code mappé.
Dyreza démarre
son injection sur la techinque (3) en mappant un bloc mémoire de son process
dans la mémoire virtuelle du processus cible comme explorer.exe ou svchost.exe
via l'api NtMapViewOfSection(..). À ce stade rien de réellement nouveau,mais
à différence de la plupart d'autre
malware qui vont soit détourner le thread déjà en cours d'exécution (en
utilisant GetThreadContext et SetThreadContext, soit ResumeThread) ou en créer
un nouveau (utilisant CreateRemoteThread ou via les API native). Au lieu de
cela , Dyreza utilise l'API ZwQueueApcThread(..) pour faire executer le code
mappé en définissant l'adresse de début du shellcode mappé dans le processus
cible.
nous allons décrire la séquence via des schemas conceptuelle à la différence que l'on va uniquement utiliser la technique pour charger une DLL dans le processus cible et non un shellcode dans une premier temps.
Le premier étape est de crée un fichier mappé en mémoire dans son processus et écrire le chemin de la dll que l'on souhaite injecté dans le processus cible
Dans notre exemple nous allons injecter une dll nommé "9B113D1A.dll". Le fichier mappé dans le processus injecteur ce trouve à une addresse en mémoire que l'on nommera "Addresse X"
la seconde étape est le mappage de notre bloc mémoire dans le processus cible.
Il faut bien prendre conscience que celui-ci va être mappé dans le processus cible avec l'ensemble du contenu du bloc que ce soit une chaine ou un schellcode. Mail il sera à positionner différente que l'on nommera dans notre exemple "Addresse Y"
la dernier étape est d'appel d'une procédure asynchrone sur le thread cible ( APC sur le Thread )
Dans notre exemple Address X = 0x00320000 correspondant à l'addresse ou est mappé le fichier en mémoire dans l'injecteur et Addesse Y = 0x00050000 le bloc mappé dans le processes cible qui est ici "calc.exe"
Nous allons mettre en evidence la présence du fichier mappé dans la mémoire du processus injecteur
Pour cela nous allons utiliser un outil conçu pour analyser des processus X32
Celui-ci fait un dump de la mémoire à une addresse précis et pour un volume d'octet définit
Nous avons positionner sur l'addresse du fichier mappé 0x00320000 dans le processus injecteur.
Nous retrouvons bien la chaine écrite "C:\Sample\98113D1A.dll"
Mais faut ce dump avant que le processus injecteur est appeler code "UnmapViewOfFile(hView);".Car à ce moment là, le bloc n'existe plus dans le processus le processus injecteur.
Nous avons effectuer le dump mémoire à l'adresse 0x00320000, juste aprés d'appel de la l'API "UnmapViewOfFile(..)".Et nous avons obtenu ce qui était évidant plus de trace de la chaine.
A contrario si nous effectuons un dump sur notre processus cible "calc.exe" ayant pour PID =2036. Nous avons encore notre fichier mappé en mémoire avec notre chaine dans la cible
nous allons décrire la séquence via des schemas conceptuelle à la différence que l'on va uniquement utiliser la technique pour charger une DLL dans le processus cible et non un shellcode dans une premier temps.
Le premier étape est de crée un fichier mappé en mémoire dans son processus et écrire le chemin de la dll que l'on souhaite injecté dans le processus cible
Dans notre exemple nous allons injecter une dll nommé "9B113D1A.dll". Le fichier mappé dans le processus injecteur ce trouve à une addresse en mémoire que l'on nommera "Addresse X"
la seconde étape est le mappage de notre bloc mémoire dans le processus cible.
Il faut bien prendre conscience que celui-ci va être mappé dans le processus cible avec l'ensemble du contenu du bloc que ce soit une chaine ou un schellcode. Mail il sera à positionner différente que l'on nommera dans notre exemple "Addresse Y"
ce qui donne sur un seul schéma la séquence de cette injectionIII. Mise en pratique de l'injection
Pour cela nous utilisons un exemple "InjectionOfProcessWithNtMapViewOfSection.exe" qui mes en pratique ce que nous avons décrit au dessus:Dans notre exemple Address X = 0x00320000 correspondant à l'addresse ou est mappé le fichier en mémoire dans l'injecteur et Addesse Y = 0x00050000 le bloc mappé dans le processes cible qui est ici "calc.exe"
Nous allons mettre en evidence la présence du fichier mappé dans la mémoire du processus injecteur
Pour cela nous allons utiliser un outil conçu pour analyser des processus X32
Celui-ci fait un dump de la mémoire à une addresse précis et pour un volume d'octet définit
Nous avons positionner sur l'addresse du fichier mappé 0x00320000 dans le processus injecteur.
Nous retrouvons bien la chaine écrite "C:\Sample\98113D1A.dll"
Mais faut ce dump avant que le processus injecteur est appeler code "UnmapViewOfFile(hView);".Car à ce moment là, le bloc n'existe plus dans le processus le processus injecteur.
Nous avons effectuer le dump mémoire à l'adresse 0x00320000, juste aprés d'appel de la l'API "UnmapViewOfFile(..)".Et nous avons obtenu ce qui était évidant plus de trace de la chaine.
A contrario si nous effectuons un dump sur notre processus cible "calc.exe" ayant pour PID =2036. Nous avons encore notre fichier mappé en mémoire avec notre chaine dans la cible
Aucun commentaire:
Enregistrer un commentaire