Bandit Nivel 20 a 21

Nivel del wargame legal y educativo OverTheWire Bandit. Pagina oficial: https://overthewire.org/wargames/bandit/bandit21.html


Objetivo

En el home de bandit20 hay un binario con permisos setuid llamado suconnect. Su comportamiento es:

  1. Se conecta a un puerto TCP local que tu le indiques.
  2. Espera recibir la password actual (bandit20) por esa conexion.
  3. Si la password coincide, responde enviando la password de bandit21.

Tu tarea: montar un servidor TCP que sirva la password de bandit20 y hacer que suconnect se conecte a el para obtener la de bandit21.


Que aprendes

Comando / conceptoPara que sirve
nc -lvp <puerto>Arranca netcat como servidor (listener) en el puerto indicado
echo "texto" | nc -lvp ...Envia texto automaticamente en cuanto alguien se conecta
& al final de un comandoLanza el proceso en background (segundo plano)
jobsLista los procesos en background de la shell actual
./suconnect <puerto>Ejecuta el binario setuid apuntando al puerto
setuid bitPermiso especial: el binario corre con los privilegios de su propietario (aqui bandit21), no con los del usuario que lo lanza
localhost / 127.0.0.1Direccion loopback; el trafico no sale de la maquina

Conceptos clave

Setuid (SUID): cuando un ejecutable tiene el bit setuid activo, al correrlo el sistema operativo le da los permisos del dueno del archivo, no los del usuario que lo invoca. Es lo que permite a suconnect leer la password de bandit21 aunque tu seas bandit20.

Netcat en modo listener: nc puede actuar como cliente (conectarse a algo) o como servidor (escuchar conexiones entrantes). El flag -l lo pone en modo servidor, -v activa la salida detallada (verbose) y -p especifica el puerto.

Background con &: cuando terminas un comando con &, la shell lo lanza como proceso hijo independiente y te devuelve el prompt inmediatamente, sin esperar a que termine. Esto permite tener el listener corriendo mientras ejecutas suconnect en la misma terminal.


Paso a paso

0. Conectarte al nivel 20

ssh [email protected] -p 2220

Introduce la password de bandit20 cuando te la pidan.

1. Inspeccionar el binario suconnect

ls -la ~/suconnect

Veras algo como:

-rwsr-x--- 1 bandit21 bandit20 12088 Apr 23 18:21 /home/bandit20/suconnect

La s en rws es el setuid bit: cuando lo ejecutes, el proceso tendra los privilegios de bandit21 (el propietario), no de bandit20 (tu).

Puedes consultar el mensaje de ayuda del binario:

./suconnect
Usage: ./suconnect <portnumber>
This program will connect to the given port on localhost using TCP.
If it receives the correct password for the current level, the next password is transmitted back.

2. Elegir un puerto libre

Cualquier puerto alto no reservado sirve. Usaremos 12345 como ejemplo. Asegurate de elegir uno que no este en uso (si la conexion se rechaza, prueba otro numero entre 10000 y 65535).

3. Montar el listener en background

Este comando arranca nc en modo servidor en el puerto 12345. En cuanto alguien se conecte, enviara la password de bandit20 y cerrara la conexion:

echo '<pass_bandit20_aqui>' | nc -lvp 12345 &

Nota: sustituye <pass_bandit20_aqui> por la password real que encontraste en el nivel anterior. NO es una cadena inventada; es la que obtuviste al resolver el nivel 19.

Veras una linea como:

[1] 23847
Listening on 0.0.0.0 12345

El [1] es el numero de job y 23847 es el PID del proceso. El listener ya esta esperando conexiones.

4. Conectar suconnect al listener

./suconnect 12345

Veras en la terminal (puede mezclarse la salida del listener y de suconnect):

Read: <pass_bandit20_aqui>
Password matches, sending next password
<cadena_de_~32_caracteres>
[1]+  Done     echo '<pass_bandit20_aqui>' | nc -lvp 12345

La linea <cadena_de_~32_caracteres> es la password de bandit21. Copiala.

5. Alternativa con dos terminales (mas clara para principiantes)

Si prefieres no usar background, abre dos conexiones SSH a bandit20 en paralelo:

Terminal A (el listener):

echo '<pass_bandit20_aqui>' | nc -lvp 12345

Terminal B (el cliente):

./suconnect 12345

En la Terminal B aparecera la password de bandit21. En la Terminal A veras que la conexion se cerro.


Por que funciona

El flujo completo es:

[tu shell]
    |
    +--> nc -lvp 12345  (escucha en localhost:12345, tiene la pass de bandit20 lista)
    |
    +--> ./suconnect 12345
              |
              | (conecta a localhost:12345 con privilegios de bandit21)
              | (lee lo que llega: "pass_bandit20")
              | (comprueba: coincide con /etc/bandit_pass/bandit20)
              | (lee /etc/bandit_pass/bandit21 — puede porque es bandit21)
              | (envia pass_bandit21 por el socket)
              v
         [tu terminal recibe la password de bandit21]

El punto clave: suconnect tiene setuid de bandit21, por lo que puede abrir /etc/bandit_pass/bandit21 (archivo que bandit20 no puede leer directamente). Al verificar que la password que recibe es correcta, decide compartir la del siguiente nivel.


Errores comunes

SintomaCausa probableSolucion
nc: Address already in useEl puerto 12345 esta ocupadoUsa otro puerto, p.ej. 13579 o 44444
suconnect no imprime nada / cierra sin respuestaEl listener no estaba arriba antes de conectar, o envio la password incorrectaLanza primero el nc, comprueba que la pass de bandit20 es correcta
La terminal se queda colgada sin mostrar la passwordEl nc sin `echo` espera input del teclado en lugar de enviar la pass
[1]+ Exit 1 en lugar de Donenc termino con error (puerto rechazado o no llego nadie)Relanza el listener y ejecuta suconnect justo despues
No ves la password de bandit21La salida se mezclo con el log del job backgroundDesplazate hacia arriba en la terminal o usa la version de dos terminales

Pasar al siguiente nivel

Una vez que tienes la password de bandit21 (la cadena de ~32 caracteres), conectate asi:

ssh [email protected] -p 2220

Introduce <cadena_de_~32_caracteres> como password cuando te la pidan.


Conexiones

  • 00_README — indice de todos los niveles Bandit
  • MOC_Ciberseguridad — mapa de contenidos de ciberseguridad
  • — setuid, setgid y sticky bit en profundidad (si existe)
  • — gestion de foreground/background, signals (si existe)