martes, octubre 28, 2008

Solucionario Reto Hacking IX (I de II)
por Dani Kachakil

***************************************************************************************
Solucionario Reto Hacking IX (I de II) por Dani Kachakil
Solucionario Reto Hacking IX (II de II) por Dani Kachakil
***************************************************************************************
Introducción

Este documento describe una solución al Reto Hacking IX de Informática 64, el cuarto de la segunda temporada, que se publicó el 12 de septiembre de 2008 en la siguiente dirección web: http://retohacking9.elladodelmal.com

Pistas

De nuevo nos encontramos ante un reto en el que no hacen falta pistas, puesto que el objetivo estaba claro desde el principio. En todo caso, el título del post que anunciaba el reto (Hay que ser muy hombre o muy mujer) tenía mucha relación con el tema, en el sentido de que necesitaremos habilidades humanas para superar el reto, pero eso ve a posteriori y tampoco sirve de ayuda.

Visión general del reto

Tras darnos de alta y acceder con nuestro usuario registrado, nos encontramos ante el primer nivel de los 10 que forman el reto. Por el texto que aparece en cada nivel y por el propio título del reto podemos intuir que la cosa va de acertar captchas, nada menos que 1000 por cada nivel y en un plazo máximo de una hora que se empezaba a contar desde el primer acierto.

Con la habilidad suficiente tal vez no fuera imposible lograrlo a mano (con un promedio de 3,6 segundos por acierto), pero evidentemente se trataba de automatizar las peticiones, ya que hacerlo a mano resultaría un tanto aburrido y lento.

De todas formas, creo que en el planteamiento del reto no se tuvo en cuenta que prácticamente todos los niveles tenían una solución alternativa bastante más sencilla (o a lo mejor me equivoco), haciendo que el nivel 1 tuviera una solución idéntica a la del nivel 8. Por ello, explicaré la solución "oficial" por un lado y el atajo por otro (me imagino que éste último es el que utilizamos la mayoría de los participantes).

Nivel 1

Si le echamos un vistazo al código fuente de la página, veremos que el botón Enviar tiene asociada una pequeña función JavaScript llamada ValidateCaptcha, cuyo código aparece un poco más arriba. Simplificándola un poco, era similar a esta:

function ValidateCaptcha() {
if (document.getElementById('txtCaptcha').value == 'VSXVUTZQ') {
return true;
} else {
return false;
}
}


Bastaba con deshabilitar los scripts para que cada pulsación del botón Enviar contara como un acierto más. Además, la solución del captcha aparece en el propio código de la página como texto en claro, por lo que podríamos automatizar su lectura y su posterior envío a través del formulario.

Supongo que en este caso la solución "oficial" coincide con el atajo, es decir, capturar y reenviar 1000 veces la misma petición, manteniendo los valores asociados a los parámetros relevantes que se enviaban por post y la cookie de autenticación:

__VIEWSTATE = /wEPDwUKMTEwNjI0MjY0MQ9kFgJmD2QWAgIDD2QWAgIB ...
__EVENTVALIDATION = /wEWBAKt2PnGBQKsoYL1DwK15qaS ...
ctl00$ContentPlaceHolder1$btEnviar = Enviar

.ASPXAUTH = 4A4AD74485F839D53AC26F746FCBA03A14F63307CC4971 ...


Evidentemente, cada cual opta por las herramientas con las que se siente más cómodo, así que hay cientos de formas de automatizar esta tarea. En mi caso adapté parte del código que ya tenía hecho hace mucho tiempo y que incorporé en Marathon Tool (principalmente la función Download de BaseEngine.vb). Lo importante es que, transcurridos unos minutos dedicados a enviar las 1000 peticiones necesarias, pasamos automáticamente al siguiente nivel.

Nivel 2

Muy similar al nivel anterior, en esta ocasión nos encontramos con un campo oculto con la solución al captcha:

input name="ctl00$ContentPlaceHolder1$_valor" type="hidden"
id="ctl00_ContentPlaceHolder1__valor" value="VSXVUTZQ"


De nuevo, podíamos haber leído y reenviado el valor que se almacenaba en este campo, pero bastaba con repetir exactamente el mismo procedimiento del nivel 1, evitando el envío del parámetro ctl00$ContentPlaceHolder1$_valor (o en general, haciendo que coincida con el valor de ctl00$ContentPlaceHolder1$txtCaptcha)

Nivel 3

En esta ocasión, por ejemplo para el captcha "UWPCTNUU", nos encontramos con una cookie como la siguiente:

valor = 55575043544e5555

Es evidente que se trata de los valores ASCII de cada carácter del captcha, puestos en valor en hexadecimal y concatenados. Por ejemplo, en la secuencia anterior tenemos que 0x55 = "U", 0x57 = "W", 0x50 = "P", etc.

Podíamos optar por leer y convertir estos valores en sus correspondientes caracteres para decodificar el captcha de forma automatizada, pero de nuevo bastaba con repetir exactamente el mismo procedimiento del nivel 1, enviando además una cookie llamada valor con su contenido en blanco.

Nivel 4

Este nivel puede parecer incluso más fácil que el anterior, puesto que el nombre de la imagen corresponde con el valor del captcha mostrado:

img id="ctl00_ContentPlaceHolder1_ImgCapcha"
src="imagenes/DVNZVSHC.gif"


Sin embargo, se trata del primer nivel que realmente obliga a la lectura de este valor y a su posterior reenvío, por lo que tras realizar una petición inicial, procesaremos el contenido de la página para extraer el captcha (por ejemplo, buscando la posición de la primera aparición de la cadena ".gif" y recuperando los 8 caracteres anteriores). En la petición siguiente lo enviamos por POST en ctl00$ContentPlaceHolder1$txtCaptcha, leyendo de paso el nuevo captcha generado y así sucesivamente hasta llegar a completar las 1000 peticiones (sin olvidarnos de la cookie ASP.NET_SessionId).

Nivel 5

En este nivel observamos que hay un parámetro en la URL llamado key. Su longitud coincide con la de los captchas que han ido apareciendo hasta el momento:

http://retohacking9.elladodelmal.com/Niveles/Nivel05/Default.aspx?key=ONOATHZK

Podemos molestarnos en intentar averiguar la relación entre esa clave y el correspondiente captcha generado, pero es totalmente innecesario, ya que de nuevo podemos reenviar 1000 veces cualquier petición válida y superaremos el nivel…

De todas formas, supongo que la solución oficial era la primera, así que la expongo aquí porque la relación es muy fácil de obtener. Por ejemplo:

Key = AAAAAAAA –> Captcha = OAPSUNMO
Key = BBBBBBBB –> Captcha = PBQTVONP
Key = CCCCCCCC –> Captcha = QCRUWPOQ


Es evidente que existe una relación lineal entre cada carácter, por lo que basta con desplazar el alfabeto las siguientes posiciones respectivamente (es decir, se trata de un clásico y simple cifrado de Vigenère):

14, 0, 15, 18, 20, 13, 12, 14

***************************************************************************************
Solucionario Reto Hacking IX (I de II) por Dani Kachakil
Solucionario Reto Hacking IX (II de II) por Dani Kachakil
***************************************************************************************

3 comentarios:

  1. Es cierto, la mitad de los niveles se podían resolver de la misma manera, reenviar el mismo paquete y listos, perdía un poco la gracia.

    ResponderEliminar
  2. ey, asi anulando la función, asi de facil? andaba?
    yo queria hacer, y de paso, como se hace una funcion javascript que tenga un ciclo for de 1 a 1000, donde le digo que tome el valor de la pagina y lo mande al form?
    tipo que adentro del ciclo tome el value mostrado del captcha y lo meta en el formulario
    eso se puede hacer?
    quiza sea una boludez y engorroso para este caso, pero como sería, para otro caso?
    ;-)
    graacias, expertos!
    alexa
    vengo como anonimo, porque no le gustan mis comentarios, todos malformados, error 400, qeu cambio hiciste?

    ResponderEliminar
  3. omg, has pasado del millón de visitas, ¿hay que hacer fiesta o algo, no?

    ResponderEliminar