Bandit Nivel 26 → 27

Pagina oficial: https://overthewire.org/wargames/bandit/bandit27.html

Este nivel es la segunda parte del escape por vi que empezaste en el nivel 25→26. Ya tienes una shell como bandit26; ahora toca aprovechar un binario especial que hay en el home para leer la contraseña de bandit27.


Objetivo

Ejecutar el binario bandit27-do (que tiene el bit setuid de bandit27) para leer el archivo /etc/bandit_pass/bandit27 y obtener la contraseña del siguiente nivel.


Qué aprendes

ElementoDescripcion
vi:shellAbrir una shell interactiva desde dentro del editor
vi:set shellCambiar el interprete de shell que usa vi antes de lanzarlo
Bit setuid (s)Permiso especial: el binario se ejecuta con el UID del propietario, no del invocador
bandit27-doBinario wrapper que corre como bandit27
cat /etc/bandit_pass/<usuario>Patron estandar en Bandit para leer passwords
ls -lVer permisos y propietario de un archivo

Jerga clave

  • setuid (SUID): cuando ves una s en los permisos de ejecucion del propietario (-rwsr-xr-x), el programa corre con los privilegios del dueno del archivo, no con los tuyos. Es un mecanismo legítimo de Linux que, mal configurado, se convierte en vector de escalada de privilegios.
  • UID efectivo vs. real: al ejecutar un binario SUID, tu UID real sigue siendo bandit26, pero el UID efectivo pasa a ser bandit27. El kernel usa el efectivo para los controles de acceso.
  • Shell de escape (jail escape): salir de un entorno restringido (en este caso, more/vi como shell de login) para obtener una shell normal.

Paso a paso

Situacion de partida

Llegaste al nivel anterior (25→26) y conseguiste entrar a vi desde more. Si cerraste la sesion, vuelve a abrir la conexion SSH a bandit26 y repite el truco de reducir la ventana de terminal para forzar que more entre en modo de paginacion, luego pulsa v para abrir vi.

Terminal Kitty: more y vi corren en el servidor, así que si usas Kitty y ves Error opening terminal: xterm-kitty, abre la conexión con el TERM ya fijado: TERM=xterm ssh -i ~/bandit26.sshkey bandit26@bandit.labs.overthewire.org -p 2220.

1. Verificar que estas dentro de vi

Dentro de vi deberias ver el contenido del archivo text.txt de bandit26 y la barra de estado de vi en la parte inferior. Si no es asi, repasa el nivel anterior.

2. Cambiar el interprete de shell (si es necesario)

La shell de login de bandit26 es /usr/bin/showtext, un script muy restringido. Cuando vi lanza una shell con :shell, usa la variable $SHELL del entorno, que apunta a ese script restringido. Hay que cambiarlo a /bin/bash desde dentro de vi:

:set shell=/bin/bash

Escribe :set shell=/bin/bash y pulsa Enter. No veras ninguna salida visible; vi simplemente actualiza la variable interna.

3. Abrir una shell de bash desde vi

:shell

Esto hace que vi lance /bin/bash como subproceso. Veras algo como:

bandit26@bandit:~$

Ya tienes una shell interactiva como bandit26. El prompt puede variar; lo importante es que responde a comandos normales de bash.

4. Explorar el home de bandit26

ls -l ~

Salida esperada (aproximada):

total 20
-rwsr-x--- 1 bandit27 bandit26 14880 Apr 23 18:04 bandit27-do
-rw-r----- 1 bandit26 bandit26   258 Apr 23 18:04 text.txt

Fjate en los permisos de bandit27-do:

  • -rwsr-x--- — la s en la posicion de ejecucion del propietario indica SUID.
  • Propietario: bandit27. Grupo: bandit26.
  • bandit26 puede ejecutarlo (permisos de grupo r-x).

5. Ejecutar el binario setuid para leer la password

./bandit27-do cat /etc/bandit_pass/bandit27

Salida esperada:

<cadena_de_~32_caracteres>

Esa cadena es la contraseña de bandit27. Copiala.

6. (Opcional) Confirmar que el binario corre como bandit27

./bandit27-do id

Salida esperada:

uid=11026(bandit26) gid=11026(bandit26) euid=11027(bandit27) groups=11026(bandit26)

Observa: uid (real) = bandit26, euid (efectivo) = bandit27. El kernel da acceso a /etc/bandit_pass/bandit27 basandose en el euid.


Por que funciona

El bit SUID en detalle

-rwsr-x---
 ^^^
 rws  → propietario puede leer, escribir, y ejecutar; la 's' reemplaza la 'x' normal

Cuando ejecutas ./bandit27-do:

  1. El kernel ve que el bit SUID esta activado.
  2. Asigna como UID efectivo el UID del propietario del archivo (bandit27).
  3. El proceso hijo (cat /etc/bandit_pass/bandit27) hereda ese UID efectivo.
  4. El archivo /etc/bandit_pass/bandit27 solo es legible por bandit27 (permisos 400 aprox.), pero el proceso tiene el UID efectivo correcto → acceso concedido.

Por que necesitamos el truco de vi primero

La shell de login de bandit26 es /usr/bin/showtext, que imprime text.txt y termina inmediatamente. No hay forma de ejecutar comandos directamente al hacer SSH. El escape por vi es el puente entre “sesion SSH que se cierra sola” y “shell bash utilizable”.

Cadena completa de la explotacion (resumen)

SSH bandit26 → more (paginador) → [v] → vi → :set shell=/bin/bash → :shell → bash → ./bandit27-do → bandit27 UID efectivo → cat /etc/bandit_pass/bandit27

Errores comunes

La shell que abre vi sigue siendo restringida

Sintoma: ejecutas :shell y obtienes un error o la sesion termina.

Causa: olvidaste ejecutar :set shell=/bin/bash antes de :shell. La shell por defecto es /usr/bin/showtext.

Solucion: vuelve a vi, ejecuta :set shell=/bin/bash y luego :shell.

Permission denied al ejecutar bandit27-do

Sintoma:

-bash: ./bandit27-do: Permission denied

Causa: no estas en el directorio home o el archivo no es ejecutable para tu usuario.

Solucion:

cd ~
ls -l bandit27-do

Comprueba que el grupo es bandit26 y que tienes permiso de ejecucion de grupo (r-x).

La terminal era demasiado grande y more no pagino

Sintoma: al conectarte a bandit26, la sesion se cierra de inmediato sin mostrar more.

Causa: si la terminal es suficientemente grande para mostrar todo text.txt en una sola pantalla, more termina sin entrar en modo interactivo y showtext cierra la sesion.

Solucion: reduce el tamano vertical de la ventana de terminal a unas 5-10 lineas antes de conectarte por SSH. Repasa los detalles en el nivel 26-nivel-25-a-26.

Confundir SUID con sudo

bandit27-do no usa sudo; es un binario precompilado con el bit SUID. Intentar ejecutar sudo ./bandit27-do no tendra efecto (ademas de que bandit26 probablemente no tiene entrada en sudoers).


Pasar al siguiente nivel

Con la password obtenida, abre una nueva terminal y conectate a bandit27:

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

Cuando te pida contrasena, pega <cadena_de_~32_caracteres> que copiaste en el paso 5.


Conexiones

  • 00_README — indice general de la serie Bandit
  • MOC_Ciberseguridad — mapa de contenido de ciberseguridad
  • 26-nivel-25-a-26 — nivel anterior; explica el escape inicial por vi y more
  • — SUID, SGID y sticky bit en profundidad (si existe)