Solución al reto 5 de la Copa del Mundo

La Roja cumplió a su llegada, se dio un gran baño de multitudes y paseó la Copa del Mundo por las abarrotadas calles de Madrid. La consecución de un sueño merecía un recibimiento así y un final de fiesta que se prolongó hasta altas horas de la madrugada. Un montón de anécdotas y un recuerdo inolvidable. El Mundial llegó a su fin.

Toca pasar página (¡y qué página!) y queremos cerrarla precisamente con la publicación del solucionario del último reto ambientado en la Copa del Mundo de Hackplayers.

A continuación, os mostraremos varias soluciones, distintas maneras para conseguir que nuestro enviado especial en Sudáfrica nos dijera la contraseña…

Solución 1 – viajando virtualmente a Sudáfrica


Lo primero que nos llama la atención al abrir el post, a parte del insoportable sonido de la vuvuzela :-), es el lanzamiento de un nuevo script en otra localización. Este será fácilmente detectable si tenéis algún tipo de control en el navegador como el indispensable NoScript en nuestro Firefox:


Como podéis ver, el script que intenta cargar se sitúa en el dominio geoplugin.net. Si investigamos un poco, podemos ver que se trata de un proveedor que ofrece servicios de geolocalización, por lo que seguramente el post utiliza alguna de sus funciones para reconocer de dónde viene la IP del visitante.

Sabiendo esto y leyendo un poco la descripción del reto (“…, por lo que es necesario trasladarse al mismísimo Sudáfrica.”), en seguida comprenderéis qué hace falta hacer para que nuestro agente secreto nos diga la contraseña: tenemos que acceder al post del blog con una IP de Sudáfrica.

Simplemente buscamos un proxy anónimo situado en ese país, configuramos nuestro navegador para utilizarlo y vemos los resultados:



Solución 2 – viendo el código generado por el post

Ya tenemos la clave de nuestro amigo, pero aún así vamos a profundizar un poco más en el funcionamiento del reto.

Para ello vamos a ver el código fuente del post, intentando identificar dónde se llama al script de geolocalización, dónde se cargan las funciones y cómo se muestra la frase secreta una vez que lo visitamos ‘virtualmente’ desde Sudáfrica.

Cuando veamos el código fuente de la página, nos llamará enseguida la atención dos javascripts ofuscados:

<script language="Javascript">document.write(unescape('%3C%73%63%72%69%70%74%20%6C%61%6E%67%75%61%67%65%3D%22%4A%61%76%61%53%63%72%69%70%74%22%20%73%72%63%3D%22%68%74%74%70%3A%2F%2F%77%77%77%2E%67%65%6F%70%6C%75%67%69%6E%2E%6E%65%74%2F%6A%61%76%61%73%63%72%69%70%74%2E%67%70%22%20%74%79%70%65%3D%22%74%65%78%74%2F%6A%61%76%61%73%63%72%69%70%74%22%3E%3C%2F%73%63%72%69%70%74%3E'));</script>

<script language="Javascript">document.write(unescape('%3C%53%43%52%49%50%54%20%6C%61%6E%67%75%61%67%65%3D%22%4A%61%76%61%53%63%72%69%70%74%22%3E%0A%69%66%20%28%67%65%6F%70%6C%75%67%69%6E%5F%63%6F%75%6E%74%72%79%4E%61%6D%65%28%29%3D%3D%22%53%6F%75%74%68%20%41%66%72%69%63%61%22%29%0A%7B%20%0A%73%65%6D%69%66%69%6E%61%6C%69%73%74%61%73%20%3D%20%5B%20%22%55%72%75%67%75%61%79%61%6E%22%2C%20%22%44%75%74%63%68%22%2C%20%22%47%65%72%6D%61%6E%22%2C%20%22%53%70%61%6E%69%73%68%22%20%5D%0A%76%61%72%20%67%61%6E%61%64%6F%72%20%3D%20%73%65%6D%69%66%69%6E%61%6C%69%73%74%61%73%5B%4D%61%74%68%2E%66%6C%6F%6F%72%28%4D%61%74%68%2E%72%61%6E%64%6F%6D%28%29%2A%73%65%6D%69%66%69%6E%61%6C%69%73%74%61%73%2E%6C%65%6E%67%74%68%29%5D%20%0A%64%6F%63%75%6D%65%6E%74%2E%77%72%69%74%65%28%22%48%69%20%67%75%79%21%20%22%20%2B%20%67%61%6E%61%64%6F%72%20%2B%20%22%3F%20%67%6F%6F%64%20%6D%61%74%63%68%21%20%4F%6B%2C%20%6F%6B%20%2E%2E%20%74%68%65%20%73%65%63%72%65%74%20%77%6F%72%64%20%69%73%20%27%4D%61%64%69%76%61%31%39%31%38%27%22%20%29%3B%20%0A%3C%21%2D%2D%20%61%6E%64%20%74%68%65%20%73%65%63%6F%6E%64%20%73%65%63%72%65%74%20%77%6F%72%64%20%69%73%2E%2E%2E%20%27%4B%72%6F%6D%64%72%61%61%69%27%20%2D%2D%3E%0A%7D%0A%3C%2F%53%43%52%49%50%54%3E'));</script>

¿Podríamos saber la contraseña sin visitar el blog desde un proxy de Sudáfrica? La respuesta es sí, viendo el código generado en el navegador.

Para ello vamos a empezar utilizando una extensión de Firefox bastante útil: Javascript Deobfuscator, que inyectará una dll en el proceso del navegador, ‘hookeará’ funciones como document.write, eval o unescape y reformateará el código para ser más legible.

No hay nada como verlo funcionando. Primero veremos la llamada al javascript externo de localización y luego el código embebido en la página:


Otra opción, más sencilla y más eficaz, es ver el HTML generado en nuestro navegador por ejemplo con la extensión WebDeveloper. Simplemente marca la opción “Ver código generado”:


Y busca la contraseña:


Existen más herramientas/plugins que podrían ayudarnos a obtener el código de esta manera. ¿Habéis elegido otro vosotros? ¿Os habéis fijado también que Webdeveloper muestra un comentario con una segunda contraseña (‘Komdraai’) que no se había mostrado con los dos métodos anteriores?

Solución 3 – desofuscando el código a parte

Y por último vamos a ir más allá. Vamos a intentar desofuscar el código sin tanto Firefox, de una forma más directa y segura: separando el motor de JS del navegador.

NJS, SpiderMonkey o Rhino nos valdrían para este propósito.

En nuestro ejemplo utilizaremos Rhino, o lo que es lo mismo, un motor de javascript implementado en Java.

Sustituimos la función ‘unescape’ por ‘print’:


Y por arte de magia:


Las conclusiones

Tened en cuenta que ejecutar javascripts siempre es peligroso, aún proviniendo de una fuente confiable, porque esta podría haber sido comprometida. La “moraleja” de este reto es precisamente eso. Fijaros que en el primer caso NoScript nos alertaba de la llamada a un script en otra ubicación (geoplugin.net), pero el código del segundo script estaba ya insertado directamente entre el HTML del post (blogger.com) y muy probablemente ya lo habríais ejecutado. Imaginaros si hubiese sido contenido malicioso…

1- Hoy en día ‘los malos’ tienen por costumbre comprometer sitios webs vulnerables e insertar su código para colar malware a sus visitantes. O eso o se crean sitios web falsos visitables por medio de técnicas de phising y SEO.

2- Se aprovechan de vulnerabilidades conocidas e incluso 0-days y son capaces de lanzar los exploits sin ni siquiera requerir la interacción del usuario, simplemente por el hecho de visitar el sitio malicioso o comprometido (drive-by download).

3- Evidentemente no quieren que los sistemas de seguridad detecten sus exploits y tienden a ofuscar su código.

Y para finalizar, si alguno le picó la seguridad (qué seguro que sí) y se preguntó cómo se había ofuscado el código del reto, la respuesta es a través de iWebtool:


Esto es todo. Muchas gracias a todos los que habéis leído/resuelto el reto, con especial mención a Thor.

Comentarios