Analyse de codes malveillants

Dans un précédent article, nous avons réalisé une étude sur un email malveillant et constaté que du code peut être exécuté lors de l'ouverture de pièces jointes. Aujourd'hui, nous nous consacrerons à ces codes malveillants qui sont exécutés. On va comprendre ce qu'ils réalisent et quelles sont les techniques utilisées pour compliquer le travail des analystes et outrepasser les protections.

Avant de commencer, faisons un petit rappel de certains mots clés :

  • Un downloader est un fichier qui permet de télécharger et d’exécuter un malware.
  • Un dropper est un fichier qui contient directement le malware dans son code en le dissimulant pour éviter toute détection. Il va déposer le malware sur l'ordinateur pour ensuite l'exécuter.
  • Une macro, dans les documents Office (Word, Excel, PowerPoint, ...) est un ensemble de commandes et d'instructions qui seront exécutées lors de son ouverture.

Aujourd’hui, les attaquants utilisent très souvent les mêmes vecteurs d'attaques pour les downloaders et les droppers, à savoir, les macros dans les documents Office et du code JavaScript dans les fichiers PDFs. Un analyste ou un programme peut détecter ce code, l'extraire et l'analyser pour comprendre son fonctionnement et bloquer rapidement la menace. De ce fait, les attaquants sont obligés d'utiliser des techniques pour retarder au maximum la détection de leurs fichiers malveillants ; l'obfuscation de code est une des méthodes les plus employées et c'est celle-ci que nous allons voir aujourd'hui.

Qu'est-ce que l'obfuscation de code et à quoi cela peut-il bien servir ?

L'obfuscation, dans l'informatique, consiste à rendre un programme exécutable ou un code source illisible et difficile à comprendre par un être humain, tout en conservant son fonctionnement. L'objectif est de contourner le maximum d'analyseurs de code statique mais aussi de faire perdre du temps aux analystes qui vont étudier le code. L'obfuscation des chaines de caractères est l'une des techniques les plus utilisées par les créateurs de malware. Cette méthode consiste à dissimuler, ou à rendre incompréhensible, les chaines de caractères grâce à un algorithme qui va se charger de décoder les données lors de l’exécution du code. Cet article s'intéresse principalement à cette technique d'obfuscation au travers des downloaders.

Nous allons étudier deux exemples de codes trouvés dans des downloaders ces derniers mois. Dans un premier temps, nous allons commencer par un exemple simple pour comprendre le fonctionnement et l'intérêt de l'obfuscation, puis nous étudierons un cas plus compliqué car oui... la simplicité dans l'analyse de malware est rare et quand elle arrive, nous devons en profiter pleinement et voici un exemple parfait pour commencer !

Une obfuscation pas si obfusquée que ça

 

Type Fichier SHA1 VirusTotal VirusBay
PDF 39809b0836b3198e472e9e5a4f15f5e75ab49265

Lien

Lien

 

Sans plus tarder, entrons dans le vif du sujet et regardons de loin ce petit bout de ce vilain code qui provient du fichier PDF malveillant ci-dessus.

D'un point de vue général, il est difficile de comprendre ce que réalise ce code, bien que la ligne 1 nous donne un très gros indice avec une URL qui pointe vers un fichier EXE... Lorsque j'analyse du code malveillant, ma première étape consiste à le rendre le plus lisible possible, par exemple en ajoutant des sauts de lignes, des espaces et en séparant le code en plusieurs parties.

Voici le résultat obtenu, un peu plus lisible et compréhensible non ?

code malveillant

Le code a été divisé en 6 blocs, séparés par une ligne vide :

  1. Lancement de l'invite de commande Windows qui va permettre d'exécuter des commandes sur le système puis nous déplace dans notre dossier temporaire.
  2. Déclaration de variables.
  3. Déclaration et utilisation d'un premier objet.
  4. Déclaration et utilisation d'un second objet.
  5. Déclaration d'une fonction.
  6. Exécution et suppression de fichier.

On remarque très rapidement que les parties 2, 3, 4 et 5 commencent par '& @echo' et se termine avec '>> N2o.vbs'. À quoi cela peut-il bien correspondre ?

  • Le '&' indique qu'une autre commande va être exécutée. Par exemple, 'commande1 & commande2' indique que commande1 va être exécutée et ensuite la commande2.
  • Le '@echo' est la commande qui permet d'écrire dans le prompt Windows.
  • le '>> N2o.vbs' redirige ce qu'il y a d'écrit dans le prompt Windows dans le fichier 'N2o.vbs' sans effacer ce qui s'y trouve déjà (le contenu est ajouté à la fin du fichier à chaque fois).

Pour résumer, les parties 2, 3, 4 et 5 sont uniquement des commandes qui vont écrire dans le fichier 'N2o.vbs'.

Pour le moment, voici ce que nous savons et les étapes que va réaliser le code :

  1. La première ligne exécute un prompt Windows et nous déplace dans le dossier temporaire de la session courante.
  2. Ensuite, plusieurs commandes vont écrire dans le fichier 'N2o.vbs'.
  3. Le fichier 'N2o.vbs' est exécuté (ligne 27).
  4. Le fichier est ensuite supprimé (ligne 28).
  5. Un fichier nommé 'ITL.EXE' est exécuté (ligne 29).

Pour comprendre ce que va réaliser le code, il faut analyser le fichier 'N2o.vbs' :

analyse code malveillant

On remarque que la fonction 'K4d' est appelée à plusieurs reprises (ligne 2, 4, 5 et 8) avec une chaine de caractère incompréhensible. Au vu de la fonction et du code, on peut en déduire que la chaine d'entrée va être transformée pour en ressortir une chaine compréhensible qui sera ensuite utilisée. Il est d’ailleurs très étonnant que la chaîne la plus intéressante du code, à savoir l'URL, n'a pas été obfusquée. Il s'agit probablement d'un oubli...

Regardons ce que fait exactement cette fonction :

  • Ligne 17 : Une boucle est créée qui sera parcourue proportionnellement à la longueur de la chaîne d'entrée, par exemple, si la chaîne d'entrée est 'toto' alors il y aura 4 tours de boucle.
  • Ligne 18 : La fonction 'MID()' permet de retourner une sous-chaîne commençant à une position avec une taille donnée, par exemple, MID('toto', 2, 3) va retourner la sous-chaîne 'oto'. Le 2 détermine la position du début de chaîne et le 3 sa longueur.
  • Ligne 19 : Ici, on applique plusieurs transformations à la sous-chaîne trouvée sur la ligne précédente.
    1. La fonction 'Asc()' retourne la représentation décimal d'un caractère, par exemple, Asc("A") retourne le nombre 65.
    2. Ensuite, on soustrait 35 au nombre retourné par la fonction 'Asc()'
    3. Pour finir la fonction 'Chr()' utilise le résultat des deux opérations précédentes pour retourner un caractère, par exemple, Chr(65) retourne la lettre A.
  • Ligne 20 : On ajoute le caractère calculé ligne 19 à la chaîne 'Z4o'
  • Ligne 22 : Retourne la nouvelle chaîne créé par la boucle.

Procédons pas à pas avec l'utilisation de la fonction K4d ligne 5 qui donne comme chaîne d'entrée "jhw". La chaîne d'entrée à une longueur de 3, il y aura donc 3 tours de boucle.

1er tour de boucle

  • Ligne 18 : MID("jhw", 1, 1) → "j"
  • Ligne 19 :
    1. Asc("j") → 106
    2. 106 - 35 → 71
    3. Chr(71) → G
  • Ligne 20 : Z4o = "G"

2ème tour de boucle

  • Ligne 18 : MID("jhw", 2, 1) → "h"
  • Ligne 19 :
    1. Asc("h") → 104
    2. 104 - 35 → 69
    3. Chr(69) → E
  • Ligne 20 : Z4o = "GE"

3ème tour de boucle

  • Ligne 18 : MID("jhw", 3, 1) → "w"
  • Ligne 19 :
    1. Asc("w") → 119
    2. 119 - 35 → 84
    3. Chr(84) → T
  • Ligne 20 : Z4o = "GET"

 

Après les 3 tours de boucle la fonction retourne la chaîne "GET". L'appel de cette fonction aux lignes 2, 4 et 8 retourne respectivement les chaînes "ITL.EXE", "MSXML2.XMLHTTP" et "ADODB.STREAM".

Nous pouvons donc maintenant remplacer toutes les chaînes de caractères, variables et supprimer la fonction qui n'est plus nécessaire pour simplifier le code au maximum. Voici le résultat final, nettement plus simple à lire et comprendre non ?

analyse d'un code malveillant

Le code restant est divisé en 2 parties. La partie 1 (lignes 1 à 3) va récupérer les données du fichier 'albert.exe' puis la partie 2 (lignes 5 à 11) s'occupe d'écrire les données récupérées dans un fichier nommé 'ITL.EXE'.

Nous connaissons à présent toutes étapes que réalise le code malveillant :

  1. Écrit du code dans un fichier
  2. Exécute le fichier
  3. Supprime le fichier
  4. Exécute le programme téléchargé

 

URL URL Scan
hxxp://ultimatefifa[ . ]com/po/albert[ . ]exe

Lien

 

Fichier SHA1 VirusTotal VirusBay
albert.exe 33985325dd64e06a3e3af0c540073eefd07d9596

Lien

Lien

 

Nous en avons terminé pour cet exemple et comme nous avons pu le voir, ici, l'obfuscation du code est vraiment très légère et d'autant plus du fait que l'URL du fichier téléchargé est lisible dès le début (probablement une erreur...) contrairement aux autres chaînes de caractères présentes dans le code.

Dans une seconde partie, nous verrons ce qui se fait actuellement et quel niveau d'obfuscation il est possible d'atteindre.