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:
- Se conecta a un puerto TCP local que tu le indiques.
- Espera recibir la password actual (
bandit20) por esa conexion. - 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 / concepto | Para 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 comando | Lanza el proceso en background (segundo plano) |
jobs | Lista los procesos en background de la shell actual |
./suconnect <puerto> | Ejecuta el binario setuid apuntando al puerto |
| setuid bit | Permiso especial: el binario corre con los privilegios de su propietario (aqui bandit21), no con los del usuario que lo lanza |
| localhost / 127.0.0.1 | Direccion 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 2220Introduce la password de bandit20 cuando te la pidan.
1. Inspeccionar el binario suconnect
ls -la ~/suconnectVeras 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:
./suconnectUsage: ./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 12345Veras 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 12345Terminal B (el cliente):
./suconnect 12345En 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
| Sintoma | Causa probable | Solucion |
|---|---|---|
nc: Address already in use | El puerto 12345 esta ocupado | Usa otro puerto, p.ej. 13579 o 44444 |
suconnect no imprime nada / cierra sin respuesta | El listener no estaba arriba antes de conectar, o envio la password incorrecta | Lanza primero el nc, comprueba que la pass de bandit20 es correcta |
| La terminal se queda colgada sin mostrar la password | El nc sin `echo | ` espera input del teclado en lugar de enviar la pass |
[1]+ Exit 1 en lugar de Done | nc termino con error (puerto rechazado o no llego nadie) | Relanza el listener y ejecuta suconnect justo despues |
| No ves la password de bandit21 | La salida se mezclo con el log del job background | Desplazate 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 2220Introduce <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)