Mostrando entradas con la etiqueta Linux. Mostrar todas las entradas
Mostrando entradas con la etiqueta Linux. Mostrar todas las entradas

domingo, 4 de octubre de 2015

Bandit Level 20 → Level 21



Los datos de conexión para este nivel son:

- Host: bandit.labs.overthewire.org
- User: bandit20
- Pass: GbKksEFF4yrVs6il55v6gwY5aVje5f0j



La descripción es la siguiente:


Básicamente, nos está indicando que disponemos de un binario, con bit suid habilitado para el user bandit21. 



Al ejecutarlo sin ningún parámetro actual, nos indica que hará una conexión TCP a un puerto dado sobre localhost y que si éste recibe el password del level 20 de la otra conexión, el password del level 21 será mostrado.

El siguiente diagrama clarifica un poco todo esto:


Por tanto, hay que:
  1. Iniciar una nueva conexión SSH.
  2. Levantar un daemond que permanezca en modo 'listenign' y que al recibir una conexión, envíe el password del level 20:



Como se puede ver, netcat es la herramienta perfecta para hacer esto.

Levantado el daemon, tan solo queda volver a ejecutar suconnect argumentándole el puerto para poder resolver el level:




Con el fin de clarificar un poco todo, he editado el título de las terminales como:
  • CLIENT: Para el terminal que ejecuta suconnect.
  • SERVER: Para el terminal que ejecuta el daemond.


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

domingo, 27 de septiembre de 2015

Bandit Level 19 → Level 20



Los datos de conexión para este nivel son:

- Host: bandit.labs.overthewire.org
- User: bandit19
- Pass: IueksS7Ubh8G3DCwVzrTd8rAVOwq3M5x



La descripción es la siguiente:


Como se puede observar, en este caso nos está diciendo que debemos hacer uso de setuid. Esto ya fue comentado de pasada en este otro wargame.

La resolución de este level es muy sencilla y pasa por pasarle al binario bandit20-do como parámetro actual, un comando que nos permita visualizar el contenido del fichero bandit20:



Aunque no es del todo necesario, podemos ver a continuación, el desensamblado del binario:



Hasta el próximo level!

sábado, 19 de septiembre de 2015

Bandit Level 18 → Level 19



Los datos de conexión para este nivel son:

- Host: bandit.labs.overthewire.org
- User: bandit18
- Pass: kfBf3eYk5BPBRzwjqutbbfE887SVc5Yd


Este nuevo level introduce algo distinto a los anteriores. Si retomamos parte del texto del nivel anterior, vemos que nos avisa de algo:

NOTE: if you have solved this level and see ‘Byebye!’ when trying to log into bandit18, this is related to the next level, bandit19

De manera tal que si hacemos la conexión SSH, obtendremos el comentado Byebye!:



Veamos que pistas nos proporciona el enunciado de este level:


Todo parece indicar que el fichero .bashrc (fichero que se carga al iniciar una 'shell de login interactiva) ha sido modificado de tal manera que no nos proporcione un shell. Por tanto, lo que debemos hacer es forzar la conexión SSH argumentando la shell que deseamos usar de la siguiente manera:



El resto, es sencillo. Tan solo debemos leer el contenido del fichero 'readme'.

Esto es todo por el momento!



Práctica de la asignatura de Sistemas Distibuidos 2k15


Presentación de la asignatura dada por el E.D.: 
El objetivo de esta asignatura es aprender los principios básicos sobre sistemas distribuidos, así como caracterizarlos y clasificarlos en función de una serie de parámetros básicos y distinguir entre los distintos tipos de modelos utilizados en sistemas distribuidos. Además, se pondrán de manifiesto la heterogeneidad, tanto de los medios de transmisión (cable coaxial, fibra óptica, canales inalámbricos,...) como de los dispositivos hardware y componentes software que los integran.
Esto hace necesario la aparición de una capa de abstracción software, comúnmente denominada Middleware (capa intermedia), la cual proporciona servicios a las aplicaciones distribuidas tales como la comunicación entre procesos (mediante RPC y Sockets) o invocación de objetos distribuidos (mediante RMI y CORBA).

También se estudian dos de los servicios más habituales ofrecidos por cualquier sistema distribuido, el servicio de archivos distribuidos y el servicio de nombres distribuidos.

Desde mi punto de vista es una asignatura complicada de estudiar, por lo extenso del temario. Sin embargo, la práctica compensa. Es de las más gratificante que he hecho a lo largo de estos años. Eso sí, como casi todas las prácticas en la UNED, se lleva mucho tiempo dejarla medianamente completa.

Si más preámbulos subo la práctica de este año, la cual trata de construir un "Sistema básico de microblogging tipo Twitter® usando Java RMI". 

Los ficheros para su descarga son:

domingo, 13 de septiembre de 2015

Ejecutar ELF 32 bits en arquitectura de 64 bits


Me ocurre a menudo que tengo que realizar alguna acción que alguna vez hice y que al tiempo debo repetir y claro, como generalmente no las anoto, pues me toca volver a bucear por la web hasta que encuentro lo que necesito.

Especialmente esto me ocurre cada vez que participo en algún CTF y sinceramente, me da bastante coraje tener que volver a dedicar tiempo a algo que en su día ya se lo dediqué.

Es por esto, por lo que comenzaré a escribir entradas con pequeñas 'recetas' de aquello que no quiero volver a buscar cada vez que lo necesite hacer.

Por tanto, abro esta nueva categoría con una receta que me permite ejecutar ELF de 32 bits en arquitecturas de 64 bits, como es el caso de la distribución Kali Linux 2.

  1. Compruebo que arquitecturas tengo habilitadas:
    dpkg --print-foreign-architectures
  1. Si en la lista aparece i386, voy al paso 5. En caso contrario, la añado:
    dpkg --add-architecture i386
  1. Actualizo:
    apt-get update
  1. Por último la instalo:
    apt-get install sl-modem-daemon:i386
  1. Fin del proceso.

sábado, 20 de junio de 2015

Bandit Level 17 → Level 18



Los datos de conexión para este nivel son:

- Host: bandit.labs.overthewire.org
- User: bandit17
- Pass: xLYVMN9WE5zQ5vHacb0sZEVqbrp7nBTn



Los objetivos son claros:


La resolución de este reto es sencilla. Basta con hacer uso del comando grep:



Esto es todo por ahora. ¡Hasta el próximo reto!

jueves, 12 de febrero de 2015

CVE-2011-4862: Buffer overflow in libtelnet/encrypt.c


Un miembro de la lista de CrackSLatinoS a.k.a Boken (@Boken_), ha planteado una manera diferente de colaborar, motivar, aprender y practicar temas relacionados con la ingeniería inversa.

Para ello, propone la resolución de una serie de exploits de diferentes niveles de dificultad, del cual éste writeUp se encarga de documentar el primero de ellos de nivel medio.

El post original publicado en la lista el 11/12/2014 fue:


http://www.cvedetails.com/cve/2011-4862
La idea principal es que todo el que quiera hacer su versión de este exploit y comprender en profundidad el fallo, vaya comentando aquí sus avances, dudas, problemas y demás. Hay tanto exploits como detalles del mismo, pero la cuestión es que cada uno que lo intente y se atasque venga aquí a explicar sus problemas y pueda continuar.
Ni es un concurso, ni hay fecha de entrega. El único objetivo es que todo el que crea que no sabría hacerlo, pero quiera, utilice este post para conseguirlo. A ver si al final de este hilo entre todo lo comentado se pueden montar uno o varios tutes conjuntos.
Boken


Los detalles de esta vulnerabilidad son:
Buffer overflow in libtelnet/encrypt.c in telnetd in FreeBSD 7.3 through 9.0, MIT Kerberos Version 5 Applications (aka krb5-appl) 1.0.2 and earlier, Heimdal 1.5.1 and earlier, GNU inetutils, and possibly other products allows remote attackers to execute arbitrary code via a long encryption key, as exploited in the wild in December 2011.
Como no podía ser de otra manera, soez y yo nos pusimos a resolverlo con un resultado altamente satisfactorio para nosotros. Este tipo de retos siempre nos dejan muy buen sabor de boca. 

Ni que decir tiene que tan solo mostramos una pequeña prueba de concepto y que dista mucho de la POC original que en su día hicieron NighterMan y BatchDrake. Sin duda la de ellos es infinitamente más elaborada.

Espero que disfrutéis de esta lectura, tanto como nosotros redactándola. Aquí os dejamos todo lo necesario:
¡Hasta el próximo exploit!


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!