OverTheWire Bandit: guía de los niveles 0 al 15 con pistas y comandos
Resuelve OverTheWire Bandit del nivel 0 al 15: qué enseña cada nivel, pistas y los comandos Linux que lo resuelven, sin destripar las contraseñas.
OverTheWire Bandit es el primer wargame que casi todo el mundo recomienda para empezar en el hacking ético, y con razón: te obliga a moverte por una terminal Linux real para encontrar la contraseña de cada nivel. En esta guía repasamos los niveles 0 al 15 uno por uno: qué te piden, qué concepto de Linux enseñan, una pista para que lo intentes por tu cuenta y los comandos que lo resuelven. Lo que no vas a encontrar aquí son las contraseñas: cambian periódicamente y copiarlas te quita justo lo que el juego te enseña.
Qué es OverTheWire Bandit y por qué empezar por aquí
OverTheWire es una comunidad que mantiene varios wargames gratuitos. Bandit es el de nivel más básico: cada nivel es un usuario en un servidor Linux (bandit0, bandit1, bandit2...) y tu objetivo es encontrar la contraseña del siguiente usuario escondida en algún sitio del sistema. No hay que instalar nada raro ni hay interfaz gráfica: solo tú, SSH y la terminal.
Eso lo convierte en el mejor entrenamiento para lo que vendrá después. Casi todas las máquinas de CTF y los laboratorios de pentesting asumen que sabes listar archivos ocultos, buscar con find, filtrar con grep o decodificar Base64 sin pensarlo. Bandit te enseña exactamente eso, paso a paso. Si todavía no tienes claro el camino general, lee antes cómo aprender hacking ético desde cero.
Antes de empezar: cómo conectarte y cómo trabajar
Necesitas un cliente SSH. En Linux y macOS ya viene instalado, y en Windows 10/11 también (desde PowerShell). Si quieres un entorno de prácticas completo, te sirve una máquina virtual con Kali: lo explicamos en Kali Linux para principiantes.
ssh bandit0@bandit.labs.overthewire.org -p 2220
Fíjate en el -p 2220: el servidor no escucha en el puerto 22 estándar. La contraseña del nivel 0 te la da la propia web del juego. A partir de ahí, cada contraseña que encuentres te sirve para entrar como el siguiente usuario: ssh bandit1@bandit.labs.overthewire.org -p 2220, y así sucesivamente.
Tres hábitos que te ahorrarán tiempo:
- Apunta las contraseñas en un archivo de tu ordenador, no en el servidor. Si cierras sesión, podrás volver al último nivel sin repetir nada.
- Lee la página de cada nivel en la web de OverTheWire. Incluye la lista de comandos que probablemente necesitarás: es la mejor pista que existe.
- Usa
man.man findoman tarte dan la respuesta oficial. Aprender a leer manuales es parte del juego.
Niveles 0 a 5: moverte por el sistema de archivos
Nivel 0 → 1: leer un archivo
Objetivo: la contraseña está en un archivo llamado readme en tu directorio personal.
Concepto: listar archivos y mostrar su contenido. ls enseña lo que hay en una carpeta y cat imprime un archivo en pantalla.
ls
cat readme
Nivel 1 → 2: un archivo llamado "-"
Objetivo: la contraseña está en un archivo llamado -.
Concepto: para muchos programas, - no es un nombre de archivo sino "la entrada estándar". Si escribes cat -, el comando se queda esperando a que teclees algo.
Pista: dale al comando una ruta que no se pueda confundir con una opción. ./ significa "en el directorio actual".
cat ./-
Nivel 2 → 3: espacios (y guiones) en el nombre
Objetivo: la contraseña está en un archivo cuyo nombre contiene espacios. En la versión actual del juego, además, empieza y termina con guiones (--spaces in this filename--).
Concepto: la shell separa los argumentos por espacios, así que cat spaces in this filename intenta abrir cuatro archivos distintos. Hay que entrecomillar el nombre o escapar cada espacio con \. Y si empieza por --, también hay que evitar que se lea como opción.
Pista: escribe las primeras letras y pulsa Tab; el autocompletado escapa el nombre por ti.
cat ./"--spaces in this filename--"
# alternativa: "--" indica a cat que ya no vienen más opciones
cat -- "--spaces in this filename--"
Nivel 3 → 4: archivos ocultos
Objetivo: la contraseña está en un archivo oculto dentro del directorio inhere.
Concepto: en Linux, cualquier archivo cuyo nombre empiece por punto (.) está oculto y ls no lo muestra. La opción -a enseña todo, y -l añade permisos, propietario y tamaño.
ls -la inhere
cat inhere/<nombre_del_archivo_oculto>
Este ls -la lo vas a escribir miles de veces en tu vida: los archivos ocultos (configuraciones, claves, historiales) son de lo primero que se revisa en cualquier máquina.
Nivel 4 → 5: el único archivo legible
Objetivo: en inhere hay diez archivos (-file00 a -file09) y solo uno contiene texto legible.
Concepto: el comando file identifica el tipo de un archivo mirando su contenido, no su extensión. Los demás archivos son datos binarios.
Pista: los nombres empiezan por guion otra vez; ya sabes cómo resolverlo.
file ./inhere/*
cat ./inhere/-file0X # el que aparezca como "ASCII text"
Nivel 5 → 6: buscar por propiedades
Objetivo: el archivo está en algún lugar bajo inhere (hay muchas subcarpetas) y es legible, ocupa exactamente 1033 bytes y no es ejecutable.
Concepto: find recorre directorios y filtra por nombre, tipo, tamaño, permisos o propietario. En -size, el sufijo c significa bytes; sin él, find cuenta en bloques de 512 bytes.
find inhere -type f -size 1033c ! -executable
Niveles 6 a 11: buscar, filtrar y decodificar
Nivel 6 → 7: buscar en todo el servidor
Objetivo: el archivo está "en algún lugar del servidor", pertenece al usuario bandit7, al grupo bandit6 y ocupa 33 bytes.
Concepto: buscar desde la raíz / con filtros de propietario y grupo. Saldrán cientos de errores de "Permission denied"; 2>/dev/null redirige la salida de errores (descriptor 2) a la nada para que solo veas los resultados.
find / -user bandit7 -group bandit6 -size 33c 2>/dev/null
Esta misma técnica es la que se usa en escalada de privilegios para localizar archivos de otros usuarios o binarios con permisos especiales.
Nivel 7 → 8: grep
Objetivo: la contraseña está en data.txt, al lado de la palabra millionth.
Concepto: el archivo es enorme; leerlo con cat no es práctico. grep muestra solo las líneas que contienen un patrón.
grep millionth data.txt
Nivel 8 → 9: la línea que no se repite
Objetivo: en data.txt, la contraseña es la única línea que aparece una sola vez.
Concepto: tuberías (|). uniq solo detecta duplicados consecutivos, por eso primero hay que ordenar con sort. La opción -u de uniq muestra solo las líneas únicas.
sort data.txt | uniq -u
Un error muy común es probar uniq -u data.txt sin ordenar y no entender por qué salen cientos de líneas.
Nivel 9 → 10: texto dentro de un binario
Objetivo: data.txt es mayoritariamente binario; la contraseña es una de las pocas cadenas legibles y va precedida de varios signos =.
Concepto: strings extrae las secuencias de caracteres imprimibles de cualquier archivo. Es una herramienta básica en análisis de malware e ingeniería inversa.
strings data.txt | grep "=="
Nivel 10 → 11: Base64
Objetivo: data.txt contiene datos codificados en Base64.
Concepto: Base64 no es cifrado, es una codificación para transportar datos como texto. Cualquiera puede revertirla. Lo reconocerás por sus letras, números, +, / y, a menudo, = al final.
base64 -d data.txt
Nivel 11 → 12: ROT13 con tr
Objetivo: en data.txt, todas las letras han sido rotadas 13 posiciones.
Concepto: ROT13 es un cifrado César con desplazamiento 13. Como el alfabeto tiene 26 letras, aplicarlo dos veces devuelve el texto original. tr traduce caracteres de un conjunto a otro: aquí, la A pasa a ser N, la B a ser O, etc.
cat data.txt | tr 'A-Za-z' 'N-ZA-Mn-za-m'
Niveles 12 a 15: compresión, claves SSH y red
Nivel 12 → 13: hexdump y compresión en capas
Objetivo: data.txt es un volcado hexadecimal de un archivo que ha sido comprimido varias veces.
Concepto: xxd -r convierte un volcado hexadecimal de vuelta a binario. Luego usas file para saber qué formato tienes en cada paso (gzip, bzip2 o tar) y lo descomprimes con la herramienta correspondiente. Es el nivel más largo hasta ahora, pero solo es repetir el mismo ciclo.
Pista: no tienes permisos de escritura en tu home. Crea un directorio temporal y trabaja ahí.
cd "$(mktemp -d)"
cp ~/data.txt .
xxd -r data.txt > datos
file datos
# Si dice "gzip compressed data":
mv datos datos.gz && gzip -d datos.gz
# Si dice "bzip2 compressed data":
mv datos datos.bz2 && bzip2 -d datos.bz2
# Si dice "POSIX tar archive":
tar xf datos # y luego ejecuta file sobre el archivo que salga
# Repite "file" + descomprimir hasta llegar a "ASCII text"
Ojo con los nombres: gzip -d exige la extensión .gz, por eso renombramos antes. Con tar, el archivo extraído tiene un nombre nuevo; míralo con ls antes de seguir.
Nivel 13 → 14: autenticación con clave privada SSH
Objetivo: esta vez no hay contraseña, sino una clave privada SSH (sshkey.private) que permite entrar como bandit14. La contraseña de bandit14 está en /etc/bandit_pass/bandit14, y solo ese usuario puede leerla.
Concepto: SSH puede autenticar con un par de claves en lugar de contraseña: el servidor tiene la clave pública y tú demuestras que posees la privada. Además, SSH se niega a usar una clave privada si otros usuarios pueden leerla, así que hay que restringir sus permisos.
Copia la clave a tu ordenador con scp (que también usa el puerto 2220) y conéctate desde ahí:
# desde tu máquina, no desde el servidor
scp -P 2220 bandit13@bandit.labs.overthewire.org:sshkey.private .
chmod 600 sshkey.private
ssh -i sshkey.private bandit14@bandit.labs.overthewire.org -p 2220
# ya dentro como bandit14:
cat /etc/bandit_pass/bandit14
Atención a la diferencia: scp usa -P mayúscula para el puerto y ssh usa -p minúscula.
Nivel 14 → 15: hablar con un puerto usando nc
Objetivo: envía la contraseña del nivel actual al puerto 30000 de localhost.
Concepto: un servicio de red no es más que un programa escuchando en un puerto. nc (netcat) abre una conexión TCP y envía lo que le pases por la entrada estándar. Lo usarás muchísimo para probar servicios y para shells reversas.
cat /etc/bandit_pass/bandit14 | nc localhost 30000
Nivel 15 → 16: lo mismo, pero cifrado con TLS
Objetivo: envía la contraseña del nivel actual al puerto 30001 de localhost, que exige SSL/TLS.
Concepto: netcat habla en texto plano; si el servicio espera una conexión cifrada, la conexión falla. openssl s_client establece la conexión TLS y después funciona como un netcat cifrado. Es la herramienta de referencia para inspeccionar certificados y servicios HTTPS a mano.
cat /etc/bandit_pass/bandit15 | openssl s_client -connect localhost:30001 -quiet
Pista importante: en modo interactivo, s_client interpreta algunas líneas que empiezan por ciertas letras (como R o Q) como órdenes propias, no como datos. Si una contraseña empieza por una de ellas, la conexión hace cosas raras. La opción -quiet desactiva ese comportamiento y además oculta toda la información del certificado.
Resumen: qué te llevas de cada nivel
| Nivel | Concepto | Comando clave |
|---|---|---|
| 0 → 1 | Leer archivos | ls, cat |
| 1 → 2 | Nombres que parecen opciones | cat ./- |
| 2 → 3 | Espacios en nombres | comillas, --, Tab |
| 3 → 4 | Archivos ocultos | ls -la |
| 4 → 5 | Tipo de archivo | file |
| 5 → 6 | Buscar por tamaño y permisos | find -size -executable |
| 6 → 7 | Buscar por propietario | find / -user -group, 2>/dev/null |
| 7 → 8 | Filtrar texto | grep |
| 8 → 9 | Tuberías y duplicados | sort | uniq -u |
| 9 → 10 | Texto en binarios | strings |
| 10 → 11 | Codificación | base64 -d |
| 11 → 12 | Cifrado clásico | tr (ROT13) |
| 12 → 13 | Hexdump y compresión | xxd -r, gzip, bzip2, tar |
| 13 → 14 | Claves SSH | scp, chmod 600, ssh -i |
| 14 → 15 | Conexiones TCP | nc |
| 15 → 16 | Conexiones TLS | openssl s_client |
Errores típicos de principiante en Bandit
- Olvidar el puerto 2220 y pensar que el servidor está caído.
- Copiar la contraseña con un espacio de más al principio o al final. Si te dice que es incorrecta, pégala en un editor y revísala.
- Buscar las soluciones antes de pelearte con el nivel. Date al menos 20-30 minutos y la página
manantes de mirar una pista. La frustración de esos minutos es exactamente donde se aprende. - Trabajar en directorios compartidos. En el nivel 12 usa siempre
mktemp -d; otros jugadores usan el mismo servidor.
Recuerda: Bandit es un entorno diseñado para practicar. Las técnicas de búsqueda y conexión que aprendes aquí solo deben usarse en sistemas propios o en plataformas y auditorías donde tengas autorización expresa.
Qué hacer después de Bandit
Bandit tiene más niveles (hasta el 34 aproximadamente) que entran en escaneo de puertos con nmap, tareas cron, Git y escapes de shells restringidas. Merece la pena terminarlo. Después, estos son los siguientes pasos lógicos:
- Natas (también en OverTheWire): seguridad web desde el navegador. Código fuente, cookies, inyecciones y lógica del lado servidor.
- Leviathan: wargame corto centrado en binarios con permisos SUID y en entender qué hace un programa sin tener su código.
- picoCTF: retos tipo CTF de todas las categorías (criptografía, forense, web, reversing), pensados para estudiantes y con dificultad progresiva.
- TryHackMe: salas guiadas con máquinas virtuales en el navegador, ideales para dar el salto a pentesting de máquinas completas.
Si prefieres un camino estructurado en español, con lecciones y retos prácticos ordenados, échale un vistazo a la Academia de Hackers en Acción. Y si todavía no tienes tu laboratorio montado, empieza por instalar Kali Linux en una máquina virtual: lo vas a necesitar en cuanto salgas de Bandit.