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 / ConceptoPara qué sirve
cat /etc/passwdVer qué shell tiene asignado cada usuario
ssh -i <archivo>Conectarse con una clave privada SSH en lugar de contraseña
morePaginador de texto; se queda esperando si el terminal es pequeño
v dentro de moreAbre el texto en vi
:set shell=/bin/bash en viCambia qué shell usa vi para ejecutar comandos
:shell en viAbre una subshell desde dentro de vi
Shell restringidoUn programa que actúa como shell de login pero tiene funciones limitadas o se cierra al terminar
Truco de tamaño de ventanaForzar 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 bandit25@bandit.labs.overthewire.org -p 2220

Introduce 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 bandit26

Lo 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/showtext

Lo que verás:

#!/bin/sh
 
export TERM=linux
 
exec more ~/text.txt
exit 1

El 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:2220 desde dentro del servidor está bloqueado (Connecting from localhost is blocked to conserve resources). Usa el hostname real bandit.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 error Error opening terminal: xterm-kitty puede romper el truco nada más entrar. Lánzalo con el TERM ya fijado: TERM=xterm ssh -i ~/bandit26.sshkey bandit26@bandit.labs.overthewire.org -p 2220 (igual con vi después).

Con la ventana aún pequeña:

ssh -i ~/bandit26.sshkey bandit26@bandit.labs.overthewire.org -p 2220

Lo 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/bandit26

Lo 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:

  1. Shell de login no interactivo: /usr/bin/showtext ejecuta more y sale. No te da ningún prompt de comando. Sin embargo, more es interactivo mientras pagina.

  2. more como puerta: more no está pensado como shell, pero tiene atajos de teclado para abrir un editor. La tecla v lanza vi sobre el archivo que está mostrando. more usa la variable de entorno $VISUAL o $EDITOR para saber qué editor abrir; si no están definidas, usa vi por defecto.

  3. vi como shell launcher: vi tiene un sistema de comandos completo. :shell abre una subshell usando el valor configurado en su variable interna shell. Por defecto, vi hereda el shell de login del usuario (que aquí es el script restringido), pero podemos sobreescribirlo con :set shell=/bin/bash antes 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.sshkey

Me 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 bandit27@bandit.labs.overthewire.org -p 2220

Introduce la contraseña de bandit26 que copiaste (la cadena de ~32 caracteres obtenida de /etc/bandit_pass/bandit26).

Nota: bandit26 tiene también una contraseña tradicional en /etc/bandit_pass/bandit26. La usarás para el login del nivel 27, no la clave SSH.


Conexiones