Bandit Nivel 19 a 20

Nivel del wargame legal y educativo OverTheWire Bandit. El objetivo es escalar privilegios aprovechando un binario con el bit SETUID activado — uno de los conceptos más importantes para entender la gestión de permisos en Linux.


Objetivo

Encontrar y usar el binario bandit20-do que vive en el home de bandit19. Ese binario tiene un bit especial que le permite ejecutar comandos como si fuera el usuario bandit20, aunque tú hayas iniciado sesión como bandit19. La contraseña de bandit20 está en /etc/bandit_pass/bandit20, un archivo que bandit19 normalmente no puede leer. Usando el binario, puedes saltarte esa restricción.


Qué aprendes

Conceptos clave

ConceptoQué es
SETUIDBit de permiso especial en un ejecutable. Cuando está activo, el programa corre con los permisos del propietario del archivo, no con los del usuario que lo lanza.
Escalada de privilegiosTécnica (aquí, legítima y controlada) para ejecutar acciones con más permisos de los que tienes normalmente.
/etc/bandit_pass/Directorio donde OverTheWire almacena las contraseñas de cada nivel, con permisos estrictos: solo el usuario correspondiente puede leerla.

Comandos usados

ComandoPara qué sirve
ls -laListar archivos con permisos detallados (clave para ver el bit SETUID).
file bandit20-doIdentificar el tipo de archivo (binario ejecutable ELF).
./bandit20-do <comando>Ejecutar <comando> con los permisos de bandit20.
cat /etc/bandit_pass/bandit20Leer la contraseña del siguiente nivel.

Paso a paso

1. Conectarse al nivel 19

ssh bandit19@bandit.labs.overthewire.org -p 2220

Introduce la contraseña que obtuviste al resolver el nivel 18 cuando te la pida.


2. Explorar el home

ls -la

Lo que verás:

total 28
drwxr-xr-x  2 root     root      4096 Apr 23 18:04 .
drwxr-xr-x 70 root     root      4096 Apr 23 18:04 ..
-rwsr-x---  1 bandit20 bandit19 14876 Apr 23 18:04 bandit20-do
-rw-r--r--  1 root     root       220 Jan  6  2022 .bash_logout
-rw-r--r--  1 root     root      3526 Jan  6  2022 .bashrc
-rw-r--r--  1 root     root       807 Jan  6  2022 .profile

Fijate en la columna de permisos del binario: -rwsr-x---

La s en la posición del bit de ejecución del propietario (donde normalmente hay una x) indica que el bit SETUID esta activo. Ademas, el propietario del archivo es bandit20, no bandit19.


3. Inspeccionar el binario (opcional pero instructivo)

file bandit20-do

Lo que verás:

bandit20-do: setuid ELF 32-bit LSB executable, Intel 80386, ...

La palabra setuid aparece explicitamente en la descripción del archivo. Linux lo reconoce como binario SETUID.


4. Probar el binario sin argumentos

./bandit20-do

Lo que verás:

Run a command as another user.
  Example: ./bandit20-do id

El propio binario te indica cómo usarlo. Pide que le pases un comando como argumento.


5. Confirmar la identidad bajo la que corre

./bandit20-do id

Lo que verás:

uid=11020(bandit20) gid=11019(bandit19) groups=11019(bandit19)

El uid es de bandit20, pero el gid (grupo) sigue siendo bandit19. Esto es exactamente lo que hace SETUID: cambia el usuario efectivo, no el grupo.


6. Leer la contraseña

./bandit20-do cat /etc/bandit_pass/bandit20

Lo que verás:

<cadena_de_~32_caracteres>

Esa cadena es la contraseña del nivel 20. Copiala.


Por que funciona

En Linux, cada proceso tiene dos identidades de usuario:

  • UID real: el usuario que lanzo el proceso (aqui, bandit19).
  • UID efectivo: el usuario con cuyos permisos se evaluan las operaciones del proceso.

Normalmente ambos coinciden. Pero cuando un ejecutable tiene el bit SETUID activado, el sistema operativo cambia el UID efectivo al propietario del archivo en el momento de lanzarlo.

Flujo de lo que ocurre al ejecutar ./bandit20-do cat /etc/bandit_pass/bandit20:

  1. El kernel ve que bandit20-do tiene el bit SETUID y su propietario es bandit20.
  2. Lanza el proceso con UID efectivo = bandit20.
  3. bandit20-do llama internamente a cat /etc/bandit_pass/bandit20.
  4. El kernel comprueba los permisos de /etc/bandit_pass/bandit20: solo legible por bandit20. El UID efectivo es bandit20. Acceso concedido.
  5. El contenido del archivo llega a tu terminal.

Este mecanismo es el mismo que usa, por ejemplo, el comando passwd (que necesita escribir en /etc/shadow aunque lo lance un usuario normal).


Errores comunes

Error: Permission denied al intentar leer directamente

cat /etc/bandit_pass/bandit20
# cat: /etc/bandit_pass/bandit20: Permission denied

Correcto, eso es lo esperado. No tienes permiso como bandit19. Por eso existe el binario.


Error: ejecutar el binario sin ./

bandit20-do cat /etc/bandit_pass/bandit20
# bash: bandit20-do: command not found

El directorio actual (.) no esta en el PATH de seguridad del sistema. Siempre usa ./ para ejecutar binarios del directorio actual.


Error: pasar el comando sin espacio o con comillas innecesarias

./bandit20-do "cat /etc/bandit_pass/bandit20"
# el binario puede interpretar esto como un unico argumento, no como comando + ruta

Pasa el comando y sus argumentos separados, sin comillas envolventes:

./bandit20-do cat /etc/bandit_pass/bandit20

Confundir SETUID con SETGID

El bit SETGID (s en la posicion del grupo, p.ej. rwxr-sr-x) hace lo mismo pero para el grupo efectivo. Son mecanismos distintos. Aqui solo opera SETUID.


Pasar al siguiente nivel

Con la contraseña obtenida, conéctate al nivel 20:

ssh bandit20@bandit.labs.overthewire.org -p 2220

Introduce <cadena_de_~32_caracteres> (la que copiaste en el paso 6) cuando te la pida.


Conexiones

  • 00_README — indice general del wargame y convenciones de la serie
  • MOC_Ciberseguridad — mapa de contenido de ciberseguridad en la boveda