jueves, 5 de febrero de 2009

How to pass the "JSL 2008 Colombian Wargame"


RETO INFORMÁTICO JSL 2008


Hace algunos días publiqué una invitación para participar en un reto informático (a.k.a wargame) relacionado con herramientas libres y la comunidad de software libre colombiana, hubo buena acogida por parte de los "linuxeros" y aproximadamente jugaron 45 personas. De esas 45 personas 13 se mantuvieron constantes y antes de bajar el juego (1 mes después) ya teníamos un ganador.

En este post quiero hacer un resumen/solución del reto para los que no pudieron pasar del primer nivel y para los que no entendieron algunos de los niveles. Esperemos que para las JSL 2009 podamos organizar un mejor juego, para que todos puedan participar durante el evento.

El reto tenia preguntas (xa) que se resolvían desde la web (las fáciles) y para otras (xb) era necesario loguearse en un sistema Debian Linux y analizar las pistas y los archivos en los homes de los respectivos usuarios (las medianamente complicadas). El acceso se hacia por SSH y las credenciales de acceso se daban a medida que se avanzaba en el juego.

Bueno, hablemos de las soluciones:


NIVEL 1a - LOS AUSENTES


La respuesta a este nivel es muy sencilla, solo es ubicar a los personajes de la fotografía (tomada en las JSL 2007) e investigar sus nicks. Este reto se podía resolver buscando en los facebooks, en los blogs, comentarios en las fotos o tags en cualquier otro lugar donde se publiquen fotos.
También preguntando en la lista de colibrí o inclusive preguntándome a mi por esos señores.

Los personajes son: cybux, kleper y ederaam, 3 miembros de la comunidad de SL residentes en Medellín. Luego solo era hacer las variaciones posibles para encontrar la clave.


NIVEL 1b - EL ALIAS

Una vez logueado en el sistema con el usuario que aparece en este nivel, encontramos un archivos de pistas:
1. El nombre del alias de la conexion
2. Conexion = Interfaz 3. DNS local
Estas pistas para muchos fueron bastantes confusas, para otros también ;)
Para resolver este nivel debíamos pensar las pistas en orden.

El alias de una conexión es conocida como una interfase virtual, en linux se pueden crear con el comando:
#ifconfig eth0:0 x.x.x.x up
Suponiendo que eth0 es la interfaz principal. Cuando se usa el comando "ifconfig" se observa esta nueva interfaz también.


Conexión es igual a interfaz, aplica para la pista 1.

El DNS local en un sistema unix, es la forma como el resolver puede traducir nombres a direcciones IP, normalmente primero buscará en el archivo /etc/hosts y luego le preguntará a un servidor DNS matriculado en /etc/resolv.conf.

La respuesta estaba en el archivo /etc/hosts, y la pista era buscar el nombre que tuviera asociado la interfaz virtual (alias) de la interfaz principal.

Eso era todo.



NIVEL 2a - ANTISPAM

Cuando hablan de nuestro wiki, hablan del wiki principal de la comunidad colombiana de software libre , una vez allí se debe analizar que el sistema que se implementa es el archi reconocido MoinMoin, el cual en sus versiones mas recientes tiene unas caracteristicas de antispam. El sistema antispam del wiki consiste en que cada vez que un usuario quiere hacer una entrada, se le hará una pregunta y si la respuesta es correcta se asume que el que contesto es un humano y no es un spambot o algo similar tratando de llenar el wiki de tonterías.
Como las preguntas no son infinitas entonces la idea es hacer unas cuantas pruebas de escritura y verificar las preguntas que salen, en poco tiempo te darás cuenta que hay algunas que aparecen mas veces. la respuesta al reto es una de esas respuestas que se repite con regularidad.


NIVEL 2b - ENCUENTRALO

La pista de este nivel es: "El que busca encuentra", adicional a esto hay un archivo nivel2.jsl (lo puedes descargar en la sección de archivos).
La forma de solucionarlo es primero verificar de que archivo se trata, luego intentar leerlo y nos damos cuenta que es un archivo con el formato del software inkscape, por lo tanto nuestra solución puede ser:

1. Abrir el archivo con el programa inkscape


y luego tratar de limpiar todo lo que no nos sirve, eliminar recuadros, poner la vista solo en contornos, organizar las letras, etc. Hasta que encontremos un recuadro donde esta la frase que contiene la clave.

2.Hacer búsquedas aleatorias tratando de hallar la clave (así como se ve en la imagen)


Podemos usar el comando grep para buscar la palabra "clave", de esta forma se resuelve el ejercicio mas rápido.

NIVEL 3a - LISTA DE CORREOS

La solución a este nivel es más fácil de lo que todos creían. Algunos lo resolvieron a fuerza bruta, tratando de adivinar cuantos mensajes había en la lista en ese mes, otros simplemente buscaron el historial de la lista y ubicaron el mes de Julio:

http://listas.el-directorio.org/pipermail/colibri/2008-July/date.html

Ahí mismo aparece la respuesta.

NIVEL 3b - DISPOSITIVOS DE ENTRADA


El nivel 3 de este wargame nos pide encontrar una clave y como pista nos hablan de los dispositivos de entrada, además nos mencionan las X. Como todos sabemos las X en los sistemas Unix representan la interfaz gráfica, por lo tanto pensamos que los dispositivos de entrada son el mouse y el teclado.

Del xorg.conf:

Section "InputDevice"
Identifier "Generic Keyboard"
Driver "cla"
Option "CoreKeyboard"
Option "XkbRules" "xorg"
Option "XkbModel" "pc104"
Option "XkbLayout" "us"
EndSection

Section "InputDevice"
Identifier "Configured Mouse"
Driver "ve"
Option "CorePointer"
Option "Device" "/dev/input/mice"
Option "Protocol" "ImPS/2"
Option "Emulate3Buttons" "true"
EndSection
Si vamos a la sección adecuada en el archivo de configuración: /etc/X11/xorg.conf podemos encontrar muy fácilmente las pistas necesarias para hayar la clave.



NIVEL 4a - RETO GEEK

Esta pregunta requiere un poco de observación, por eso las gafas (lentes) en la imagen.
Nos están hablando de un reto geek, y nos aclaran que no es este reto de las JSL, entonces cual era?. La solución era buscar en google, o recordar un proyecto que iniciaron algunas personas de la comunidad hace algún tiempo, el personaje de la caricatura tiene unas gafas tipo nerd y el sitio web tiene un "reto geek". Para los que todavía no dan con el chiste, se trata de www.cibertito.com, visitenlo y prueben el reto.


NIVEL 4b - COORDENADAS

Para resolver este nivel hace falta un poco de imaginación, pero la verdad es bastante simple.
Una vez ingreses al sistemas con las credenciales asignadas, veras una pista que dice:

1. Coordenadas de la proxima clave: 707, 7
Desde ahi se puede deducir que o hace parte de unas coordenadas o son permisos al estilo Unix (rwx-rwx-rwx). Si observamos los permisos del archivo que aparece en el home (nivel4.jsl) nos damos cuenta que solo tenemos permisos para leer el archivo desde root.

Entonces que hacemos?

Intentamos visualizar el archivo con cat, more, less y todos nos sacan un error de permisos (NO tenemos permisos para leerlo), pero que tal si probamos con los comandos cut, tail y head?


con el comando head podemos visualizar algo y encontramos un archivo con el siguiente formato:

...
Linuxant:Linuxbar:LinuxCol:Linux En-Caja:LIUDECX:Lix S.G.:Lugula:Minka-Ecci
Merlinux:Mono Colombia:NEBLINUX:OpenBSD Colombia:PIX-UDEC:PLUG:POLUX:POLLUX
PUJCLUE:PULPA:Python Colombia:Slackware Colombia:SLEC:Slow:Sl-prog:SLUMB
TESIS:UNALIX:Ubuntu Colombian Team:USB-Linux:Vultur:XUE-LINUX:Slibant
join:us:now:and:share:the:software:you:free:share:Abacux
ACLibre:Altred:ANIMAZIONE:Arca-csl:AsOfT-ExNeT:BogJBug:CAFEBUG:
CaliLUG:Calix:Camayihi:CETISOFT:CINS (SENA):ChampeTUX:Cununo:CUSOL-UIS
...
El archivo contiene un listado de los grupos de S.L. del país que se repite una y otra vez. Si bien esto no nos sirve de nada, podemos recordar que el movimiento de S.L. sigue vigente en Colombia (esta lista fue sacada del sitio: el-directorio.org).

Que tal si ese 707, 7 son unas coordenadas para el archivo?, las lineas del archivo estan separadas por el caracter ":", entonces contemos 707 lineas y 7 campos separados con ":".

nando$ ls
m.sql nivel4.jsl nivel4.jsl.save pista.txt
nando$ file nivel4.jsl
nivel4.jsl: ASCII text
nando$ head -707 nivel4.jsl | tail -1 | cut -f7 -d:
kratux

nando$

He ahí la respuesta :p


NIVEL 5a - PINGUINOS

Esta pregunta es una de las más fáciles, nos muestran una imagen de un pinguino, que hace parte del logo del grupo CUSOL, si analizamos la pregunta, podemos pensar que estan hablando de ese pinguino. Y buscando un poco acerca de pinguinos (diferentes a TUX), encontramos que ese es un pinguino emperador.


NIVEL 5b - ADIVINANDO?

Para resolver este nivel le prestamos atención a la pregunta que se hace en la pista:
1. Adivinando?
Como siempre verificamos el archivo que esta en el home y nos damos cuenta que es un script en python pero compilado, asi que no tenemos el código fuente directamente. Intentamos ejecutarlo y observar el funcionamiento, al parecer debemos adivinar una secuencia de numeros para poder pasar el reto.

Si intentamos un poco de reversing básico, usando el comando "strings", no vemos nada raro, entonces que hacemos?

Este nivel se puede solucionar de varias formas, dos de ellas son:

1. Intentar adivinar la secuencia (ensayo y error), esta técnica funciona cuando los algoritmos son simples o cuando se tuvo un error en la programación, que lo hace vulnerable en la generación de la secuencia. (este fue el caso del ejercicio)

2. Usar un decompilador de python, lo que requiere un poco mas de conocimiento o si tenemos la suerte que el archivo pese menos de 5KB, podemos ayudarnos del servicio devpython y obtener algo así:

decompile /tmp/upload/20090208185201_757.pyo...
#! /usr/bin/env python
# emacs-mode: -*- python-*-
# -*- coding: utf-8 -*-

import random
o = 'r'
jka = 'e'
pl = 'goc'
koolpl = 'CINS'
poa = 'clavemaster'
pla = 'UT4'
baaa = 'UrbanTerror'
qq = '0rp'
try:
a = int(raw_input('Ingrese un numero: '))
for valor in [1,
2,
3,
4,
5,
6,
7,
8,
9]:
print ((((a * 7) - (a - 3)) + pow(a, 2)) + valor)
a = (a + 2)

respuesta = ((((a * 7) - (a - 3)) + pow(a, 2)) + 10)
entrada = int(raw_input('Cual es el siguiente: '))
if (entrada == respuesta):
clave = (((o + jka) + pl) + qq)
print ('Affirmative!, la clave es: %s' % clave)
else:
print 'Negative!'
except:
mensaje = random.randint(1, 6)
if (mensaje == 1):
print "Double time, let's move!"
elif (mensaje == 2):
print 'Go for the objective.'
elif (mensaje == 3):
print 'Stick with me.'
elif (mensaje == 4):
print 'Hold your position.'
elif (mensaje == 5):
print 'I need a medic!'
elif (mensaje == 6):
print 'Where are the medics'

# local variables:
# tab-width: 4
depythoned 1 files: 1 okay, 0 failed
Siguiendo el código fuente es mas fácil saber que es lo que hace y cual es la respuesta ;)


NIVEL 6a - INVITADO ESPECIAL

Leyendo la programación de las JSL 2008, nos damos cuenta que habia un invitado especial, la respuesta era casi obvia ;)

NIVEL 6b - INGENIERIA INVERSA?

La pista de este nivel es otra pregunta:
1. Ingenieria Inversa?
Es posible que muchos hayan afrontado el problema tratando de reversar el archivo nivel6.jsl, sin embargo haciendo un analisis mínimo sobre el tipo de archivo (comando file), nos dabamos cuenta que era un archivo de audio codificado en OGG, por lo tanto lo de "inversa" era una pista.

Entonces nuestro pensar seria usar una herramienta libre que nos permitiera reproducir ogg y en caso de que lo necesitaramos podriamos editar el audio. Que tal audacity?

Analizando un poco el audio notamos que la velocidad del audio esta acelerada y que ademas el audio esta invertido, es muy fácil usar un par de funciones del audacity para arreglarlo y luego podremos escuchar la canción del software libre interpretada por Richard Stallman con una pequeña modificación. Esa modificación es la clave que se esta buscando para el nivel.

Pd: Hay que tener buen oido para entenderla ;)

NIVEL 7a - El nick
Se necesitan mas pistas para adivinar este reto?, en la entrada del wargame cada vez que se logueaban aparecia un mensaje diciendo que nonroot y duma habian creado el reto, osea que este nivel se superaba en menos de 3 intentos ;)


NIVEL 7b - Quien es quien es?

En el archivo relacionado con este nivel, encontrabamos el siguiente texto:

Pqebgée pq qefgpumd xm radym qz cgq mofgó Xuzge k tmnqd radygxmpa gzm fqadím pqx bad cgé fgha éjufa, fayé xm pqoueuóz oazeouqzfq pq bdanmdxm qz yu zgqha bdakqofa (qx ogmx, pqna mpyufudxa, qe ygota yqzae oaybxqva k mynuouaea).



Xa bduyqda cgq tuoq rgq dqadsmzulmd k euybxuruomd baboxuqzf. Qx fdmnmva pq Omdx Tmddue qdm ygk ngqza, bqda qjtuním gzm oaybxqvupmp uzzqoqemdum, fíbuom pq ygotae pq xae bdasdmympadqe qz O. Éx fdmfmnm qx oópusa oaya xm bmdfq oqzfdmx k xme qefdgofgdme pq pmfae oaya gz mbaka bmdm éefq. Oaya dqegxfmpa, qx oópusa dqegxfó ygk qxqsmzfq, bqda qx pueqña pq xme qefdgofgdme pq pmfae emxuó mp tao k rqa (bad xa yqzae oaz dqebqofa m xae qefázpmdqe qjusqzfqe pq qefq huqva tmowqd pq Xueb).
Cuando vemos algo así, inmediatamente pensamos en criptografia o algun tipo de codificación para esconder el texto real. La verdad este mecanismo de cifrado no es muy complicado y se puede resolver fácilmente con el uso de herramientas como cryptool o con alguna herramienta para consola instalable para linux, BSD, etc.

El cifrado usado especificamente para este nivel es el del Cesar, una vez descifrado el texto leeras un par de parrafos de un texto muy común en el mundo del software libre. Te daras cuenta que hacen parte del ensayo: La catedral y el Bazar, si aún no lo has leido, que esperas?

Como la pregunta de la pista dice quien es, quien es?, se supone que hace referencia a alguien, precisamente el personaje que escribio este ensayo. Esa es la respuesta ;)

Pd: si te gustó el tema de criptografia, un estudiante del SENA MEDELLÍN, creó un algoritmo de cifrado sencillo, porque no intentas el reto?


NIVEL 8a - JUAAAAA
Este nivel es bueno, consiste en adivinar una clave teniendo como unica pista una risotada de los amigos Calvin y Hobbes, realmente estos personajes no son el punto en cuestión, encambio si la risa de ambos. Como se expresa una risa incontenible en un chat, en un foro, en cualquier otro mecanismo de comunicación de Internet ?(no es oficial, es la jerga de Internet)

LOL
: acrónimo de "Laughing Out Loud", también "Lot Of Laughs", risa ruidosa o carcajada.

LOL


NIVEL 8b - SISTEMAS DE ARCHIVOS

La pista de este nivel nos habla de sistemas de archivos, puntos de montaje y etc. La forma de resolverlo es buscar que particiones estan disponibles en el sistema, de esa forma veremos algunas particiones que no estan montadas en el sistema, entonces las montamos y luego verificamos que hay en ellas. allí vamos a encontrar muchos archivos y directorios, si podemos hacer una busqueda por todos estos archivos buscando la palabra "clave", encontraremos un archivo que tiene la respuesta. Otra posibilidad era abrir archivo por archivo y buscar la clave o programar un script en cualquier lenguaje, tal como perl, php o python para que realizara esta busqueda por nosotros.



NIVEL 9a - CORREO LINUXERO
Este nivel es para los mas viejitos, los que crearon cuentas alguna vez en rocketmail, mixmail y porsupuesto: linuxmail.org.

Pd: sera que ya estamos muy viejos?


NIVEL 9b - ADIVINANDO?

Las pistas de este nivel son algo confusas, pero son aproposito.

1. Juego BSDero/Linuxero/Geek para consola con nombre de malware
2. "101" veces la cabeza del protagonista
3. Cuanto pesa sin espacio?
A primera vista no tienen relación, no tiene sentido, pero analicemos.

Que es un malware?, ahora que has leido has encontrado cosas como: trojan horse, virus, worms, logic bombs, etc. Bueno, la primera pista dice que el juego tiene nombre de malware, osea que se debe llamar como esos que acabamos de mencionar.


!WORM!

La segunda pista dice "101" veces la cabeza del protagonista. Si observamos la cabeza del protagonista en consola veremos que es una @, 101 en binario es el 5, por lo tanto estamos diciendo algo como 5 @, pero la tercera pista dice que sin espacios, que cuanto pesa?
La respuesta es que pesa 5 arrobas ;)


NIVEL 10a - EL JEROGLIFICO


Es muy simple de resolver este nivel, solo es descifrar el jeroglifico.

Por ahi en la wikipedia dice algo acerca de Francisco Jose de Caldas.

"Cuando bajaba las escalinatas de la Universidad del Rosario, en camino hacia el patíbulo, dibujó en una pared la letra griega θ, enigma que tradicionalmente
se ha interpretado como Oh, larga y negra partida ..."
Quien lo adivinó?, si adivinabamos el jeroglifo, buscabamos el autor de esa frase, y el primer apellido del mismo era caldas, justamente la clave para pasar el nivel.


NIVEL 10b - EL FINAL
Este nivel tenia un poco de dificultad, pero solo porque estamos acostumbrados a pensar en un sentido. Las pistas del nivel eran:

1. http://201.232.43.71:3002/theend.php
2. piensa al reves
El script en PHP devolvia un error:


A primera vista lo que sucede es que el script no puede acceder a la base de datos, puede ser que tenga el usuario o la clave incorrecta, asi que lo primero que intentamos es entrar al código fuente del script, pero desafortunadamete esta ofuscado y no entendemos nada de nada.
Que hacemos?

Aqui es donde todos enloquecieron, como hacemos para saber como nos conectamos a la base de datos, si no podemos entrar al script en php? ...

La segunda pista es la clave del asunto, nos dice: "piensa al reves", pensar al reves en este tipo de juegos significa enfocar el problema diferente, quizas no es que tengamos que modificar el script para que acceda como queremos, quizas lo que tenemos que hacer es organizarle todo para que no produzca error.

Finalmente entendemos ese concepto de pensar al reves y lo que hacemos es ir a la BD (MySQL), pero como entramos?, cual es el usuario y la clave?, esta es la parte fácil, pues la clave para el usuario root es root.

Lo que nos encontramos cuando entramos es que ni la BD, ni las tablas que solicita el script existen, entonces que hacemos?. Nuevamente pensamos al reves y lo que hacemos es ponerle un password que posiblemente este usando el script y luego creamos la base de datos que esta buscando y vamos verificando que los errores cambian y nos vamos acercando a la respuesta.

Y asi continuamos creando todo lo que suponemos que el script necesita hasta que nos da la contraseña del último nivel. Bonito no?

Aunque hubo un ganador en el wargame, realmente se que no pasaron todos los niveles de la forma que se esperaba, son cosas que debemos mejorar ;). Por ejemplo si usabamos la misma BD para almacenar las respuesta es obvio que la mas fácil seria buscar la tabla de respuestas y olvidarse de pensar al reves.

Tambien algunos intentaron desofuscar el script, pero esto es una tarea realmente ardua, solo para reversers (a.k.a crackers).

PALABRAS FINALES

Gracias a todos los que se tomaron la molestia en jugar, yo se que este tipo de juegos no es muy conocido en Colombia, pero iniciar con algo ya es algo. ;)

Hubo un ganador, que termino a media noche y me envio un SMS a despertarme porque habia pasado el reto, felicitaciones para Él.


Agradezco a la empresa ServiUnix.com por prestarme la conectividad y el servidor para implementar el reto durante el mes que estuvo al aire, esperemos que en un futuro haya mas colaboración por parte de la comunidad para los retos organizados durante los eventos

Gracias a los compañeros wilmaron y duma por colaborar con la realización del reto, recuerden que la plataforma donde lo montamos es la misma en la que se viene trabajando desde el 2007, es software libre y se puede usar en lo que quieran.

Y finalmente gracias a los lamers que intentaron hacerle D.O.S al servidor varias veces, que ejecutaron exploits, hicieron forks() infinitos y todas esas niñerias que finalmente nos ayudaron a organizar mejor la seguridad de la plataforma. ;)

Eso es todo, cualquier duda sobre las respuestas en los comentarios, recuerden que tambien pueden descargar todos los archivos nivelx.jsl para hacer pruebas. Byte all.

Pd: No pense que me fuera a quitar tanto tiempo hacer este solucionario ...

2 comentarios:

Astrid dijo...

Excelente amor!!!

La verdad el reto técnico no se comparaba con el pensamiento alrevesado que se necesitaba para la mayoría de los niveles!
Besitos.

Anónimo dijo...

Juas recuerdo tiempos aquellos.

Entradas populares