martes, 8 de enero de 2013

Mi solución al Holiday Challenge 2012, parte 1

Nuestro objetivo es superar los distintos niveles de acceso a las máquinas de control del tiempo de los hermanos Snow Miser, señor de las nieves, y Heat Miser, señor del calor, para apagarlas, de forma que las condiciones ambientales de sus feudos se intercambien. La historia precedente y que nos convierte en abanderados de Santa Claus obstinados en salvar la Navidad puede disfrutarse en la página del Challenge.

Con tamaña responsabilidad - mi hija nunca me perdonaría no haberlo al menos intentado - y armado con mi cabezonería y las pistas dejadas por ambos hermanos en sus respectivas cuentas de twitter éste es el resumen de mis andanzas.

¡A por el SCADA de Heat Miser!

El interfaz es muy sencillo, los enlaces a los distintos niveles en la parte izquierda y un mensaje disuasorio en el centro bajo el que se sitúa el mecanismo correspondiente al nivel y que uno tras otro nos permitirán "apagar" la máquina de control del tiempo.


Lo primero anotar el flag, "oculto" en el código fuente html de la página (botón derecho, ver código fuente), y que para éste nivel 0 de sólo lectura es:
<!-- The flag for this level is 1732bcff12e6550ff9ea44d594001418 -->

Si leemos la nota HMISER:

We had a security concern where the Zone 1 URL ended up in search engine results. We added a file to prevent the search engines from caching these pages. The system is now secure an no unauthorized users have access to the URL.

Que traduciendo viene a querer decir que tienen miedo que el enlace acabe siendo cacheado por un motor de búsqueda (léase Google, Yahoo, etc) y por lo tanto han incluido un fichero robots.txt para evitar el acceso al mismo. Confirmamos nuestra suposición accediendo a su contenido aquí:
User-agent: *
Disallow: /zone-1-E919DBF1-E4FA-4141-97C4-3F38693D2161
Disallow: /zone-2-*
Disallow: /zone-3-*
Disallow: /zone-4-*
Disallow: /zone-5-*

¡Ya tenemos el enlace para la zona 1!

Heat Miser Zone 1

El interfaz es igual al anterior sólo que incluye el enlace ya descubierto y unos botones que, teóricamente, permiten activar y desactivar el mecanismo de la máquina de control del tiempo correspondiente al nivel.


La nota HMISER menciona algunos problemas con el enlace al siguiente nivel que les han obligado a deshabilitarlo, lo cual no parece ayudarnos mucho. Lo que está claro es que necesitamos el flag así que de nuevo analizamos el código fuente y, ¡sorpresa!, tenemos el flag:
<!-- The flag for this level is d8c94233daef256c42bb95bd61382e02 -->

y en enlace al siguiente nivel oculto en los comentarios del código HTML. Vamos ahora a por la zona 2.

Heat Miser Zone 2

De nuevo un interfaz similar al anterior:


En este caso la nota HMISER nos proporciona la primera parte del enlace:
zone-3-83FEE8BE-B1C6-4395-A56A-XXXXXXXXXXXX

y un aviso indicando que si se nos ocurre utilizar fuerza bruta para inferir la parte restante nos podemos hacer viejos antes de conseguirlo. Vamos a obtener el flag y ver si por el código fuente suena de nuevo la flauta:
<!-- The flag for this level is ef963731de7e886226fe4a6a6c2971f1 -->

Nada en el código fuente html, nada en el código fuente de los CSS, nada accionando los botones del formulario ... vamos a consultar los tweets de @h34t_m1s3r:


La contestacion de @sn0w_m1s3r nos dá la clave. Si observamos bien la imagen parece como si apareciera reflejada la pantalla de un monitor:


Si jugamos con las curvas de luminosidad utilizando algun programa de edición de gráficos obtenemos la parte que falta:


Ya tenemos el enlace para la zona 3.

Heat Miser Zone 3 y Zone 4

Este nivel resulta curioso dado que ya incluye el enlace para la siguiente zona:


Pero claro, tenía que tener truco. Si intentamos acceder a la zona 4 nos redirige a un mensaje de acceso denegado:


Antes de continuar obtenemos el flag para el nivel actual:
<!-- The flag for this level is 0d524fb8d8f9f88eb9da5b286661a824 -->

Revisando las preguntas que había que resolver acerca del challenge se menciona explícitamente un error de programación que nos permitiría obtener directamente el enlace para la zona 5. Si a esto le sumamos el siguiente tweet:


y la imagen que en él se enlaza:


el panorama se aclara bastante. Utilizando como proxy Burp Suite configurado para interceptar también las respuestas del servidor y accediendo nuevamente a través de él observamos que antes de efectuarse la redirección aparece el contenido completo de la zona 4, que no es mostrado por el navegador. Más información acerca del fallo en: "Why I have to call 'exit' after redirection through header('Location..') in PHP?".

Así que de un plumazo obtenemos el flag para la zona 4:
<!-- The flag for this level is e3ae414e6d428c3b0c7cff03783e305f -->

y el enlace para poder acceder a la zona 5.

Heat Miser Zone 5

Al intentar acceder a la url obtenida en el nivel anterior siempre nos lleva a la siguiente página:


Revisando nuevamente las preguntas acerca del challenge obtenemos una pista: How did you manipulate the cookie to get to Zone 5 of Heat Miser's Control System?

Así que tenemos que manipular una cookie para poder resolver este último nivel. Lo primero es buscarla utilizando, por ejemplo, el plugin de firefox Cookies Manager+:
Nombre: UID
Contenido: b8c37e33defde51cf91e1e03e51657da
Servidor: heatmiser.counterhack.com
Ruta: /zone-5-15614E3A-CEA7-4A28-A85A-D688CC418287/
Enviar para: Cualquier tipo de conexion
Http Only: No
Expira: at end of session

Si hacemos una búsqueda del hash incluido en la cookie utilizando Google llegaremos al site MD5 Rainbow con lo que obtendremos el texto en claro asociado al hash (1001) y el algoritmo utilizado para su obtención (md5).

Después de un par de pruebas infructuosas utilizando diferentes valores para generar el hash manualmente decido hacer un script en python que genere ordenadamente las cookies y analice los resultados obtenidos hasta encontrar el valor adecuado; vamos, lo que viene siendo un ataque de fuerza bruta a la cookie. El script lo puedes descargar desde aqui (tambien funciona desde Windows) y el siguiente es el resultado de su ejecución:
$ python hm_zone5.py 
[+] Trying md5(0)=cfcd208495d565ef66e7dff9f98764da
[+] Trying md5(1)=c4ca4238a0b923820dcc509a6f75849b
[*] I've got it!
[*] The flag for this level is f478c549e37fa33467241d847f862e6f

Suerte que no tuvo que probar con muchos hashes. El acceso al "SCADA de Snow Miser" en unos días :)