Bandit: nivel 26 → 27
Cómo resolver el nivel 26 → 27 de OverTheWire Bandit usando un binario SUID para ejecutar comandos como bandit27, partiendo de la shell obtenida al escapar de more.
Este nivel es la continuación natural del anterior. Ya hemos escapado de la shell restringida de bandit26, y ahora nos encontramos con un viejo conocido: un binario SUID que ejecuta comandos como otro usuario. Si hiciste el nivel 19 → 20, esto te va a sonar muchísimo.
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ú.
Punto de partida
Venimos del nivel anterior, donde escapamos de la shell restringida de bandit26 abriendo vim desde more y lanzando una shell con :set shell=/bin/bash y :shell. Así que ya estamos dentro como bandit26 con una bash normal:
1
2
3
4
bandit26@bandit:~$ whoami
bandit26
bandit26@bandit:~$ ls
bandit27-do text.txt
Si cerraste la sesión, repite el truco del nivel 25 → 26 para volver a tener shell como bandit26: la shell de login de bandit26 sigue siendo
showtext, no puedes entrar directamente con una bash.
El enunciado
El enunciado del nivel dice que hay un binario setuid en el home que nos permite ejecutar comandos como bandit27. Es exactamente el mismo mecanismo del nivel 19 → 20.
Miro los permisos para confirmarlo:
1
2
bandit26@bandit:~$ ls -l bandit27-do
-rwsr-x--- 1 bandit27 bandit26 ... bandit27-do
Ahí está la s del bit SUID en los permisos del propietario, y el propietario es bandit27. Eso significa que, al ejecutar el binario, el proceso corre con la identidad de bandit27, no con la nuestra.
La solución
Primero lo ejecuto sin argumentos para ver cómo se usa:
1
2
3
bandit26@bandit:~$ ./bandit27-do
Run a command as another user.
Example: ./bandit27-do id
Es el mismo lanzador de siempre: le pasas un comando y lo ejecuta como bandit27. Así que le pido que lea la contraseña de bandit27, que bandit27 sí puede leer:
1
2
bandit26@bandit:~$ ./bandit27-do cat /etc/bandit_pass/bandit27
[REDACTED]
Y ya tenemos la contraseña de bandit27.
¿Por qué funciona? El bit SUID hace que el programa se ejecute con los permisos de su propietario (bandit27), no con los de quien lo lanza (bandit26). Como el
catlo acaba ejecutando bandit27, puede leer/etc/bandit_pass/bandit27, aunque nosotros como bandit26 no podríamos. Lo explico a fondo en el writeup del 19 → 20.
Por qué esto importa en seguridad
Este nivel encadena dos conceptos que has visto por separado: primero escapar de una shell restringida (nivel 25 → 26) y luego abusar de un binario SUID para movernos a otro usuario. En un pentest real rara vez tienes una sola vía limpia: lo normal es encadenar fallos pequeños (una shell mal restringida + un SUID permisivo) hasta llegar donde quieres. Por eso, nada más conseguir una shell nueva, lo primero suele ser enumerar binarios SUID:
1
bandit26@bandit:~$ find / -perm -4000 -type f 2>/dev/null
Pasar al nivel siguiente
1
bandit26@bandit:~$ ssh bandit27@bandit.labs.overthewire.org -p 2220
Entra con la contraseña de bandit27 que acabas de recuperar.
El siguiente nivel cambia de tema y entra en territorio nuevo: Git. A partir de aquí varios niveles van de encontrar secretos en el historial de un repositorio.
Resumen
| Comando / concepto | Para qué sirve |
|---|---|
Bit SUID (-rws) | Ejecuta el programa con los permisos de su propietario |
ls -l fichero | Ver permisos y detectar la s del SUID |
./bandit27-do comando | Ejecutar un comando como bandit27 |
find / -perm -4000 -type f 2>/dev/null | Enumerar binarios SUID del sistema |
| Encadenar fallos | Shell restringida rota + SUID = escalada entre usuarios |