Bandit: nivel 25 → 26
Cómo resolver el nivel 25 → 26 de OverTheWire Bandit escapando de una shell restringida basada en el paginador more para conseguir una shell como bandit26.
Este nivel es de los más divertidos de Bandit. Tenemos la clave para entrar como bandit26, pero su shell no es una shell normal: es un paginador disfrazado. El reto es escapar de esa shell restringida y conseguir una de verdad. Es una técnica muy real: las shells restringidas se usan para encerrar usuarios, y saber romperlas es parte del trabajo.
Las contraseñas y claves 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
3
4
$ sshpass -p '[REDACTED]' ssh bandit25@bandit.labs.overthewire.org -p 2220
bandit25@bandit:~$ export TERM=xterm
bandit25@bandit:~$ ls
bandit26.sshkey
El enunciado
El enunciado del nivel dice que iniciar sesión como bandit26 no va a ser tan fácil como antes, pero que la clave para entrar está en el home de bandit25. Efectivamente, ahí tenemos bandit26.sshkey: una clave privada SSH, como las de niveles anteriores.
Primer intento: entrar con la clave
Me traigo la clave a mi máquina con scp (recuerda: -P mayúscula para el puerto):
1
2
3
$ scp -P 2220 bandit25@bandit.labs.overthewire.org:/home/bandit25/bandit26.sshkey .
$ chmod 600 bandit26.sshkey
$ ssh -i bandit26.sshkey bandit26@bandit.labs.overthewire.org -p 2220
La autenticación funciona… pero la sesión se cierra de inmediato. No llegamos a tener prompt. ¿Por qué?
Por qué nos echa: la shell de bandit26
La shell de login de un usuario está definida en /etc/passwd. Vuelvo a la sesión de bandit25 y miro la de bandit26:
1
2
bandit25@bandit:~$ cat /etc/passwd | grep bandit26
bandit26:x:11026:11026:bandit26,,,:/home/bandit26:/usr/bin/showtext
El último campo es la shell, y en vez de /bin/bash pone /usr/bin/showtext. Veamos qué es:
1
2
3
4
5
6
7
bandit25@bandit:~$ cat /usr/bin/showtext
#!/bin/sh
export TERM=linux
exec more ~/text.txt
exit 0
Es un script que ejecuta more ~/text.txt y nada más. more es un paginador (muestra ficheros por páginas). Al terminar, el exec hace que la sesión se cierre. Eso es una shell restringida: a bandit26 no le dan un intérprete de comandos, solo le enseñan un fichero y le echan.
La solución: escapar de more
La clave está en cómo se comporta more:
- Si el fichero cabe entero en pantalla,
morelo muestra y termina (no entra en modo interactivo). Por eso la sesión se cierra tan rápido:text.txtes muy corto. - Si el fichero no cabe,
moreentra en modo interactivo (el típico--More--abajo) esperando órdenes.
Así que el truco es forzar a more a entrar en modo interactivo. ¿Cómo? Haciendo la ventana del terminal muy pequeña antes de conectarnos, para que text.txt no quepa:
- Reduce la ventana de tu terminal a muy pocas filas de alto (3-4 líneas).
- Conéctate:
ssh -i bandit26.sshkey bandit26@bandit.labs.overthewire.org -p 2220. - Ahora
moreno puede mostrar todo y entra en modo interactivo.
Desde el modo interactivo de more se puede abrir un editor: pulsando v se abre vim sobre el fichero. Y una vez dentro de vim, ya tenemos ventana para volver a agrandar el terminal y, lo importante, vim nos deja ejecutar una shell:
1
2
:set shell=/bin/bash
:shell
:set shell=/bin/bashle dice a vim qué shell usar.:shellla lanza.
Y ya estamos dentro como bandit26 con una bash de verdad:
1
2
bandit26@bandit:~$ whoami
bandit26
El patrón “programa que no debería darte una shell pero puede lanzar otro programa que sí” es justo lo que recopila GTFOBins.
more,less,vim,man,find… todos tienen formas de escapar a una shell. Es una de las primeras cosas que miras cuando te topas con una shell restringida.
Recoger la contraseña de bandit26
Importante: al nivel 25 entramos con la clave privada de bandit26, no con su contraseña, así que todavía no la tenemos. Ahora que somos bandit26, la leemos y la guardamos para no depender de la clave:
1
2
bandit26@bandit:~$ cat /etc/bandit_pass/bandit26
[REDACTED]
Pasar al nivel siguiente
Ya tenemos shell como bandit26, que es justo lo que necesitamos para el siguiente nivel (hay un binario SUID en el home). No hace falta ni cerrar sesión.
El siguiente nivel aprovecha esta misma shell: un binario SUID,
bandit27-do, que ejecuta comandos como bandit27. Lo vemos en el writeup del 26 → 27.
Resumen
| Comando / concepto | Para qué sirve |
|---|---|
/etc/passwd | Define, en el último campo, la shell de login de cada usuario |
| Shell restringida | Shell que limita lo que el usuario puede hacer (aquí, solo more) |
more (pantalla pequeña) | Si el fichero no cabe, entra en modo interactivo |
v en more | Abrir el fichero en vim |
:set shell=/bin/bash + :shell en vim | Lanzar una shell desde el editor |
| GTFOBins | Catálogo de binarios con los que escapar de shells restringidas |