Este Jueves 2 de Febrero del 2012 Fui a las Conferencias de seguridad Informatica BugCON en el Instituto Politecnico Nacional a dar un Taller sobre “Wargames y Hacking”. En el taller ademas de los asistentes, me acompaño un amigo del trabajo @LesmoCasanova quien ademas de apoyarme con la logistica, me ayudo en algunos retos de mi taller.

Muy aparte de esto, nos enteramos de un wargame y convenci a @LesmoCasanova de intentar este wargame. Asi pues comienza nuestra odisea.

El reto empezo cuando se nos entrego una propaganda de eset promocionando un wargame. Y decia:

Comienza por aquí:

1
lxxt://hiwejmswiwix.gsq/fyk-gsr-gleppirki/

Inmediatamente vi que era un cifrado de sustitusión monoalfabética. Asi que opte por hacerle un “BruteForce Caesar”

Y nos salia la URL del reto:

http://desafioseset.com/bug-con-challenge/

Este fue un wargame muy facil y divertido de 7 niveles, todos de JavaScript y realizado por @insegar por parte de @ESETLA donde es miembro del laboratorio de Analisis de Malware de Argentina.

Nivel 1:

Y tenia este codigo javascript de proteccion:

1
2
3
4
5
6
7
8
9
10
11
12
13
<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>

Ahi veiamos facil que nos redirigiria a http://desafioseset.com/bug-con-challenge/nivel2.htm asi que simplemente nos ibamos a esa URL y ya estabamos en el Nivel 2

Nivel 2:

Al ingresar al nivel 2 nos saca un prompt de JavaScript

Asi que pulsando la tecla “Esc” detenemos la ejecucion del JS y vemos ahora el codigo de JS.

1
2
3
4
5
6
7
8
9
10
11
<scr1pt 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....");
    }
</scr1pt>

Nos mandara ahora a http://desafioseset.com/bug-con-challenge/l2l.htm

Nivel 3:

En el nivel 3 nos sale otra prompt, pero esta vez el codigo viene mas grande:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<scr1pt 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!?");
    }
}
</scr1pt>

En esta parte vemos dos funciones, sin embargo si vemos la etiqueta del HTML vemos esto:

1
<b0dy onload=javascr1pt:pass(); alink="#001000">

Vemos la funcion que se utiliza es la de pass() así que la de pass2() es distracción.

Enfocandonos en la funcion pass() vemos numeros decimales que se convierten a ascii String.fromCharCode(115,105,103,117,101,115,105,103,117,105,101,110,100,111) para despues redirigirnos. Lo sacamos rapidamente de esta manera:

Y al final la url es: http://desafioseset.com/bug-con-challenge/siguesiguiendo.htm

Nivel 4:

El nivel 4 no lo entendi muy bien, nos daban esto:

Y el codigo fuente era:

1
<div class="reto" align="center">Felicitaciones! Siguiente nivel... <a href="noesloqueparece.htm"> Clic aca </a></div>

Al ingresar a http://desafioseset.com/bug-con-challenge/noesloqueparece.htm y detener con la tecla “Esc” el JS, ya estabamos en el Nivel 5

Sin embargo un prompt nos pedia una clave, si no era ingresada te regresaba al nivel 4

Nivel 5:

El nivel 5 tenia un nivel de ofuscacion:

1
2
3
<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>

Este nivel aunque se ve muy aparatoso era muy facil de entender, pero para no explicar todo veamos la manera de los “vagos” de como saltarnosla.

Desde la URL http://desafioseset.com/bug-con-challenge/noesloqueparece.htm y habiendo deteniendo todo el JS con la tecla “Esc” ponemos en la barra de direcciones del Navegador este comando:

1
javascript: alert(_0xb376);

Esto nos mostrara todo el array de esa variable y asi veremos que se oculta detras de ese hexadecimal.

Inmediatamente vemos “href, location, vi.htm”

Entonces si vamos a http://desafioseset.com/bug-con-challenge/vi.htm ya estamos en el Nivel 6

Nivel 6:

El nivel 6 es un “clasico” para confundir a los mas ciegos =P

Vemos esto:

De ahi se ve un script con una supuesta contraseña “123456″ que te redirige a “acanoentres.htm” lo cual es una distracción, ya que el script real esta aqui:

1
<scr1pt src="translation.js" language=JavaScript type="text/javascript"></scr1pt>

Al ingresar a translation.js encontramos el script verdadero:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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...");

Vemos aqui unas operaciones, pero para no hacer todo eso, la manera facil de bypassearlo es modificarlo un poco. Con la consola de Google Chrome lo modificamos un poco, quitamos los condicionales y en vez de eso, pusimos un alert a la variable “pwd” y con un enter sale =)

Asi que nuestra clave es: s3cr3tc0d3315 Y nuestra URL del ultimo nivel: http://desafioseset.com/bug-con-challenge/s3cr3tc0d3315.htm

Nivel 7:

Finalmente llegamos al nivel 7, que fue el que nos costo un poco mas de trabajo. El nivel 7 se ve así:

Y nuestro script era este:

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
<scr1pt 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 :(");
    }
}
}
</scr1pt>

Aqui @LesmoCasanova y yo estuvimos analizando un ratillo el script. Se nos ocurrieron varias cosas pero todas nos llevaban a nada. Al final vimos que la mejor idea era hacer un “bruteforce inverso”, algo que yo ya habia hecho en una ocasión para otro reto. @LesmoCasanova modifico directamente el script desde la consola de GoogleChrome haciendo un ciclo infinito y que cuando encontrara la coincidencia nos diera un alert.

Como cosa obvia, lo unico que logro fue colgar mi navegador ¬¬ Fue cuando entonces lo convenci de que era mas facil portar el codigo a PHP y ahi hacer las modificaciónes. Como todos unos magos @LesmoCasanova y yo pusimos manos en acción dando con este pequeño script

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
$nombre = "hecky@neobits.org"; 
$suma = 0;
$llave = 'DEADC0DE';
for ( $i = 0; 1; $i++) {
    $passwd = dechex("".$i."");
    for($o=0; $o < strlen($nombre); $o++) {
        @$expNombre = str_split($nombre);
        @$expLlave = str_split($llave);
        @$a = $expNombre[$o];
        @$b = $expLlave[$o%strlen($llave)];
        $c = ($a | $b) & ~($a & $b);
        $suma += $c;
    }
    $a = $suma;
    $c = $passwd;
    $b = sqrt($c - pow($a,2));
    if($b == floor($b) && $b > 0) {
        echo "respuesta: ".$passwd."\n";
        break;
    }
    echo $passwd."\n";
}
?>

Donde despues de correrlo nos saca la respuesta:

En el panel ingresamos el mail y mandamos la clave, lo cual no nos funciono, asi que se me ocurrio mejor mandarlo directamente en la URL De la manera que lo pedia (“comprobar.php?a=”+nombre+”&c=”+c.toString();)

Asi pues, la URL final era:

http://desafioseset.com/bug-con-challenge/comprobar.php?a=hecky@neobits.org&c=1e26

La cual automaticamente nos redirigia a http://desafioseset.com/bug-con-challenge/F3l1c1t4c10n3s.htm

Y nos salia:

NOTA: Había un Bug en el desafió siete. Un chavo me mostró que si ponías el email valido y rellenabas el password con 27 caracteres (LO QUE SEA), se podía bypassear todo y Listo =S #WTF Obviamente se lo comente a mi amigo Joaquin y vimos era un error por no haber validado la Longitud en PHP.

Al final resolvimos el reto en menos de una hora que salio.Fuimos los primeros y los unicos en aproximadamente en las primeras 10 horas que nadie mas lo resolvio. Sin embargo eso no nos aseguro el premio (Un Play Station 3) puesto que pasar el wargame solo te daba acceso a entrar a la rifa del PS3 de todos los que lo resolvieran en las 48 horas del reto …Hubiera sido mas justo (y conveniente para mi =P) que el primero que lo resolviera ganara, pero por cosas no es asi xDD

Al Final la suerte no estuvo de mi lado y alguien mas se llevo el PS3 =(. (Siempre quise mi epoca Gamer =P Creo no se me hará jamas, y creo el destino prefiere siga investigando y aprendiendo sobre Informática, que jugando jeje )

Pero de mi participación en el Wargame lo que mejor me llevo es:

  • Haber conocido a Joaquin Rodriguez @insegar y platicar con este crack
  • Mostrarle otra cara de la programación a @LesmoCasanova que creo le gusto mucho este wargame

Sin mas este es mi pequeño write-up al reto de ESET en BugCON 2012 y muy feliz por haber ganado este Wargame (Ganar el premio ya sera lo de menos). Y tambien muy agradecido con @LesmoCasanova por todo su apoyo durante la creacion de los retos de mi taller, durante todo mi taller y durante nuestra participación en el Wargame. Que gran equipo somos, y que grande sos como programador @LesmoCasanova =)

Saludos ;)

Atte. hecky
hecky@neobits.org
Sigueme en Twitter: http://twitter.com/hecky
 
  • Somethings

    Muy buen analisis, completo esta fue mi solucion con el propio JS ;) http://pastehtml.com/view/bmzwuuso2.html

    • http://neobits.org hecky

      Jeje muy buena tambien, pero lo quisimos hacer mas limpio sin que nos saltara “Datos incorrectos” Bueno pues, dar con la respuesta real =)

  • Aa

    Muy básico a mi parecer, mas por que es una conferencia importante, así que debio de haber sido un poco mas dificil los retos,  pero en general estan bien las soluciones, y si, los retos se ven para minimo 1 hr.  ‘vos’ ya escribes como español….

    • http://neobits.org hecky

      Yo le hago de todo, a veces de español “tio”, a veces de argentino “pibe” o lo que mas me gusta de colombiano “parcero” =P

      Pues lo creas o no, a muchos les costo varias horas, como varios eran estudiantes que no tenían idea de la Seg Informática por eso se hizo básico.

      Pero Joaquin ya me prometió el siguiente sera mas difícil para que llore. =S

      Mas aún por que me contaba que el hizo el reto de ESET en ekoparty y después de dos días nadie lo sacaba……Y bueno ekoparty es otro nivel.

      Gracias por leer mi resolucionario =)

      Saludos ;)

  • Komtec1

    el nivel 7 tenía un “bypass”; se podía poner cualquier variable y te mandab al final del reto donde decía que pidiera un papel para ingresar a la rifa:

    http://desafioseset.com/bug-con-challenge/comprobar.php?a=mail@mail.com&c=loqueseaponeraqui

    Yo igual lo resolvi como a la media hora que la cuenta de  @BugCon lo mostrara en twitter, fue entretenido, pero sencillo creo yo.

    Saludos bro, que estes de lo mejor :D

    Komtec1

    • http://neobits.org hecky

      Asi es Komtec1, es justo lo que mencionaba en rojo, sobre el bypass, realmente fue un error de diseño del reto, pero al final valido, yo creo por este bypass fue que muchos lo pasaron ;)

      Saludos y un gusto conocerte.

      • Komtec1

        No, es un bypass aparte del de 27 caracteres como lo mencionas ahí, podias poner 1, 2, 3, o x numero de caracteres entrando directamente al link.

        Saludos y también un gusto conocerte :D

        • http://neobits.org hecky

          Komtec1

          Te comento hablamos del mismo bypass =P Yo puse 27 por que el chavo que me informo sobre el bug me lo presento así con 27.

          Pero en si el bypass como bien tu lo dices lo puedes realizar con otras longitudes.Mi análisis vi que en algunas longitudes de la cadena pasaba lo siguiente:

          1)Te daba acceso Limpiamente
          2)Te daba acceso pero te decia “Datos Incorrectos”
          3)No te daba accesoMe “SUPONGO” depende de la funcion matematica y el “Modulo” % Habría que probar

          Saludos ;)

  • http://twitter.com/LesmoCasanova Sinuhé Coronel

    ¡Qué foto tan buena sacó mi Windows Phone! =PY sí, la verdad es que ese reto de ESET estuvo divertido… aunque claro, mucho de eso podía resolverse a pura consola JS del navegador (excepto por el bruteforce jeje).

    Malas noticias esas de que no te hiciste con la PS3. Ya algún día te llegará, al menos, un NES.

    • http://neobits.org hecky

      Douh!! Pues todo lo resolvimos por asi decirlo desde el navegador ;)

      Y no creiste me robaría todo el credito verdad h4x0r ? =PPPP Lastima que ya no viniste ayer, estuvo muy bueno.

      Jajaja no creo llegue ese dia =”(