19 jul 2011

WriteUp KeyConsole – #wgsbd2

Hola, como algunos habrán sabido por twitter, estuve compitiendo en el #WGSBD2 (Wargame SecurityByDefault 2) junto con @fulapol dando la cara por Mexico y quedando en la posición 22 con un total de 14 retos resueltos. Pondré algunos solucionarios a retos los que más me gustaron. Empezaremos con KeyConsole que fue el que más me gustó y el que hice mas rápido.

Nos proveen del archivo tmp_key el cual comprobamos con un “file” que es un ELF de 32 bits para arquitectura Intel. Le damos permisos de ejecución, y lo ejecutamos. Y nos dice que nuestro sistema no es compatible y que el software no es Original.

123
file tmp_keychmod +x !$./tmp_key

La primera parte del análisis sera hacer un strings y en la parte final nos arroja datos muy interesantes.

1
strings tmp_key

Como vemos ya sabemos que dos archivos son abiertos, /tmp/%i_privatekey_%i/dev/random. Otro dato interesante es %i%i%i%i%i

Ahora veamos /dev/random sabemos que genera números aleatorios y toma 5 numeros por el (%i%i%i%i%i). Y sabemos que abre el archivo %i_privatekey_%i en /tmp. Como sabemos en programacion el %i se refiere a un numero entero decimal.

Nuestro siguiente análisis será con strace. Strace es un programa del sistema linux que nos permite trazar las consultas al sistema durante la ejecución de un binario.

Lo ejecutamos de la siguiente forma.

1
strace ./tmp_key

Aqui vemos cosas como:

.-Write (Checking enviroment…).-El open /dev/random.-Y Lo mas importante el open /tmp/0_privatekey_2

Por ahora aqui vemos que el %i_privatekey_%i toma los valores 0 y 2. Pero si lo volvemos a ejecutar.

Vemos que toma ahora los valores 4 y 4. Despues de una conjetura, vemos que los valores que %i puede tomar van de 0 a 4 =) Con esto ya es fácil saber que pasa.

Conclusion: El binario hace una consulta a /dev/random obteniendo un número de 5 digitos y despues lo compara con un archivo al azar que debe estar en /tmp y se llama %i_privatekey_%i pudiendo ir los valores de 0 a 4.

Ahora la parte divertida de saltarnos esto. Hay muchas maneras y tal vez más fáciles de la que hice, pero la mia me gustó bastante.

1.- Puesto que se pide a /dev/random un número de 5 digitos para comparar, lo primero será que este valor lo conozcamos, para esto se me ocurrió, en vez de que sea /dev/random, modificar con un editor hexadecimal a /ved/random. De esta manera solo cambio 2 bytes en el ejecutable. Así que abro el binario con un editor hexadecimal y busco donde está /dev/random.

Ahora lo modificamos por /ved/random

Y Guardamos y es TODO lo que modificaremos del binario.

2.- Ahora obviamente en el sistema NO EXISTE /ved/random por lo que vamos a crear ese directorio y archivo con el valor “01234

12
mkdir /ved && cd /vedecho "01234" > random

3.- Ahora nos falta crear los archivos _privatekey_ que deben ir de la forma 0_privatekey_0 0_privatekey_1 0_privatekey_2….etc…4_privatekey_4 y cada uno contener “12345” puesto que el programa comparará eso con /ved/random pero no sabemos que archivo %i_privatekey_%i por eso crearemos todo. Pese a lo difícil que pueda parecer, realmente lo haremos en un solo comando con dos bucles anidados =)

12
cd /tmpfor i in {0..4};do for j in {0..4}; do echo "12345" > $i"_privateket_"$j; done ; done && ls

 

4.- Y Finalmente ya tenemos todo el escenario, ahora solo nos queda EJECUTAR y TOMAR EL TOKEN.

TOKEN:  Your*environment_is-fully:compatible_you*can=play.NOW

Cualquier comentario Bienvenido =)

 

Saludos ;)

@hecky

neobits.org

4 comentarios:

  1. Buenas, muy buen articulo.Otra manera sería modificar con el editor hexadecimal directamente %i_privatekey_%i y ahorrarnos el bucle y la modificación de la cadena /dev/random. Por ejemplo, ------/tmp/11_privatekey_11-----dando igual el contenido de éste, obtendremos:[-] Checking if your environment is compatible, please wait ...[-] System compatible: Your*environment_is-fully:compatible_you*can=play.NOWSaludos.

    ResponderEliminar
  2. Genial!no quito meritos a ambas soluciones, pero... porqué decantarse en modificar el ejecutable?Personalmente prefiero la depuración y la anticipación, con ello me refiero a crear el archivo pertinente antes de que el programa lo cree. En otro caso también podriamos hacer las modificaciones directamente en memoria ;)saludos!

    ResponderEliminar
  3. Buenas cukz!pues si has realizado alguna de los métodos que mencionas, podrías exponerlo en un mensaje para aprender todos!!!un saludo

    ResponderEliminar
  4. Yo me puse a depurarlo y cuando ya se habia creado el fichero /tmp/%i_private_%i, simplemente lo creaba y continuaba la depuracion.

    ResponderEliminar