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 y /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