Bandit Nivel 25 → 26
Página oficial: https://overthewire.org/wargames/bandit/bandit26.html
Este es uno de los niveles más famosos (y delicados) de Bandit. No basta con conectarte por SSH: el shell de bandit26 no es bash, así que la sesión se cierra sola nada más entrar. Necesitas un truco visual y explotar el comportamiento de dos herramientas clásicas: more y vi.
Objetivo
Conectarte como bandit26 usando una clave SSH que encuentras en el home de bandit25, y conseguir una shell bash interactiva a pesar de que el shell de login de bandit26 es un programa que cierra la conexión automáticamente.
Qué aprendes
| Comando / Concepto | Para qué sirve |
|---|---|
cat /etc/passwd | Ver qué shell tiene asignado cada usuario |
ssh -i <archivo> | Conectarse con una clave privada SSH en lugar de contraseña |
more | Paginador de texto; se queda esperando si el terminal es pequeño |
v dentro de more | Abre el texto en vi |
:set shell=/bin/bash en vi | Cambia qué shell usa vi para ejecutar comandos |
:shell en vi | Abre una subshell desde dentro de vi |
| Shell restringido | Un programa que actúa como shell de login pero tiene funciones limitadas o se cierra al terminar |
| Truco de tamaño de ventana | Forzar que more pagine reduciendo las líneas visibles del terminal |
Conceptos clave
Shell de login: cuando haces SSH, el sistema lanza el programa definido en /etc/passwd para tu usuario. Ese programa no tiene por qué ser bash; puede ser cualquier ejecutable. En el caso de bandit26, es un script llamado showtext que muestra un archivo de texto y luego sale. Resultado: la sesión se cierra antes de que puedas escribir nada.
more: paginador antiguo (anterior a less). Cuando el contenido no cabe en la pantalla, se detiene y espera que pulses una tecla. Si el terminal tiene suficientes líneas para mostrar todo el archivo de una vez, more no se pausa y termina directamente.
vi como vector de escape: vi (y vim) tiene un modo de comandos que permite ejecutar una shell. Si consigues que vi abra una shell bash en lugar de la shell restringida, habrás escapado del entorno limitado.
Paso a paso
1. Conéctate a bandit25
ssh [email protected] -p 2220Introduce la contraseña de bandit25 cuando te la pida.
Lo que verás:
bandit25@bandit:~$
2. Localiza la clave SSH de bandit26
ls ~Lo que verás:
bandit26.sshkey
Ese archivo es la clave privada que usarás para entrar como bandit26. No tienes que copiarla a ningún sitio; la usarás directamente desde el home de bandit25.
3. Comprueba qué shell tiene bandit26
Antes de conectarte, entiende el problema:
cat /etc/passwd | grep bandit26Lo que verás:
bandit26:x:11026:11026:bandit level 26:/home/bandit26:/usr/bin/showtext
El campo final (separado por :) es el shell de login. En lugar de /bin/bash, es /usr/bin/showtext. Veamos qué hace ese script:
cat /usr/bin/showtextLo que verás:
#!/bin/sh
export TERM=linux
exec more ~/text.txt
exit 1El script lanza more sobre un archivo de texto y luego sale. Cuando more termina, la sesión se cierra. Ahí está el problema.
4. El truco del tamaño de ventana
more solo se pausa si el contenido NO cabe en la pantalla. Si el terminal tiene suficientes líneas, more muestra todo de golpe y termina inmediatamente.
La solución: reduce el tamaño de la ventana de tu terminal a muy pocas líneas (unas 5-6 filas) ANTES de conectarte. Así el archivo text.txt no cabrá, more se quedará esperando tu input y no cerrará la sesión.
Haz esto ahora: arrastra el borde inferior de tu ventana de terminal hacia arriba hasta que queden unas 5-6 líneas visibles.
5. Conéctate como bandit26 (con la ventana pequeña)
Bloqueo de
localhost(igual que en 14-nivel-13-a-14):ssh ...@localhost:2220desde dentro del servidor está bloqueado (Connecting from localhost is blocked to conserve resources). Usa el hostname realbandit.labs.overthewire.org. El truco de la ventana pequeña funciona igual: lo que importa es el tamaño de tu terminal, vengas de donde vengas.
- Atajo (desde dentro): el mismo comando con el hostname real.
- Siempre funciona (desde tu portátil):
cat ~/bandit26.sshkey, copia la clave a un archivo en tu máquina,chmod 600 bandit26.sshkey, encoge la ventana y conéctate desde ahí.
Terminal Kitty: como el shell de bandit26 es
more, el errorError opening terminal: xterm-kittypuede romper el truco nada más entrar. Lánzalo con el TERM ya fijado:TERM=xterm ssh -i ~/bandit26.sshkey [email protected] -p 2220(igual convidespués).
Con la ventana aún pequeña:
ssh -i ~/bandit26.sshkey [email protected] -p 2220Lo que verás (el terminal queda pausado en more):
_ _ _ _ ___ __
| | | (_) | |__ \ / /
| |__ __ _ _ __ __| |_| |_ ) / /_
| '_ \ / _` | '_ \ / _` | | __| / / '_ \
| |_) | (_| | | | | (_| | | |_ / /| (_) |
|_.__/ \__,_|_| |_|\__,_|_|\__|____\___/
--More--(83%)
El banner ASCII de bandit26 no cabe en la pantalla pequeña, así que more se ha detenido y muestra --More--(83%). Ahora tienes el control.
6. Abre vi desde more
Estando en el prompt de more, pulsa la tecla:
v
Eso abre el archivo actual en vi (el editor de texto clásico de Unix). Verás que el terminal cambia al modo de edición de vi con el contenido del archivo.
Lo que verás:
_ _ _ _ ___ __
| | | (_) | |__ \ / /
...
~
~
~
"/home/bandit26/text.txt" [readonly] 6L, 258C
7. Cambia el shell de vi y abre una bash
En vi, pulsa : para entrar en modo de comandos. Verás un : en la parte inferior del terminal. Escribe exactamente:
:set shell=/bin/bash
Pulsa Enter. Esto le dice a vi que cuando ejecute una subshell use /bin/bash en lugar de la shell de login restringida de bandit26.
Ahora escribe:
:shell
Pulsa Enter.
Lo que verás:
bandit26@bandit:~$
Ya tienes una shell bash interactiva como bandit26. Has escapado del entorno restringido.
8. Amplía la ventana y obtén la contraseña
Ahora puedes agrandar tu ventana de terminal de nuevo. La shell no se cerrará porque ya no estás en showtext, estás en una bash lanzada por vi.
Busca la contraseña de bandit26:
cat /etc/bandit_pass/bandit26Lo que verás:
<cadena_de_~32_caracteres>
Esa cadena (una secuencia real de letras y números que obtendrás tú al ejecutarlo) es la contraseña de bandit26. Cópiala.
Por qué funciona
El mecanismo que explota este nivel tiene tres capas:
-
Shell de login no interactivo:
/usr/bin/showtextejecutamorey sale. No te da ningún prompt de comando. Sin embargo,morees interactivo mientras pagina. -
morecomo puerta:moreno está pensado como shell, pero tiene atajos de teclado para abrir un editor. La teclavlanzavisobre el archivo que está mostrando.moreusa la variable de entorno$VISUALo$EDITORpara saber qué editor abrir; si no están definidas, usavipor defecto. -
vicomo shell launcher: vi tiene un sistema de comandos completo.:shellabre una subshell usando el valor configurado en su variable internashell. Por defecto, vi hereda el shell de login del usuario (que aquí es el script restringido), pero podemos sobreescribirlo con:set shell=/bin/bashantes de lanzarla.
El truco del tamaño de ventana es necesario porque sin él more termina antes de que podamos interactuar. Es una condición de carrera visual: hacemos que el contenido sea demasiado grande para la pantalla.
Errores comunes
La sesión se cierra nada más conectarte Olvidaste reducir la ventana antes de conectarte. Vuelve a hacer la ventana pequeña (5-6 filas) y repite el paso 5.
more muestra --More--(100%) y no responde a v
El archivo cabe justo en pantalla pero more ha llegado al final. Reduce aún más la ventana y reconéctate.
Vi se abre pero :shell abre el shell restringido (se cierra solo)
Olvidaste hacer :set shell=/bin/bash antes de :shell. Los dos pasos son necesarios en ese orden.
Error de permisos al leer la clave SSH
SSH es estricto con los permisos de las claves privadas. Si la clave tiene permisos demasiado abiertos, SSH se niega a usarla. Comprueba con ls -la ~/bandit26.sshkey. Si los permisos no son 600 o 400, corrígelos:
chmod 400 ~/bandit26.sshkeyMe pide contraseña en lugar de usar la clave
Asegúrate de estar usando -i ~/bandit26.sshkey y que el archivo existe.
Pasar al siguiente nivel
Una vez que tienes la shell bash como bandit26 (después del truco de vi), copia la contraseña que obtuviste. Cuando quieras continuar con el nivel 27:
ssh [email protected] -p 2220Introduce la contraseña de bandit26 que copiaste (la cadena de ~32 caracteres obtenida de /etc/bandit_pass/bandit26).
Nota:
bandit26tiene también una contraseña tradicional en/etc/bandit_pass/bandit26. La usarás para el login del nivel 27, no la clave SSH.