Nivel 2: Is anybody there?

«Hello 123.123.123.123? Is anybody there?» Así reza la primera línea de texto de la prueba 3 (nivel 2). Parece que el servidor quiere comunicarse con nosotros. Si analizamos las cabeceras HTTP con algún programa (por ejemplo, con el plugin LiveHTTPHeaders), podremos ver lo siguiente:

HTTP/1.x 200 OK Date: Fri, 08 May 2009 22:16:08 GMT Server: Apache/2.0.52 (CentOS) X-Powered-By: PHP/4.3.9 YouWillNeedThis: theplanet Set-Cookie: toctoctoc=3306 Content-Length: 232 Connection: close Content-Type: text/html

«YouWillNeedThis: theplanet»… curiosa cabecera 😉 Esa pista la necesitaremos en el futuro. Y el nombre de la cookie es auto-explicativa: el servidor nos está llamando. ¿A dónde? Al puerto 3306. Ese puerto es conocido, ahí suele estar a la escucha el servidor MySQL. No hay que pensar mucho más… aunque a algunos grupos esta prueba se les hizo cuesta arriba, jejeje…

Con Wireshark es posible capturar la trama que nos confirma ese intento de conexión. ¿Abrimos el puerto 3306 a ver qué pasa?

$ nc -l 3306

Recargamos la página y… nada, no conecta. La conexión se resetea. Parece que tiene que haber un servidor MySQL de verdad escuchando en el 3306 (no vale con netcat). Ponemos en marcha MySQL, recargamos la página y… nada. Mmmh…

Aquí hay que pensar un poco (más). Por seguridad, MySQL sólo se queda a la escucha a las peticiones que lleguen de localhost (127.0.0.1). Esto se define así en /etc/my.cnf :

bind-address = 127.0.0.1

Si queremos que escuche las peticiones de nuestra IP pública, sólo tenemos que ponerlo.

bind-address = nuestra_IP_publica

Ponemos en marcha de nuevo el servidor: $ sudo /etc/init.d/mysql start

y el Wireshark a la escucha. Bingo.

Sabemos que el login es «hack». ¿Y el password? Bueno, aquí es donde la pista que nos llegó al principio nos ilumina el camino: theplanet. La forma más fácil de proceder ahora sería crear el usuario hack/theplanet y volver a recargar la página. Analizando el tráfico con Wireshark veremos que intenta usar la base de datos hackit. A continuación lanza la query: insert into pereza set ID='', hackme='%5f%61%63%69%64%69%61%5f'

¡Ajá! ¿y para traducir de Hexa a ASCII?

$ echo -e «%5f%61%63%69%64%69%61%5f» | sed -e ‘s/%//g’ | xxd -r -p acidia

Brasero dando la brasa

Lo siento por el título, pero no he podido evitar el chiste fácil 🙂

El programa de grabación de CD/DVDs de GNOME aparecía una y otra vez en el update-manager de Ubuntu 9.04. Y no había forma de deshacerse de él: no podía actualizar ni borrarlo, ni nada de nada. Realmente no afectaba a mi trabajo pero ese tipo de detalles al final es como una gota de agua que va cayendo y cayendo, golpeando siempre en el mismo sitio. Te va quemando…

El caso es que es un bug reconocido de Ubuntu 9.04, y ya hay un «parche» manual para que el update-manager aparezca limpio y reluciente (al parecer Brasero tiene un conflicto con nautilus-cd-burner, de ahí que borrando este último y luego actualizando, Brasero se instale sin problemas):

$ sudo apt-get remove nautilus-cd-burner $ sudo apt-get dist-upgrade

Ale, un picor menos.

Nivel 1: hidden message

Esta prueba 2 (nivel 1) ha resultado ser la que más fácilmente han superado los participantes. Al entrar, lo primero que vemos es un enlace a un fichero de texto con el título «Hidden Message». El contenido a primera vista es vacío… pero si realizamos una selección con el ratón veremos que está lleno de espacios en blanco. Cada línea tiene un número distinto de espacios en blanco (entre 65 y 120) Esos números nos deben de hacer sospechar que representan caracteres ASCII. Basta por tanto con contar los espacios en blanco de cada línea, codificarlos a los caracteres correspondientes y leer el mensaje: «The Seven Deadly Sins and the Four Last Things: Pass: CAVE CAVE DEUS VIDET«

Por ejemplo, este método Java descodificaría el mensaje de blancos que le llega como parámetro: public static String descodificar(String mensaje){ String res = ""; Scanner s = new Scanner(mensaje); s.useDelimiter("n"); while (s.hasNext()){ String espaciosLinea = s.next(); char c = (char) espaciosLinea.length(); res = res + "" + c; }</p> <pre><code> return res; }

Nivel 0: dc

Como dice la Wikipedia, dc es una calculadora de escritorio, en modo comando, multi-plataforma, que sigue una notación polaca-inversa, con soporte de precisión aritmética ilimitada. Es una de las utilidades Unix más antiguas que existen, más aún que el propio lenguaje C (o sea, de la época de los dinosaurios, más o menos 😉 Como muchas otras utilidades de esa añada, posee un extraordinario conjunto de funcionalidades pero su sintáxis es críptica como ella sola. Bien, ¿a qué viene todo esto? A que la primera prueba del HackIt Tolosa’09 (la prueba 0) hace uso de un truco para codificar cadenas de caracteres usando dc. Si abrimos la página del nivel 0, veremos que se nos muestra esta secuencia de comandos dc:

[q]sa[ln0=aln256%Pln256/snlbx]sb3135071790101768542287578439snlbxq

Al ejecutarla : echo ‘[q]sa[ln0=aln256%Pln256/snlbx]sb3135071790101768542287578439snlbxq ‘ | dc

Nos muestra la cadena: GET A LIFE!

Alguno de los participantes se tiró un buen rato probando esta cadena de caracteres como clave (en todas su posibles modalidades, ¿a que sí, ochoto? 🙂 Incluso analizando paso a paso lo que hace (un buen ejercicio que os recomiendo y que incluso xabi nos podrá mostrar).

El caso es que esa no era la solución. Si nos fijamos en el código fuente HTML de esa misma página, y nos desplazamos hacia la derecha (scroll), veremos que como comentario, aparece esta otra cadena:

16i[q]sa[ln0=aln100%Pln100/snlbx]sbA0D4D465452snlb xq

Siguiendo el mismo procedimiento que antes, obtenemos la clave para el siguiente nivel: «RTFM», o sea, Read The … er… FINE ? .. Manual 🙂

¿Que quieres escribir tus propias frases codificándolas con dc? No hay problema.