Malware : désobfuscation d’un Javascript encodé

Introduction

Lors d’une réponse à incident, le CERT Intrinsec a été confronté à un fichier JSE (Javascript Encoded) obfusqué et qui, après une analyse de premier niveau, apparaissait comme malveillant. Lorsque l’investigation a débuté, ce fichier n’était pas connu de VirusTotal et nous n’avons trouvé aucune information sur son comportement.

Nous l’avons donc analysé en 4 phases :

  • Le décodage,
  • La désobfuscation,
  • l’analyse comportementale,
  • l’extraction d’indicateurs de compromission (IOC).

Décodage

Le script étant un fichier « .jse », il est encodé par une méthode mise au point par Microsoft, mais dont les algorithmes d’encodage et de décodage ont été découverts en 2013. Le code présent sur le github suivant : « https://gist.github.com/bcse/1834878 », nous a par exemple permis de le décoder.

Désobfuscation

Le script comprenait plus de 300 000 lignes de code. Un bref coup d’œil nous a permis de déterminer qu’il était obfusqué et que certaines lignes de codes étaient régulièrement répétées. Il devenait donc intéressant de se concentrer sur celles-ci afin de réduire la taille du script.

Ainsi nous avons identifié 8 parties du code différentes qui pouvaient être modifiées afin d’inverser l’obfuscation.

1.

Ces lignes de code apparaissent près de 4 000 fois et sont en réalité équivalentes à la première lettre de la déclaration de fonction. Ici, le terme « function(pika666) » devient ‘f’.

2.

De même, ces lignes retournent la lettre ‘F’, ici en majuscule grâce à la fonction « toUpperCase() ».

3.

Ces lignes de code apparaissent plus de 36 000 fois et retournent systématiquement la valeur de « po9_0 » (i.e. ‘i’). Le nom des variables est aléatoire, ce qui rend plus difficile le remplacement automatique de ces lignes.

4.

La quatrième partie équivaut à « String[‘fromCharCode’](114) », soit la lettre ‘r’.

5.

Ici la lettre retournée est la lettre ‘p’ (la 6ème lettre de la concaténation de « true » et « Ap ») .

6.

Comme pour le cas précèdent c’est la 4ème lettre du terme « false » qui est retournée, soit ‘s’.

7.

Les noms de variable sont aussi obfusqués grâce à l’utilisation des caractères Unicode. Par exemple, la variable « hashhere » vaudra la valeur suivante : « \u0068\u0061\u0073\u0068\u0068\u0065\u0072\u0065 ».

Pour conclure, le code désobfusqué comprend moins de 300 lignes et devient donc plus facilement analysable.

Analyse comportementale

L’analyse du script désobfusqué montre rapidement que les 19 premières lignes sont des déclarations de variables qui ne seront pas utilisées.

Parmi les autres variables intéressantes on remarque principalement les suivantes :

  • ‘zoUobail89’, l’URL qui sera utilisée pour télécharger la charge active
  • ‘zoUoriches24’, le chemin absolu du script
  • ‘ext789’, la liste des extensions qui serviront plus tard dans le script
  • ‘list87656’, le fichier qui enregistrera les chemins absolus des fichiers dont l’extension fait partie de la liste précédente

Si le nom du script est différent d’« adobeupd.jse » et s’il ne figure pas dans le dossier « démarrage » de l’utilisateur courant, le script affichera une popup affirmant que le script est endommagé et ne peux pas être réparé.

En effet, la variable « zoUowhich43 » sert à récupérer le dossier ‘démarrage’ de l’utilisateur courant comme nous l’explique la documentation de Microsoft (cf. lien [2] et [3] pour plus de précisions).

Après remplacement des variables intéressantes, le code devient le suivant :

La variable « pills » n’existant pas, une exception sera levée et capturée par le bloc « catch ». Le code du script est sauvegardé dans une variable qui servira plus tard afin de tenter une propagation latérale.

 

Le script bouclera ensuite 4 millions de fois avant de vérifier la présence ou non d’une liste de processus ou de noms d’utilisateur présents sur le poste infecté.

Cette liste est la suivante :

  • Wireshark
  • Temp\iexplore.exe
  • ProcessHacker
  • vmtoolsd
  • VBoxService
  • python
  • Proxifier.exe
  • Johnson-PC
  • ImmunityDebugger.exe
  • lordPE.exe
  • ctfmon.exe*JOHN-PC

Dans le cas où l’une de ces entrées est détectée, le script fera appel à une variable non définie, provoquant son arrêt. Ce comportement a donc pour objectif de limiter les capacités des environnements d’analyse.

Une fois ces vérifications effectuées, le script se copiera dans le fichier ‘adobeupd.jse’ du dossier ‘démarrage’ de l’utilisateur, lui permettant d’assurer sa persistance.

Il récupérera par la suite la charge active (ici un exécutable) depuis l’URL « hxxps://185.130.104[.]178:4444 ». On remarquera le port 4444 qui est, entre autre, le port du framework Metasploit, mais aussi de nombreux chevaux de Troie. La charge active est placée dans le dossier temporaire et a pour nom un nombre aléatoire suivi de l’extension « .exe ». La charge active pourra aussi être placée dans le même dossier, avec l’extension ‘.ioi’ et encodée en base64.

Si la création du fichier « .exe » a échoué, le script va tenter de se propager dans le but de trouver une machine vulnérable. Pour ce faire, il va chercher les fichiers dont l’extension fait partie de la liste contenue dans la variable « ext789 » et se trouvant sur les lecteurs amovibles et les lecteurs réseaux (« DriveType » 3 ou 1). Les extensions recherchées sont les suivantes :

La liste complète des fichiers trouvés sera enregistrée dans le fichier « %TEMP%\yaper.txt ». Le script se répliquera ensuite en remplaçant tous ces fichiers par le contenu du script et en remplaçant l’extension par « .jse ». Il supprimera ensuite « yaper.txt ».

Finalement le script exécutera la charge active précédemment téléchargée et tentera de nettoyer ces traces en supprimant tous les fichiers du dossier temporaire et ayant pour extension « .exe », « .ioi » et « .txt ».

Impact et mitigation

Une infection par ce programme pourrait entraîner deux conséquences : soit l’infection par la charge active, que nous sommes en train d’analyser, soit la suppression de tous les fichiers présents sur les lecteurs réseaux et amovibles accessibles depuis l’ordinateur infecté.

Une possibilité de mitigation est de surveiller le trafic sortant vers 185.130.104[.]178. Il est par ailleurs conseillé de bloquer les communications sortantes vers le port 4444 de façon générale ainsi que de mettre son utilisation sous surveillance, ce port étant très régulièrement utilisé pour des communications illégitimes.

De plus il est possible de modifier le programme exécutant par défaut les scripts « jse » pour le remplacer par le bloc-notes par exemple. Ainsi si un utilisateur double-clic sur un script « jse » malveillant il ne sera pas exécuté mais ouvert dans le bloc-notes. Plus d’informations sur cette méthode dans notre guide de lutte contre les ransomwares [ici].

Extraction des IOCs

  • 185.130.104[.]178
  • hxxps://185.130.104[.]178:4444/C/deerstalker[.]php
  • C:\Users\username\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\StartUp\adobeupd.jse
  • %TEMP%\yaper.txt
  • %TEMP%\RANDOM_NUMBER.exe
  • %TEMP%\RANDOM_NUMBER.ioi
  • 643b3605c64901771759c1ed0bf735bf8dc9dbd56e63f603c5689c951f0e8c98 (sha256 du fichier ‘jse’)
  • 2bcb14e7aafae7418dd7fa0ef26ec39af71b7094a84b6a4ba1c65a8abf287e31 (sha256 de la charge active)

Sources

[1] https://gist.github.com/bcse/1834878

[2] https://technet.microsoft.com/fr-fr/library/bb774085.aspx

[3] https://technet.microsoft.com/fr-fr/library/bb774096.aspx

[4] https://securite.intrinsec.com/wp-content/uploads/2015/11/Intrinsec-CERT-Handbook-Anti-Ransomware-v2.pdf