Entrada

Bandit: nivel 19 → 20

Cómo resolver el nivel 19 → 20 de OverTheWire Bandit usando un binario SUID para ejecutar comandos como otro usuario, una introducción práctica a la escalada de privilegios.

Bandit: nivel 19 → 20

Este nivel es una primera toma de contacto con la escalada de privilegios, uno de los pilares del pentesting. La idea: un programa concreto puede ejecutarse con los permisos de otro usuario gracias a un bit especial llamado SUID. Vamos a aprovecharlo para leer un fichero que, en teoría, no deberíamos poder leer.

Las contraseñas de los niveles aparecen como [REDACTED]. Siguiendo las normas de OverTheWire, no publico credenciales: la gracia es que llegues a ellas tú.

Conexión

1
2
$ sshpass -p '[REDACTED]' ssh bandit19@bandit.labs.overthewire.org -p 2220
bandit19@bandit:~$ export TERM=xterm

El enunciado

El enunciado del nivel dice que para pasar al siguiente nivel hay que usar un binario setuid que hay en el home. Nos pide que lo ejecutemos sin argumentos para ver cómo se usa, y añade una pista: dónde suele guardarse la contraseña de cada nivel (sí, /etc/bandit_pass/).

1
2
bandit19@bandit:~$ ls
bandit20-do

Un único fichero: bandit20-do. Miremos sus permisos:

1
2
bandit19@bandit:~$ ls -l bandit20-do
-rwsr-x--- 1 bandit20 bandit19 ... bandit20-do

Aquí está la clave, y hay que saber leerla:

  • El propietario del fichero es bandit20, y el grupo es bandit19 (nosotros).
  • En los permisos del propietario, donde normalmente habría una x (-rwx), hay una s: -rws. Esa s es el bit SUID.
  • Nuestro grupo (bandit19) tiene r-x: podemos leer y ejecutar el binario.

¿Qué hace el bit SUID?

Normalmente, cuando ejecutas un programa, este corre con tus permisos. El bit SUID (Set User ID) cambia eso: hace que el programa se ejecute con los permisos de su propietario, no con los de quien lo lanza.

Como bandit20-do tiene el SUID y pertenece a bandit20, al ejecutarlo actuamos como bandit20 durante lo que dure ese programa. Y bandit20 sí puede leer /etc/bandit_pass/bandit20, aunque nosotros (bandit19) no.

Primero lo ejecuto sin argumentos, como pide el enunciado, para ver qué hace:

1
2
3
bandit19@bandit:~$ ./bandit20-do
Run a command as another user.
  Example: ./bandit20-do id

Es un “lanzador”: le pasas un comando y lo ejecuta como bandit20. Podemos comprobarlo con id:

1
2
bandit19@bandit:~$ ./bandit20-do id
uid=11019(bandit19) gid=11019(bandit19) euid=11020(bandit20) ...

Fíjate en el euid=11020(bandit20): el euid (effective user ID) es bandit20. Eso es exactamente lo que nos interesa: a efectos de permisos, somos bandit20.

La solución

Le pido al binario que, como bandit20, lea la contraseña:

1
2
bandit19@bandit:~$ ./bandit20-do cat /etc/bandit_pass/bandit20
[REDACTED]

Y ya la tenemos. El cat lo ejecuta bandit20, que sí tiene permiso para leer ese fichero.

El ./ delante del nombre es obligatorio. El directorio actual no está en el PATH por seguridad, así que para ejecutar un programa que está en la carpeta en la que estás tienes que decírselo explícitamente con ./.

Por qué esto importa en seguridad

Los binarios SUID son una de las primeras cosas que se buscan al auditar una máquina Linux, porque un SUID mal hecho (o uno que no debería existir) es una vía directa para escalar privilegios, a veces hasta root. Aquí el binario está bien acotado (solo hace de lanzador para bandit20), pero el concepto es el mismo que explotarás en máquinas reales.

Para encontrar todos los binarios SUID de un sistema se usa find:

1
bandit19@bandit:~$ find / -perm -4000 -type f 2>/dev/null
  • -perm -4000 busca ficheros que tengan activado el bit SUID (4000 en octal).
  • -type f limita la búsqueda a ficheros.
  • 2>/dev/null descarta los errores de “permiso denegado” de las carpetas que no podemos leer.

Esta es, literalmente, una de las primeras comprobaciones que harás en cualquier máquina de HTB o en la OSCP cuando busques escalar privilegios. Apúntate ese comando.

Pasar al nivel siguiente

1
2
bandit19@bandit:~$ exit
$ sshpass -p '[REDACTED]' ssh bandit20@bandit.labs.overthewire.org -p 2220

Resumen

Comando / conceptoPara qué sirve
Bit SUID (-rws)Hace que un programa se ejecute con los permisos de su propietario
ls -l ficheroVer los permisos y detectar la s del SUID
./bandit20-do comandoEjecutar un comando como el propietario del binario (bandit20)
id / euidComprobar con qué identidad se está ejecutando el proceso
./Ejecutar un binario del directorio actual (no está en el PATH)
find / -perm -4000 -type f 2>/dev/nullEncontrar todos los binarios SUID del sistema
Esta entrada está licenciada bajo CC BY 4.0 por el autor.