febrero 09, 2012

Solución al reto de ESET en la @BugCon 2012

el 2 y 3 de febrero visité la ciudad de México par asistir a la @BugCon 2012, se dice que la convención de Hackers más grande de México. 

Imagen 01- llegando a la Bugcon

Allí el día 2 de febrero asístí al taller "Jugando Wargames para desarrollar habilidades de Hacking"  que impartió el gran @hecky  y en el cual tuve la fortuna de llevarme el premio por resolver mas retos ;) 
Imagen 02, Premio del WarGame 

Y como para probar que lo aprendido en el taller y que mi maestro @Hecky estuviera orgulloso de su alumno XD.  me propuse entrar al reto  de ESET LA  (si lo que hacen Nod32)  y pues les comparto como fué que resolví  estos retos.

Todo comenzó cuando @isegar de @EsetLa nos regaló un folleto de propaganda de ESET y que contenía la leyenda: 
El desafío comienza aquí: lxxt://hiwejmswiwix.gsq/fyk-gsr-gleppirki/
por lo que para poder entrar al reto había que descifrar la dirección para acceder correctamente al desafío, al ver que en la parte de la URL "http" contenía dos "xx" (como las dos tt de en http) lo que me hizo sospechar de una rotación con el  "método cesar" de encriptamiento así que saqué el programita que hace rotaciones y pude obtener lo siguiente:
imagen 03 - Descifrando la dirección con rotación de 22 posiciones.

y aquí es donde comienza la aventura:
imagen 04 - Inicio del desafío en la dirección encontrada.

El desafio consistía de 7 niveles que te permitirían acceder a los codiciados boletos para la rifa de un PS3 yo resolví 6 de los 7 y aquí les cuento como lo hice. la mayoría de los niveles eran de JavaScript (que no domino) 

Así de veía la primera pantalla 


Revisando el código fuente de la página se puede ver un JavaScript que valida el Pass: 

<scr1pt language=JavaScript type="text/javascript">
{
var a="nivel2";
function check() {
     if (document.a.c.value == a){
         document.location.href=document.a.c.value+".htm";
     }
     else {
           alert ("Seguir intentando...");
          }
     }
}
</scr1pt>
que además de darnos el pass nos dice la dirección del siguiente nivel:  http://desafioseset.com/bug-con-challenge/nivel2.htm

NIVEL 2
Esta página también era protegida por un JS así que sólo teniamos que oprimir cancelar para detener el script  y ver el código fuente:

<script language=JavaScript type="text/javascript">
    var pass, n;
    pass=prompt("Por favor ingrese la contraseña!","");
    if (pass=="l2l") {
        window.location.href=pass+".htm";
        n=3;
    }
    else {
        alert("No, esa no es....");
    }
</script>


aquí copiamos la constante con la que se hace la condición y armamos la nueva url que lleva al siguiente nivel:
http://desafioseset.com/bug-con-challenge/l2l.htm

Nivel 3
En este nivel también un JavaScript nos cortaba el paso al siguiente nivel, viendo el código fuente de la página podiamos ver al guardián:

<script language=JavaScript type="text/javascript">
function pass()
{
    var pw, Aingabe;
    pwd=window.document.alinkColor;
    Aingabe=prompt ("Bienvenido al Nivel 3, ingresa el p4ssw0rd por favor,");
    if (Aingabe==pwd){
        window.location.href=String.fromCharCode(115,105,103,117,101,115,105,103,117,105,101,110,100,111)+".htm";
    }
    else {
        alert("Ah ah ah, trata de nuevo...");
    }
}
function pass2(){
    var password, pr;
    pr = prompt("Bienvenido al Nivel 3, ingresa el p4ssw0rd por favor,");
    if (pr = "nivel3#"){
        window.location.href=String.fromCharCode(123,105,149,101,105,103)+".htm";
    } else {
        alert("And then!?");
    }
}
</script>

el metodo fromCharCode del objeto String me hace sospechar de códigos ascii por lo que tomo los numeros que se pasan a la función y como soy medio huevón para codificar pues  los metí a un excel y usé la función =caracter() y este es el resultado:

así que vamos ala URL
http://www.desafioseset.com/bug-con-challenge/siguesiguiendo.htm

y accedemos al

NIVEL 4
al llegar a esta página encuentras una leyenda que dice click acá el final así que el "sentido aracnido" indica que ahí debe haber algún script así que a inspeccionar el código:

<scr1pt language=JavaScript type="text/javascript">
var _0xb376=["\x43\x6F\x6E\x74\x72\x61\x73\x65\xF1\x61","","\x33\x73\x74\x30\x20\x6E\x30\x20\x74\x33\x72\x6D\x31\x6E\x34\x20\x34\x63\x34","\x68\x72\x65\x66","\x6C\x6F\x63\x61\x74\x69\x6F\x6E","\x76\x69\x2E\x68\x74\x6D","\x4D\x6D\x6D\x2C\x20\x6E\x6F\x2C\x20\x74\x72\x61\x74\x61\x20\x64\x65\x20\x6E\x75\x65\x76\x6F\x2E\x2E\x2E\x0A\x53\x69\x20\x6E\x65\x63\x65\x69\x73\x74\x61\x73\x20\x61\x79\x75\x64\x61\x2C\x20\x66\x69\x6A\x61\x74\x65\x20\x64\x6F\x6E\x64\x65\x20\x68\x61\x63\x65\x73\x20\x63\x6C\x69\x63","\x73\x69\x67\x75\x65\x73\x69\x67\x75\x69\x65\x6E\x64\x6F\x2E\x68\x74\x6D"];var pass,i;pass=prompt(_0xb376[0],_0xb376[1]);if(pass==_0xb376[2]){window[_0xb376[4]][_0xb376[3]]=_0xb376[5];i=4;} else {alert(_0xb376[6]);window[_0xb376[4]][_0xb376[3]]=_0xb376[7];} ;
</scr1pt>

Primero pendé en decodificar el Hexadecimal para ver que decía, batallé durante un momento hasta que vi que el propio script hacía alerts de diferentes posiciones del vector así que sólo agregué al código un alert de la posición 2 y me regresó la contraseña esperada en el NIVEL 5 pero al hacer lo mismo con  la parte verdadera de la condición se podía construir la URL:
Lo que nos hacía saltar de inmediato al ...

NIVEL 6
Al revisar el código fuente de este nivel se podían observar dos scipts uno "a la vista" y el otro oculto, así que para no perder tiempo probando el pass que estaba a la vista (pues ya era el nivel 6 así que no podía ser tan fácil de inmediato me tiré por el segundo script."traslation.js"

var pass,pwd;
var i,j,k;
pass=prompt("Correcto! Y ahora decime esta pass:","");
j = 0;
pwd ="s3cr3tc0d3";
for(i=0; i < 15; i++){
    j = j + i;
}
k = 3;
j = j * k;
pwd = pwd + j;
if (pass==pwd) {
    window.location=pwd+".htm";
}
else 
    alert("Justo esa no es, segui probando...");


aquí como ya de plano me dio flojera hacer operaciones en mi cabecita hice un "alert(pwd)" justo antes del if  y salio el passwor y por consiguiente la URL del siguiente nivel: s3cr3tc0d3315
http://desafioseset.com/bug-con-challenge/s3cr3tc0d3315.htm
NIVEL 7

ya en el último reto y comenzando la última conferencia del  @BugCon, he de decir que no me alcanzó el tiempo ni la cabeza para resolver el último reto he leido ya que había que hacer un ataque de fuerza bruta para saber que numero era el que daba un entero para cumplir con la condición del script así que me quedé a uno de poder participar en el sorteo del PS3.
les dejo el último script pero sin solución a ver si hay algún animado que lo quera resolver, yo ya tengo la respuesta pero dejemos el misterio en el aire :)


<script type="text/javascript">
function preprocesar() {
nombre = document.getElementById("nombre").value;
passwd = parseInt(document.getElementById("passwd").value, 16);

suma = 0;
llave = 'DEADC0DE';
if(nombre.length >= 6 && passwd > 0) {
    for(i=0; i <= nombre.length; i++) {
        a = nombre.charCodeAt(i);
        b = llave.charCodeAt(i%llave.length);
        c = (a | b) & ~(a & b);
       
        suma += c;
    }
   
    a = suma;
    c = passwd;
   
    b = Math.sqrt(c - Math.pow(a,2));
    if(b == Math.floor(b) && b > 0) {
        alert("Viste que era facil ;)");
        window.location = "comprobar.php?a="+nombre+"&c="+c.toString();
    } else {
        alert("Password incorrecto :(");
    }
}
}
</script>



Esta fue una buena experiencia porque jugabas contra el tiempo y los demás participantes, aprendí mucho de esta experiencia y pronto estaré compartiendo más sobre este evento.

saludos seguros