Dans la partie 1, nous avons défini ce qu’était l’obfuscation de code, ce à quoi cela pouvait servir et, nous avons étudié un code avec une petite obfuscation. Maintenant que les bases sont posées, nous allons pouvoir passer aux choses sérieuses avec un cas plus concret que l’on retrouve tous les jours, à savoir, un fichier WORD avec une macro !

Les documents Office (Word, Excel, PowerPoint, …) et PDF sont les formats les plus utilisés lors des attaques par mails. Pour cesdocuments, et c’est ce que nous allons voir aujourd’hui, la principale méthode utilisée à travers ce format est l’utilisation de macro.

Qu’est-ce qu’une macro et à quoi cela peut-il bien servir ? Pour répondre à cette question, rien de mieux que de citer la définition officielle de Microsoft.

Une macro est une série de commandes et d’instructions que vous regroupez au sein d’une même commande afin d’exécuter automatiquement une tâche.

Un fichier Office malveillant va donc utiliser une macro pour exécuter du code sur l’ordinateur de la victime. Aujourd’hui, nous allons voir comment les macros peuvent être obfusquées et comment faire pour comprendre ce qu’elles réalisent. L’analyse sera plus compliquée que dans l’article précédent mais pas de panique, nous allons l’effectuer pas à pas.

Beaucoup de code pour pas grand-chose…

Nous y voilà, c’est parti ! Le code que nous allons étudier provient d’une macro contenue dans le fichier Word ci-dessous.

Type fichierSHA1VirusTotalVirusBay
Worda8a1b0191d35b4530afacab33cffb751d42d3d64

Lien

Lien

 

Code malveillant macro

Comme vous avez pu le voir (image ci-dessus) le code de la macro est obfusquée. L’obfuscation est plutôt bien réussie, même s’il reste encore quelques mots-clés que nous pouvons lire dans le code.

  • Ligne 7 : On remarque un « md, « /V », « :ON/C » et plus loin sur la ligne un « s^e^t » (set). Cela nous donne des indications sur la macro, à savoir que celle-ci va exécuter du code via l’invite de commande Windows.
  • Ligne 176 : on peut lire un « for » et « in », cela semble être une boucle.
  • Ligne 178 et 181 : il y a un « do », « set », « if et « equ ». Tout semble indiquer que le code va exécuter une boucle avec des tests à l’intérieur.

Enfin, si on regarde attentivement le tout début de la ligne 176, on peut lire un « p », maintenant regardons la ligne 174 et si on la lit à l’envers, cela donne, « o », « wer », « sh », « ell ». On concatène le tout et cela donne, « powershell » ! Du code PowerShell va être exécuté sur l’ordinateur. Continuons pour comprendre ce qui se passe réellement.

La première étape va consister à simplifier au maximum le code en retirant tout ce qui est inutile. Pour cela, nous allons le faire fonction par fonction, commençons par la dernière, que voici :

code malveillant macro image 2

Avec un peu d’expérience, on remarque que toutes les lignes dans le code commençant avec le mot clé « Hour » sont inutiles. C’est ce qu’on appelle du bruit : cette technique consiste à ajouter du code mort, qui ne sera pas utilisé par le programme, afin de compliquer la compréhension du code. Ici, on remarque rapidement le bruit mais c’est rarement le cas dans des obfuscations de code plus avancées où il peut être difficile de l’identifier. Voici ce que donne la fonction « Sub AutoOpen() » après avoir retiré le bruit :

code malveillant macro image3

Voici ce que donne une recherche du mot clé « AutoOpen » sur le site de microsoft :

La macro AutoOpen s’exécute lorsque vous ouvrez un nouveau document de l’une des manières suivantes :

Lorsque vous utilisez la commande Ouvrir dans le menu Fichier.

Lorsque vous utilisez la commande FileOpen ou la commande FileFind.

Lorsque vous sélectionnez un document dans la liste des derniers fichiers utilisés dans le menu Fichier.

Lorsqu’un document est ouvert, la macro AutoOpen s’exécute si elle fait partie intégrante de ce document ou si elle fait partie du modèle à partir duquel le document a été créé.

AutoOpen ne s’exécute pas si elle fait partie d’un complément global.

Vous pouvez empêcher une macro AutoOpen de s’exécuter en maintenant la touche MAJ enfoncée pendant que vous ouvrez un document.

Donc lorsque le document est ouvert, la macro AutoOpen exécute le code qui se trouve dans celle-ci. Ici, la macro fait une seule ligne (ligne 24). Le mot clé « Shell » est une fonction qui va exécuter un programme, cette fonction a besoin de 2 arguments.

Voici sa syntaxe :

Shell argument1, argument2
argument1 : Le nom du programme qui sera exécuté.
argument2 : Le focus du programme exécuté. Permet de déterminer si le programme exécuté sera caché, la taille qu’il aura, etc …

Dans notre code, le premier argument est une suite d’addition de variables et si on regarde le reste du code on se rend compte que ce sont les retours des fonctions qui vont être additionnés pour ensuite être exécutés. Simplifions le reste du code pour y voir plus clair.

code malveillant macro image 4

Prenons la fonction ci-dessus pour exemple, regardons les différentes étapes :

  1. On supprime les lignes qui commencent avec le mot clé « Hour » comme expliqué précédemment.
  2. Pour les lignes restantes (ligne 7, 9, 12, 14 et 19), on additionne les chaines de caractères. Exemple, une ligne avec écrit : variable = « Powe » + « rSh » + « ell » donnerait ceci : variable = « PowerShell ».
  3. La ligne 2 est utile uniquement lors de l’exécution du code donc nous pouvons aussi la supprimer.
  4. Pour finir, sur la ligne 20 on concatène les résultats obtenus dans les étapes précédentes.

Voici ce que nous obtenons à la fin :

code malveillant macro image6

Maintenant nous pouvons réaliser les étapes précédentes sur le reste du code, ci-dessous le résultat obtenu, on passe d’un code faisant 200 lignes à 23 lignes ! Plutôt pas mal non ? Nous pouvons encore faire bien mieux.