jueves, 18 de diciembre de 2014

Leviathan Level 6 → Level 7


Vamos a por el último nivel de este WarGame y para ello hacemos una conexión SSH a:

- Host: leviathan.labs.overthewire.org 
- User: leviathan6
- Pass: UgaoFee4li


En este último nivel seguimos teniendo la misma información que la del nivel anterior, nada de nada.

Para empezar, vamos a ver como se comporta el ejecutable:



Está claro que el objetivo es buscar el 'digit code' que piden y para ello usaremos gdb para hacerle ingeniería inversa al binario e intentar obtener el código:



Básicamente se puede apreciar como lo que se hace es pasar a entero el código argumentado para después compararlo con el contenido de pila [ESP+0x1C] que es en donde está el código buscado y que en este caso es 7123.

Vamos a comprobar si estamos en lo cierto:










Perfecto! La password es: ahy7MaeBo9

Aunque ya no es necesario, voy a poner aquí la captura de los diagramas de bloques de este nivel, sobre todo porque conceptualmente es infinitamente mejor que el desensamblado de gdb





¡Otro WarGame terminado! Muy sencillo pero ideal para ir adquiriendo buenas costumbres.

No obstante, antes de terminar la entrada, veamos si con esta nueva credencial podemos hacer una conexión a leviathan7:



Pues parece que sí, aunque lamentablemente ya es tarde para obedecer ;)

Ahora sí que sí ... ¡Hasta el próximo WarGame!


Leviathan Level 5 → Level 6


Definitivamente, el grueso de estos niveles está en el uso y abuso del bit suid.

Como de costumbre, los datos de conexión son:

- Host: leviathan.labs.overthewire.org 
- User: leviathan5
- Pass: Tith4cokei

Y la misma información que la del nivel anterior nada de nada.

En este caso, tenemos un binario llamado levithan5 con el bit suid activo para leviathan6. Lo que éste hace a groso modo, es leer el contenido de un fichero /tmp/file.log, imprimir su contenido por pantalla y borrarlo después.

En la siguiente captura, se puede apreciar su comportamiento:




Aquí está claro que lo que hay que hacer es que file.log sea un enlace simbólico a /etc/levithan_pass/leviathan6 puesto que el binario tiene los permisos necesarios para leer su contenido:



Esto todo por el momento. ¡Hasta el próximo nivel!




miércoles, 17 de diciembre de 2014

Bandit Level 16 → Level 17



Continuamos con un nuevo nivel, el cual promete y mucho.


Como siempre, los datos de conexión son:

- Host: bandit.labs.overthewire.org 
- User: bandit16
- Pass: cluFn7wTiGryunymYOu4RcffSxQluehd

Los objetivos son claros:


Según la información que nos dan, este nivel es muy similar al anterior con la diferencias de que ahora nos dan un rango de puertos [31000, 32000]. Además nos dictaminan los pasos a seguir.

Por tanto, comenzamos por escanear el rango de puertos para determinar cuales de ellos está activos haciendo uso del comando 'nmap':


Observamos que existen cinco puertos con servicios habilitados, así que el siguiente paso será determinar cual de ellos usa SSL:



Ya sabemos que los puertos 31518 y 31790 utilizan SSL, Por prueba y error (solo son dos) determinamos cual de ellos y le enviamos la password actual:



Es fácil darse cuenta que lo que nos han dado es la clave privada con la que hacer una conexión SSH a bandit17, por tanto, la guardamos en un fichero para darle persistencia y así poder usarla posteriormente:



Ahora establecemos la conexión SSH:



Y obtenemos un error más que evidente. Los permisos que le dimos al fichero que almacena la clave son demasiado poco restrictivos, por tanto, modificamos los permisos y repetimos:



Ahora sí. Ya solo nos queda obtener la password:



Parece que nivel a nivel se va aumentando la motivación de estos y se van utilizando nuevas herramientas muy usadas en entornos reales.

Esto es todos por ahora. ¡Hasta el próximo nivel!



Leviathan Level 4 → Level 5


Parece que este WarGame va de bits suid. Vamos a ver que nos tiene preparado este nivel.

Como ya viene siendo habitual, los datos de conexión SSH son:

- Host: leviathan.labs.overthewire.org 
- User: leviathan4
- Pass: vuH0coox6m

Y la misma información que la del nivel anterior nada de nada.

Esta vez tenemos esto:



Muy sencillo este nivel. A simple vista se ve que nos estan dado el valor ASCII de cada letra en binario. Por tanto, hacemos la conversión y obtenemos la password:

01010100 = 0x54 = T
01101001 = 0x69 = i 
01110100 = 0x74 = t
01101000 = 0x68 = h
00110100 = 0x34 = 4
01100011 = 0x63 = c
01101111 = 0x6F = o
01101011 = 0x6B = k
01100101 = 0x65 = e
01101001 = 0x69 = i

00001010 = 0x0A = \n

El último carácter no hay que tenerlo en cuenta pues es el de 'nueva línea'.

¡Nos vemos en la próxima entrada!



Leviathan Level 3 → Level 4

Parece que este WarGame va de bits suid. Vamos a ver que nos tiene preparado este nive.

Como ya viene siendo habitual, los datos de conexión SSH son:

- Host: leviathan.labs.overthewire.org 
- User: leviathan3
- Pass: Ahdiemoo1j

Y la misma información que la del nivel anterior nada de nada.

Esta vez el fichero es este:



Ahora le hacemos un ltrace a ver que se cuece:



No nos dice demasiado. Nos pide un password y como no ha sido correcto nos muestra un mensaje de error.

Analicemos más en profundidad su diagrama de bloques:


Nos pide el password, y después invoca a la función do_stuff, la cual es:


De ella podemos asegurar que si el password es correcto, nos dará un shell con permisos elevados a leviathan3, en caso contrario mostrará un error como se ha visto anteriormente.

La comprobación del password se hace a través de la instrucción repe cmpsb, es decir byte a byte sobre los registros ESI, EDI y vemos rápidamente que la cadena que contiene el registro EDI es 'snlprintf\n'. Pero si nos fiamos en la captura del ltrace, el carácter de control '\n' lo añade la función _fgets.

Vamos a comprobarlo:


et voilà!

Ahora vamos a repetir el proceso, debido a que en la conexión remota no disponemos de IDA Pro para verlo tan eficientemente, pero si podremos llegar al mismo sitio usando gdb.

Cargamos el binario en el depurador:



Nos informamos de sobre que funciones tiene:


Y por último, desensamblamos la función do_stuff y mostramos el contenido que tendrá el registro EDI:



Y ahora es cuando viene lo mejor. Con un simple comando ¡podríamos habernos evitado todo esto! Pero los que me conocen saben que me gusta ir a las hojas para ver el bosque:



Esto es todo por ahora. ¡Hasta pronto!



Leviathan Level 2 → Level 3


Tengo que reconocer que aunque estos niveles son beginners, este en concreto me ha costado lo suyo hasta que vi como resolverlo.

Comenzamos pues y para ello, los datos de conexión son:
- Host: leviathan.labs.overthewire.org 
- User: leviathan2
- Pass: ougahZi8Ta

Y la misma información que la del nivel anterior nada de nada.

Nos encontramos con otro nivel en donde nos ofrecen un binario con el bit suid activado con permisos de propietario leviathan3.



Si nos fijamos un poco, lo que este binario hace es recibir el nombre de un fichero y hacerle un cat de su contenido. La primera comprobación que se hace es que se tengan permisos de lectura sobre el fichero argumentado y la segunda se ejecuta un comando cat sobre es fichero pero aquí está lo interesante, con elevación de permisos, debido al bit suid.

Pasamos un comando ltrace al binario, argumentándolo con cualquier fichero que tengamos permisos de lectura, para comprobar las suposiciones anteriores:




Con todo ello, estaría bien poder pasar como argumento el fichero que contiene la password buscada en /etc/leviathan_pass/leviathan3, sin embargo esto no es posible puesto que no tenemos permiso de lectura. 

Lo primero que uno piensa es que se podría hacer un enlace simbólico al fichero, pero seguiríamos sin tener permisos, por tanto, toca darle un poco más a la cabeza y entender que el foco de este retos está en esta función:

snprintf("/bin/cat /etc/leviathan_pass/lev"..., 
         511, 
         "/bin/cat %s", 
         "/etc/leviathan_pass/leviathan2")


especialmente en la parte que está agrandada y resaltada en negrita.

Haciendo una búsqueda en Google de 'problemas que existan con el carácter de control %s' pronto descubriremos que los espacios no sientan demasiado bien. hagamos una prueba:




Como se puede observar se gestiona bien el texto hasta que se encuentra un espacio, por tanto, para poder resolver este nivel

necesitamos crear dos ficheros, uno que será el enlace simbólico mencionado anteriormente y otro con el mismo nombre que el enlace, pero añadiéndole algún espacio. De esta manera, se pasará la primera comprobación que se hace referente a tener permisos de lectura, pues la función _access no formatea el nombre del fichero, después la función _snprintf formateará el nombre del fichero al nombre del enlace, pues se quedará con el texto que hay justo antes del primer espacio. De esta manera, al llegar al cat, este nos mostrará la password.

Veamos este proceso en la próxima captura: 





Espero que se entienda bien la idea. ¡Hasta el próximo nivel!


martes, 16 de diciembre de 2014

Leviathan Level 1 → Level 2


Seguimos con el segundo nivel.

En este caso, los datos de la conexión SSH son:

- Host: leviathan.labs.overthewire.org 
- User: leviathan1
- Pass: rioGegei8m

Y la misma información que la del nivel anterior nada de nada.

Aquí lo que nos ofrecen es un binario con el bit suid activo con permisos de propietario leviathan2.

Este binario nos pedirá una password, la cual si es correcta nos entregará una shell con permisos de leviathan2, como ya hemos apuntado antes. Todo esto podemos apreciarlo en la siguiente captura:



Una buena manera de saber cual es la password correcta es pasar la ejecución del binario por el comando 'ltrace'. De esta manera podremos ver a que funciones invoca y con que argumentos:



Donde podemos descubrir que está comparando la cadena 'amn' con 'sex' que es la password buscada:



Como curiosidad, diré que si nos fijamos en la incialización que se hace después del prólogo:

.text:08048542     mov     dword ptr [esp+18h], 786573h
.text:0804854A     mov     dword ptr [esp+25h], 72636573h
.text:08048552     mov     word  ptr [esp+29h], 7465h
.text:08048559     mov     byte  ptr [esp+2Bh], 0
.text:0804855E     mov     dword ptr [esp+1Ch], 646F67h
.text:08048566     mov     dword ptr [esp+20h], 65766F6Ch
.text:0804856E     mov     byte  ptr [esp+24h], 0

descubriremos que hay un mensaje, 'love god secret sex' y que no es otra cosa que las cuatro password más usadas, las cuales estoy seguro que han sido sacadas de la mejor película de la historia:




Bueno, pues con esto terminamos la entrada. ¡Hasta pronto!



Leviathan Level 0 → Level 1


Comenzamos con otro WarGame perteneciente a OverTheWire llamado LeviathanNos centraremos en el primer nivel de los ocho que consta.

Los datos de conexión SSH son:
- Host: leviathan.labs.overthewire.org 
- User: leviathan0
- Pass: leviathan0

Y la poca información que nos dan es:


Este reto, por ser el primero es bastante sencillo. Tratan de darnos un fichero .html, con infinidad de líneas de texto. Pero basta con filtrar la salida con el patrón de búsqueda como 'password' o 'flag' o algo similar:



En donde se lee 'the password for leviathan1 is rioGegei8m'

Esto es todo por ahora. ¡Hasta la próxima!



viernes, 12 de diciembre de 2014

Bandit Level 15 --> Level 16


Este  nivel que nos ofrece Bandit, sin duda marca una sutil diferencia con el resto y es que para poder resolverlo, necesitamos leer bien las pistas que nos dan.

Como siempre, los datos de conexión son:
- Host: bandit.labs.overthewire.org 
- User: bandit15
- Pass: BfMYroe26WYalil77FoDi9qh59eK5xNr

Y la información ofrecida es:




Este nivel, es similar al anterior, con la diferencia de que ahora nos piden que el envío de la password sea cifrada mediante SSL.

Para ello, usaremos los comandos openssl y s_client, el cual nos permite conectarnos a un host usando SSL/TSL:




Como se puede observar en la imagen anterior, parece que todo es correcto, sin embargo no se ve la flag por ningún lado. No obstante, las dos últimas líneas indican que la respuesta de la extensión Heartbeating fue exitosa y es aquí donde hay que volver a leer minuciosamente la pista (Helpful note) que nos daban al principio y que no es otra que la de añadir la opción -quiet para inhabilitar la impresión de información de sesión y de certificado:



Esto es todo por ahora. ¡Nos vemos en el próxmo!



Bandit Level 14 --> Level 15



Volvemos a la carga. 

Como siempre, los datos de la conexión SSH son:
- Host: bandit.labs.overthewire.org 
- User: bandit14
- Pass: 4wcYUJFw0k0XLShlDzztnTBHiqxU3b3e

Y la información ofrecida es:


Aquí se pide que enviemos la password con la que se ha hecho la conexión SSH al puerto 30000, en donde existirá un servicio que al verificar la password nos envía la flag.

Sin duda, el comando estrella es 'nc', el cual permite leer y escribir datos a través de una conexión de red:


Otra manera de hacer lo mismo, pero más pro:



¡Hasta la próxima!