Ejercicio prático de Bandit
Bandit es un juego de guerra (wargame) de la plataforma OverTheWire que está diseñado para enseñar los fundamentos de la seguridad y el hacking en Linux. Ideal para principiantes, cada nivel te reta a encontrar una contraseña que te permitirá acceder al siguiente.
🌐 Ir al juego en OverTheWire
🏴☠️ Bandit Level 0 → Level 1
🔐 Objetivo: Acceder al usuario bandit1 encontrando la contraseña oculta en el sistema del usuario bandit0.
1️⃣ Conectarse al servidor
ssh bandit0@bandit.labs.overthewire.org -p 2220
🧠 _Te pedirá la contraseña, que para el nivel 0 es:bandit0 a
📘 👉 📚 ¿No sabes cómo funciona ssh? Mira mis apuntes aquí → SSH
2️⃣ Leer el contenido del archivoa
Al conectarte, verás un archivo llamado readme.
ls
cat readme
Para pasar al siguiente nivel
sshpass -p '<contraseña>' ssh bandit01@bandit.labs.overthewire.org -p 2220
🏴☠️ Bandit Level 1 → Level 2
El archivo se llama -, lo cual normalmente en la terminal se interpreta como entrada estándar (stdin). Esto puede confundir comandos como cat.
✅ Solución
Usa cat indicando explícitamente el archivo como ruta relativa:
cat ./-
y para pasar al siguiente nivel
sshpass -p '<contraseña>' ssh bandit2@bandit.labs.overthewire.org -p 2220
🏴☠️ Bandit Level 2 → Level 3
🎯 Objetivo del nivel:
Encontrar la contraseña que está guardada en un archivo llamado:
spaces in this filename
🧠 Problema:
El nombre del archivo contiene espacios, por lo que no puedes usar cat o cualquier otro comando tal cual, ya que el terminal interpretaría cada palabra como un argumento distinto.
👨💻 Solución: Tienes varias formas de manejarlo:
✅ Opción 1: Comillas
`cat "spaces in this filename"`
✅ Opción 2: Escape de espacios con \
cat spaces\ in\ this\ filename
✅ Opción 3: Autocompletar con TAB
Escribe el inicio del nombre, por ejemplo:
cat spa
y presiona TAB. El terminal lo completará automáticamente por ti si no hay más archivos con nombres parecidos.
📥 Esto te dará la contraseña para el usuario bandit3.
sshpass -p '<contraseña>' ssh bandit3@bandit.labs.overthewire.org -p 2220
🏴☠️ Bandit Level 3 → Level 4
🎯 Objetivo:
Encontrar un archivo oculto dentro del directorio inhere que contiene la contraseña.
👨💻 Solución: Es un fichero oculto dentro de la carpeta inhere. El comando para listar los comandos ocultos
ls -a
🔹 Léelo con:
cat .nombre_del_archivo
🔐 Acceder al siguiente nivel
Una vez tengas la contraseña:
sshpass -p '<contraseña>' ssh bandit4@bandit.labs.overthewire.org -p 2220
🏴☠️ Bandit Level 4 → Level 5
🎯 Objetivo:
Encontrar un archivo normal (no oculto) en inhere/ que:
-
✅ Sea legible
-
✅ No tenga tamaño cero
-
✅ No sea un directorio
El comando
find . | xargs file
🧠 ¿Qué hace este comando?
-
find .
Busca todos los archivos y carpetas desde el directorio actual (.). -
|
Envía la salida defindcomo entrada al siguiente comando (xargs). -
xargs file
Aplica el comandofilea cada elemento encontrado.filedetecta el tipo de contenido (por ejemplo:ASCII text,directory, etc).
El nombre del archivo comienza con-, lo que puede confundir a comandos comocat, que lo interpretan como una opción en lugar de un nombre de archivo.cat ./-file07
Para pasar al siguiente nivel
sshpass -p '<contraseña>' ssh bandit5@bandit.labs.overthewire.org -p 2220
🏴☠️ Bandit Level 4 → Level 5
🎯 Objetivo:
Encontrar un archivo bajo el directorio inhere que cumpla con las siguientes propiedades:
-
Legible para humanos (contenido en texto plano).
-
1033 bytes de tamaño.
-
No es ejecutable.
find * -type f -size 1033c ! -executable | xargs cat
🧠 ¿Qué hace este comando?
-
find ** -type f: Busca todos los archivos regulares en el directorio actual. -
-size 1033c: Filtra los archivos que tienen exactamente 1033 bytes de tamaño. -
! -executable: Excluye los archivos ejecutables con el signo!. -
| xargs cat: Muestra el contenido del archivo encontrado.
Una vez encontrado el archivo con la contraseña, utiliza:
Para pasar al siguiente nivel
sshpass -p '<contraseña>'
' ssh bandit6@bandit.labs.overthewire.org -p 2220
🏴☠️ Bandit Level 5 → Level 7
🎯 Objetivo:
Encontrar un archivo en el servidor que tenga las siguientes propiedades:
-
Propietario:
bandit7. -
Grupo:
bandit6. -
Tamaño: 33 bytes.
Comando:
find / -user bandit7 -group bandit6 -size 33c 2>/dev/null | xargs cat
🧠 ¿Qué hace este comando?
-
find /: Comienza la búsqueda en el directorio raíz (/). -
-user bandit7: Filtra los archivos que son propiedad del usuariobandit7. -
-group bandit6: Filtra los archivos que pertenecen al grupobandit6. -
-size 33c: Filtra los archivos que tienen un tamaño exacto de 33 bytes. -
2>/dev/null: Suprime los errores para evitar ver mensajes como "permiso denegado" al buscar en directorios sin acceso. -
| xargs cat: Muestra el contenido del archivo que cumpla con todas las condiciones anteriores.
Avanzar al siguiente nivel:
sshpass -p '<contraseña>' ssh bandit7@bandit.labs.overthewire.org -p 2220
🏴☠️ Bandit Level 7 → Level 8
🎯 Objetivo:
Encontrar la contraseña para el siguiente nivel, la cual está almacenada en el archivo data.txt, al lado de la palabra "millionth".
Comando:
cat data.txt | grep "millionth" | awk '{print $2}'
🧠 ¿Qué hace este comando?
-
cat data.txt: Muestra el contenido del archivodata.txt. -
grep "millionth": Filtra las líneas que contienen la palabra "millionth". -
awk '{print $2}': Extrae la segunda palabra de las líneas filtradas (la cual es la contraseña).
Avanzar al siguiente nivel:
sshpass -p '<contraseña>' ssh bandit8@bandit.labs.overthewire.org -p 2220
🏴☠️ Bandit Level 8 → Level 9
🎯 Objetivo:
La contraseña para el siguiente nivel está almacenada en el archivo data.txt y es la única línea de texto que aparece solo una vez.
Comando:
sort data.txt | uniq -u
🧠 ¿Qué hace este comando?
-
sort data.txt: Ordena las líneas del archivodata.txtalfabéticamente. -
uniq -u: Filtra y muestra solo las líneas únicas (que aparecen solo una vez) del archivo.
Avanzar al siguiente nivel:
sshpass -p '<contraseña>'
' ssh bandit9@bandit.labs.overthewire.org -p 2220
🏴☠️ Bandit Level 9 → Level 10
🎯 Objetivo:
La contraseña para el siguiente nivel está almacenada en el archivo data.txt y es una de las pocas cadenas legibles para humanos que está precedida por varios caracteres =.
Comando:
strings data.txt | grep "=="
🧠 ¿Qué hace este comando?
-
strings data.txt: Muestra todas las cadenas legibles (human-readable) dentro del archivodata.txt. -
grep "==": Filtra y muestra solo las líneas que contienen==(indica la posición de la contraseña).
Avanzar al siguiente nivel:
sshpass -p '<contraseña>' ssh bandit10@bandit.labs.overthewire.org -p 2220
🏴☠️ Bandit Level 10 → Level 11
🎯 Objetivo:
La contraseña para el siguiente nivel está almacenada en el archivo data.txt, que contiene datos codificados en base64.
Comando:
cat data.txt | base64 -d
🧠 ¿Qué hace este comando?
-
cat data.txt: Muestra el contenido del archivodata.txt. -
base64 -d: Decodifica los datos de base64 a su formato original (texto legible).
Avanzar al siguiente nivel:
sshpass -p '<contraseña>' ssh bandit11@bandit.labs.overthewire.org -p 2220
🏴☠️ Bandit Level 11 → Level 12
🎯 Objetivo:
La contraseña para el siguiente nivel está almacenada en el archivo data.txt, donde todas las letras (mayúsculas y minúsculas) han sido rotadas 13 posiciones en el alfabeto (cifrado ROT13).
🧠 ¿Qué es ROT13?
Es una forma simple de cifrado que reemplaza cada letra por la que se encuentra 13 posiciones más adelante en el alfabeto. Si se aplica dos veces, el texto vuelve a ser legible.
✅ Comando para decodificar:
cat data.txt | tr 'A-Za-z' 'N-ZA-Mn-za-m'
📥 Esto mostrará el contenido original descifrado, incluyendo la contraseña.
🔐 Avanzar al siguiente nivel:
sshpass -p '<contraseña>' ssh bandit12@bandit.labs.overthewire.org -p 2220
🏴☠️ Bandit Level 12 → Level 13
🎯 Objetivo:
La contraseña está oculta en un archivo llamado data.txt, el cual es un hexdump de un archivo que ha sido comprimido múltiples veces.
Tu misión: reconstruir el archivo original y descomprimirlo tantas veces como sea necesario hasta revelar la contraseña.
📦 Pasos sugeridos:
1️⃣ Crear un directorio temporal en /tmp
Esto evita ensuciar tu directorio y reduce errores con permisos:
mkdir $(mktemp -d /tmp/banditXXXX) cd /tmp/banditXXXX
2️⃣ Copiar el archivo y reconstruir el binario original desde el hexdump
cp ~/data.txt . xxd -r data.txt > decode.gz
3️⃣ Detectar el tipo de archivo
file decode.gz`
🔍 Repite este paso tras cada extracción para saber el tipo de compresión.
4️⃣ Descomprimir el archivo
7z x decode.gz
ℹ️ Se usará 7z porque detecta y descomprime múltiples formatos: gzip, bzip2, tar, etc.
5️⃣ Seguir descomprimiendo
Repite el proceso de detección y extracción sobre cada archivo extraído, hasta que finalmente obtengas un archivo de texto plano que contiene la contraseña.
💡 TIP para hacerlo más fácil:
Puedes automatizar el proceso con este script:
#!/bin/bash
function ctrl_c(){
echo -e "\n\n[!] Saliendo...\n"
exit 1
}
# Ctrl+C
trap ctrl_c INT
first_file_name="data.gz"
decompressed_file_name="$(7z l data.gz | tail -n 3 | head -n 1 | awk 'NF{print $NF}')"
7z x $first_file_name &>/dev/null
while [ $decompressed_file_name ]; do
echo -e "\n[+] Nuevo archivo descomprimido: $decompressed_file_name"
7z x $decompressed_file_name &>/dev/null
decompressed_file_name="$(7z l $decompressed_file_name 2>/dev/null | tail -n 3 | head -n 1 | awk 'NF{print $NF}')"
done
-
Define una función
ctrl_c- Muestra un mensaje y finaliza el script si el usuario presiona
Ctrl+C.
- Muestra un mensaje y finaliza el script si el usuario presiona
-
Activa la detección de Ctrl+C
- Usa
trappara ejecutarctrl_ccuando se interrumpe el script.
- Usa
-
Define el nombre del primer archivo
- Se asume que es
data.gz(ya extraído del hexdump conxxd -r).
- Se asume que es
-
Obtiene el nombre del archivo dentro de
data.gz- Usa
7z l,tail,headyawkpara extraer solo el nombre del contenido.
- Usa
-
Extrae el primer archivo
- Usa
7z xpara descomprimirdata.gz.
- Usa
-
Bucle
whilepara descomprimir recursivamente-
Mientras haya archivos dentro de archivos:
-
Muestra el nombre del nuevo archivo.
-
Lo descomprime.
-
Extrae el nombre del siguiente archivo interno.
-
-
-
El bucle termina automáticamente
- Cuando ya no hay más archivos comprimidos dentro, finaliza el proceso
🔐 Avanzar al siguiente nivel:
- Cuando ya no hay más archivos comprimidos dentro, finaliza el proceso
sshpass -p '<contraseña>' ssh bandit13@bandit.labs.overthewire.org -p 2220
🏴☠️ Bandit Level 13 → Level 14
🎯 Objetivo:
Acceder al usuario bandit14 utilizando una clave privada SSH proporcionada en el archivo sshkey.private.
🧠 ¿Qué hace especial este nivel?
Este nivel no requiere una contraseña tradicional. En su lugar, se conecta mediante autenticación por clave pública/privada SSH.
📘 👉 ¿No sabés cómo funciona esto? Mirá esta sección de mis apuntes: SSH#3. Autenticación con Claves SSH (Sin Contraseña)
Hay un clave privada asi que no necesita saber la contraseña solo desde la propia maquina
📡 Conéctate al siguiente nivel con la clave:
ssh -i sshkey.private bandit14@bandit.labs.overthewire.org -p 2220
🕵️♂️ Obtener la contraseña del usuario badnti14:
cat /etc/bandit_pass/bandit14
🏴☠️ Bandit Level 14 → Level 15
🎯 Objetivo:
Enviar la contraseña a un servidor en el puerto 30000 local usando netcat para obtener la siguiente contraseña.
📡 Netcat (nc) es una herramienta que permite enviar datos por red, útil para probar puertos y comunicarse con servicios directamente.
Para más información sobre el tema, revisa 🖧 Puertos y Conexiones de Red en Linux
✅ Pasos a seguir:
🧪 Conectarse al puerto:
nc localhost 30000
🔐 Pegar la contraseña obtenida en el paso anterior (de bandit14) y presionar Enter.
🔐 Avanzar al siguiente nivel:
sshpass -p '<contraseña>' ssh bandit15@bandit.labs.overthewire.org -p 2220
🏴☠️ Bandit Level 15 → Level 16
🎯 Objetivo:
Conectarse al servidor utilizando ncat con SSL para obtener la siguiente contraseña.
📡 Ncat permite establecer conexiones seguras con el uso de SSL, lo cual es útil para conectarse a servicios que requieren un canal cifrado. Aquí hablo sobre 🖧 Puertos y Conexiones de Red en Linux para más información.
✅ Pasos a seguir:
🧪 Conectarse al puerto con Ncat utilizando SSL:
ncat --ssl localhost 30001
🔐 La respuesta será la contraseña:
🔑 Avanzar al siguiente nivel:
sshpass -p '<contraseña>' ssh bandit16@bandit.labs.overthewire.org -p 2220
🏴☠️ Bandit Level 16 → Level 17
🎯 Objetivo:
Enviar la contraseña actual a un servidor local escuchando en algún puerto entre 31000 y 32000.
Solo uno de esos puertos responde correctamente con la contraseña del siguiente nivel.
Los demás solo te devolverán lo que envíes, o responderán con mensajes como "DONE", "RENEGOTIATING", etc.
1️⃣ Escanear los puertos entre 31000 y 32000
Usa nmap para encontrar los puertos abiertos en localhost:
nmap -p 31000-32000 localhost
📌 Resultado:

📡 2. Probar puertos con ncat y enviar la contraseña actual:
ncat --ssl localhost 31790
💾 3. Guardar y usar la clave privada
Una vez obtengas la clave:
-
Guárdala en un archivo llamado
id_rsa:
nano id_rsa -
Pega la clave privada completa (incluyendo
-----BEGIN RSA PRIVATE KEY-----hasta-----END RSA PRIVATE KEY-----), y guarda. -
Asigna los permisos correctos al archivo para que SSH pueda usarlo:
chmod 600 id_rsa
ssh -i id_rsa bandit17@bandit.labs.overthewire.org -p 2220
🏴☠️ Bandit Level 17 → Level 18
🎯 Objetivo del nivel:
Encontrar la contraseña para el siguiente nivel, que está en el archivo passwords.new, en la única línea que ha cambiado respecto a passwords.old.
🧠 Pistas del nivel:
-
Ambos archivos (
passwords.oldypasswords.new) están en el directorio home. -
Solo una línea fue modificada.
-
Hay que usar
diffpara comparar los archivos.
👨💻 Solución:
Comparar los archivos con el comando diff
diff passwords.old passwords.new
📤 Resultado:

📥 Conéctate al siguiente nivel:
sshpass -p '<contraseña>' ssh bandit18@bandit.labs.overthewire.org -p 2220
⚠️ NOTA IMPORTANTE:
Si al conectarte abandit18vesByebye!, no es un error.
Esto forma parte del siguiente nivel (bandit19) y tiene que ver con cómo funciona el shell debandit18.
🏴☠️ Bandit Level 18 → Level 19
🎯 Objetivo:
Acceder al usuario bandit19, pero al intentar conectarte como bandit18, el servidor te expulsa inmediatamente con un mensaje: Byebye!
🧠 ¿Qué está pasando?
Alguien ha modificado el archivo ~/.bashrc, el cual se ejecuta automáticamente al iniciar sesión. En este caso, contiene un comando que expulsa al usuario inmediatamente.
👨💻 ¿Cómo evitar que se ejecute .bashrc?
La idea es ejecutar un comando al momento de conectarse, de modo que no se inicie una sesión interactiva (la cual cargaría .bashrc).
✅ Solución: Usamos ssh para ejecutar directamente el comando cat readme (el archivo readme contiene la contraseña para el siguiente nivel):
sshpass -p '<contraseña>' ssh bandit18@bandit.labs.overthewire.org -p 2220 cat readme
📤 Esto imprimirá directamente la contraseña sin abrir una shell interactiva.
📥 Conéctate al siguiente nivel:
sshpass -p '<contraseña>' ssh bandit19@bandit.labs.overthewire.org -p 2220
🏴☠️ Bandit Level 19 → Level 20
🎯 Objetivo:
Usar el binario especial bandit20-do para ejecutar comandos como otro usuario (bandit20) y así obtener la contraseña del siguiente nivel.
🧠 ¿Qué es setuid?
Es una propiedad que permite que un archivo ejecutable se ejecute con los privilegios del propietario, en este caso bandit20, aunque lo ejecute bandit19.
Esto nos permite hacer cosas como leer archivos que normalmente no podríamos.
📚 Aquí hablo más sobre esto: 🔐👤👥 Gestión de Usuarios, Grupos y Permisos en Linux#🛡️ SUID y SGID en Linux

-
rws: indica que el bitsetuidestá activo (s). -
Propietario:
bandit20→ ejecutará comandos como ese usuario.
Al ejecutarlo nos pide que podemos ejecutar comando
💬 Al ejecutarlo sin argumentos:
./bandit20-do
Nos dice que podemos ejecutar comandos como otro usuario. Ejemplo:
./bandit20-do id
✅ Entonces, para obtener la contraseña del siguiente nivel:
./bandit20-do cat /etc/bandit_pass/bandit20
📥 Conéctate al siguiente nivel:
sshpass -p '<contraseña>' ssh bandit20@bandit.labs.overthewire.org -p 2220
🏴☠️ Bandit Level 20 → Level 21
🎯 Objetivo:
Usar el binario suconnect (con permisos especiales) para conectar a un puerto en localhost, enviar la contraseña del nivel actual y recibir la contraseña del siguiente nivel.
📦 El binario está en el home:
./suconnect <puerto>
Este programa se conecta a localhost:<puerto> y espera recibir la contraseña de bandit20 desde el otro extremo. Si es correcta, te devuelve la contraseña de bandit21.
✅ Pasos a seguir:
1️⃣ Verifica el binario
ls -l
-rwsr-x--- 1 bandit21 bandit20 15608 suconnect
🔐 El bit
senrwsindica que el binario se ejecuta con los permisos del propietario (bandit21), aunque tú seasbandit20. Eso permite acceder a la contraseña del siguiente nivel.
2️⃣ Lanza un servidor en un puerto (por ejemplo el 6664)
nc -nlvp 6664
Esto espera conexiones entrantes.
3️⃣ En otro terminal, ejecuta el binario:
./suconnect 6664
El programa se conectará a tu netcat. En el terminal donde está escuchando nc, verás algo así como:
Connection received on 127.0.0.1
4️⃣ Pega la contraseña del nivel 20 (la que ya tienes) en el servidor (netcat):
Si es correcta, el binario te devuelve la contraseña del siguiente nivel en el mismo netcat:

📥 Conéctate al siguiente nivel:
sshpass -p '<contraseña>' ssh bandit21@bandit.labs.overthewire.org -p 2220
🏴☠️ Bandit Level 21 → Level 22
🎯 Objetivo:
Acceder al siguiente nivel al examinar las tareas programadas en el sistema y encontrar la forma de obtener la contraseña del usuario bandit22.
📚 Aquí hablo más cron: ⏰ Automatización con cron en Linux
1️⃣ Revisar las tareas programadas en /etc/cron.d
Al conectarte al sistema, encontrarás varias tareas programadas. Nos vamos a centrar en la tarea cronjob_bandit22, que se ejecuta cada minuto y lanza un script llamado cronjob_bandit22.sh.
Para ver las tareas programadas, ejecuta:
bandit21@bandit:/etc/cron.d$ cat cronjob_bandit22
La salida:

Esto indica que el script cronjob_bandit22.sh se ejecuta cada minuto bajo el usuario bandit22.
2️⃣ Revisar el contenido del script cronjob_bandit22.sh
Ahora, vamos a examinar el script cronjob_bandit22.sh para entender qué hace. Este script se encuentra en la ruta /usr/bin/cronjob_bandit22.sh y contiene instrucciones para cambiar los permisos de un archivo temporal y copiar la contraseña de bandit22 en él.

Este script hace lo siguiente:
-
Cambia los permisos del archivo temporal
/tmp/t7O6lds9S0RqQh9aMcz6ShpAoZKF7fgvpara que todos los usuarios puedan leerlo. -
Copia la contraseña del archivo
/etc/bandit_pass/bandit22al archivo temporal mencionado.
3️⃣ Acceder a la contraseña debandit22
Dado que el archivo/tmp/t7O6lds9S0RqQh9aMcz6ShpAoZKF7fgvtiene permisos644, cualquier usuario puede leerlo. Ahora, solo tenemos que ver su contenido para obtener la contraseña.
Ejecuta:
cat /tmp/t7O6lds9S0RqQh9aMcz6ShpAoZKF7fgv
La salida mostrará la contraseña de bandit22
📥 Conéctate al siguiente nivel:
Ahora que tienes la contraseña, puedes acceder al siguiente nivel:
sshpass -p '<contraseña>' ssh bandit22@bandit.labs.overthewire.org -p 2220
🏴☠️ Bandit Level 22 → Level 23
🎯 Objetivo:
Acceder al siguiente nivel mediante la manipulación de tareas programadas, específicamente a través de un cronjob, para obtener la contraseña del usuario bandit23.
1️⃣ Revisar las tareas programadas en /etc/cron.d
Al igual que en el nivel anterior, el objetivo es centrarnos en las tareas programadas. En este caso, hay un cronjob que ejecuta el script cronjob_bandit23.sh, tanto al reiniciar el sistema como cada minuto.
Conéctate al servidor y revisa el contenido del archivo cronjob_bandit23:
bandit22@bandit:/etc/cron.d$ cat cronjob_bandit23`
La salida:

Esta configuración indica que el script cronjob_bandit23.sh se ejecuta cada minuto y también al reiniciar el sistema.
2️⃣ Revisar el contenido del script cronjob_bandit23.sh
El siguiente paso es analizar el script cronjob_bandit23.sh, que contiene el código responsable de obtener la contraseña del usuario bandit23. Veamos qué hace este script:
bandit22@bandit:/etc/cron.d$ cat /usr/bin/cronjob_bandit23.sh
El contenido del script es el siguiente:

Análisis del script:
-
En la variable
myname, se guarda la salida dewhoami. En este caso, seríabandit23. -
Luego, se genera un hash MD5 a partir de la cadena "I am user $myname", lo que produce un identificador único. El comando
cut -d ' ' -f 1se usa para seleccionar solo el primer campo (el hash), eliminando el guion (-) que aparece después del hash. -
Este hash se utiliza como nombre de archivo en
/tmp/, donde se guarda la contraseña del usuariobandit23.
3️⃣ Acceder a la contraseña de bandit23
El archivo generado en /tmp/ tendrá el nombre basado en el hash MD5, que corresponde a la contraseña del usuario bandit23. Para encontrar este archivo y ver su contenido, tenemos que ejecutar el comando
- Usa el siguiente comando para calcular el hash MD5 basado en el nombre del usuario:
echo I am user bandit23 | md5sum | cut -d ' ' -f 1
- Ahora, lee el contenido del archivo que corresponde a este hash. Usa el siguiente comando:
cat /tmp/8ca319486bfbbc3663ea0fbe81326349
La salida mostrará la contraseña de bandit23
📥 Conéctate al siguiente nivel:
Ahora que tienes la contraseña, puedes conectarte al siguiente nivel:
sshpass -p '<contraseña>' ssh bandit23@bandit.labs.overthewire.org -p 2220
🏴☠️ Bandit Level 23 → Level 24
🎯 Objetivo:
Aprovechar un cronjob que ejecuta scripts en una carpeta específica para obtener la contraseña del usuario bandit24.
1️⃣ Revisar el cronjob del sistema
Desde el usuario bandit23, revisamos las tareas programadas en /etc/cron.d:
cat /etc/cron.d/cronjob_bandit24
📌 Salida esperada:

✅ Esto nos dice que el script /usr/bin/cronjob_bandit24.sh se ejecuta como bandit24, tanto al iniciar como cada minuto.
2️⃣ Revisar el script que ejecuta el cronjob
cat /usr/bin/cronjob_bandit24.sh
📌 Contenido del script:

🔍 ¿Qué hace este script?
-
Accede a
/var/spool/bandit24/foo/ -
Ejecuta todos los scripts propiedad de
bandit23 -
Borra cada script tras su ejecución
-
Usa
timeoutpara prevenir bloqueos
3️⃣ Crear tu propio script para obtener la contraseña
Primero, crea una carpeta segura temporal y el script:
Ya tienes un buen comienzo con tu script en tu carpeta tmp:
#!/bin/bash
cat /etc/bandit_pass/bandit24 > /tmp/unai_temporal/password_bandit24.txt
chmod +x script.sh
Recuerda que el script será borrado automáticamente tras su ejecución, así que si quieres conservar una copia por si algo falla:
Pon la carpeta temporal que otro puedan para así poder el usuario bandit 24 envie la contraseña
chmod o+wx /tmp/unai_temporal
Ahora tenemos que enviarlo a /var/spool/bandit24/foo. Con el comando:
cp /tmp/unai_temporal/script.sh /var/spool/bandit24/foo/
4️⃣ Esperar la magia 🪄
El cronjob se ejecuta cada minuto, así que tras 1 min deberías poder ver:

sshpass -p '<contraseña>' ssh bandit24@bandit.labs.overthewire.org -p 2220
🏴☠️ Bandit Level 24 → Level 25
🎯 Objetivo:
Conectarse a un servicio en localhost en el puerto 30002 que solicita una contraseña + PIN. El objetivo es hacer fuerza bruta sobre el PIN (de 4 cifras) y encontrar el correcto.
Información inicial:
-
Tienes la contraseña de
bandit24: -
El servicio espera:
<contraseña> <PIN>Ejemplo:
gb8KRRCsshuZXI0tUuR6ypOFjiZbf3G8 1234 -
El PIN es de 0000 a 9999 → total de 10,000 combinaciones.
🛠️ Script para fuerza bruta
Puedes crear un script como este:
#!/bin/bash
for pin in {0000..9999};
do echo "<contraseña> $pin"done | nc localhost 30002
💡 Asegúrate de darle permisos de ejecución:
chmod +x brute.sh
✅ Resultado

📥 Conéctate al siguiente nivel:
Ahora que tienes la contraseña, puedes conectarte al siguiente nivel:
sshpass -p '<contraseña>' ssh bandit25@bandit.labs.overthewire.org -p 2220
🏴☠️ Bandit Level 25 → Level 26
🎯 Objetivo:
Entrar como bandit26 usando una clave SSH, escapar del entorno restringido que ejecuta un script (/usr/bin/showtext) en lugar de un shell, y obtener acceso completo al sistema.
1️⃣ Obtener la clave SSH privada
Desde el usuario bandit25, puedes visualizar la clave SSH de bandit26:
cat bandit26.sshkey
Guárdala como un archivo local en tu máquina:
chmod 600 bandit26.sshkey
2️⃣ Conectarse como bandit26
Usa el siguiente comando desde tu máquina local:
ssh -i bandit26.sshkey -p 2220 bandit26@bandit.labs.overthewire.org
📛 Problema:
No obtienes un shell interactivo. En su lugar, se lanza el script /usr/bin/showtext, que utiliza more para mostrar un archivo de texto.

3️⃣ 🔓 Escapando del programa more
💡 Truco: more permite abrir vi, y desde vi puedes lanzar un shell.
Pasos:
Reduce el tamaño de tu terminal
Para que el contenido no quepa en pantalla y more muestre:
--More--
Presiona la tecla v
Esto abrirá el archivo en el editor vi.
Dentro de vi, escribe:
:set shell=/bin/bash
:shell
:shell
✅ ¡Ahora estás dentro de un shell real como el usuario bandit26!
Cuando nos conectamos nos echan,

🏴☠️ Bandit Level 26 → Level 27
Una vez dentro, notarás que no puedes hacer SSH de vuelta con interactividad. Pero el sistema te da una herramienta: un setuid wrapper llamado bandit27-do.
./bandit27-do cat /etc/bandit_pass/bandit27
📥 Conéctate al siguiente nivel:
Ahora que tienes la contraseña, puedes conectarte al siguiente nivel:
sshpass -p '<contraseña>' ssh bandit27@bandit.labs.overthewire.org -p 2220
🏴☠️ Bandit Level 27 → Level 28
🎯 Objetivo:
Clonar un repositorio Git privado usando SSH y encontrar la contraseña del siguiente nivel.
🧠 ¿Qué es GitHub?
GitHub es un portal creado para alojar el código de las aplicaciones de cualquier desarrollador. Fue comprada por Microsoft en junio del 2018.
La plataforma está diseñada para que los desarrolladores suban el código de sus aplicaciones y herramientas. Como usuario, no sólo puedes descargar la aplicación, sino también leer sobre ella o incluso colaborar con su desarrollo.
📌 Algunas características importantes:
-
Sistema de seguimiento de problemas: para sugerir mejoras, reportar errores o proponer optimizaciones.
-
Revisión de código (Code Review): permite dejar anotaciones en el código para que los creadores puedan revisarlas y discutirlas.
-
Colaboración: puedes participar en discusiones sobre mejoras o cambios en el código.
👉 En los siguientes niveles veremos curiosidades y retos para aprender parámetros y funcionalidades del comando git.
📦 Información proporcionada:
-
Repositorio remoto:
ssh://bandit27-git@localhost/home/bandit27-git/repo -
Puerto:
2220 -
Usuario:
bandit27-git -
Contraseña: la misma que
bandit27
✅ Pasos a seguir:
mkdir /tmp/unai_temporal && cd /tmp/unai_temporal
2️⃣ Clona el repositorio:
git clone ssh://bandit27-git@localhost:2220/home/bandit27-git/repo
🔐 Ignora los mensajes de advertencia sobre la autenticidad del host y
.ssh. Solo confirma conyesy proporciona la contraseña cuando se solicite.
Cloning into 'repo'... remote: Enumerating objects: 3, done. ...
3️⃣ Entra al repositorio clonado:
cd repo
4️⃣ Lista los archivos y lee el README:
ls cat README
📄 Salida:

📥 Conéctate al siguiente nivel:
sshpass -p '<contraseña>' ssh bandit28@bandit.labs.overthewire.org -p 2220
🏴☠️ Bandit Level 28 → Level 29
🎯 Objetivo:
Clonar un repositorio Git privado y buscar la contraseña del siguiente nivel a través de los cambios del proyecto.
📦 Información proporcionada:
-
Repositorio remoto:
ssh://bandit28-git@localhost:2220/home/bandit28-git/repo -
Puerto:
2220 -
Usuario:
bandit28-git -
Contraseña: la misma que
bandit28
✅ Pasos a seguir:
1️⃣ Clona el repositorio en tu máquina:
bash
CopiarEditar
git clone ssh://bandit28-git@localhost:2220/home/bandit28-git/repo
🔐 Acepta la advertencia de autenticidad y proporciona la contraseña cuando se te solicite.
No hay nada de

Revisa los cambios realizados en el proyecto con git log:
git log

5️⃣ Analiza el cambio donde parece haber fuga de información. Verás un cambio sospechoso con un hash específico.
6️⃣ Visualiza los detalles de este cambio utilizando el hash:
git show 674690a00a0056ab96048f7317b9ec20c057c06b
📄 Salida del comando git show:

📥 Conéctate al siguiente nivel:
sshpass -p '<contraseña>' ssh bandit29@bandit.labs.overthewire.org -p 2220
🏴☠️ Bandit Level 29 → Level 30
🎯 Objetivo:
Acceder al siguiente nivel revisando un repositorio Git y obteniendo la contraseña de bandit30 desde el archivo README.md.
📦 Información proporcionada:
- Debes clonar el repositorio para poder revisar las ramas y encontrar la contraseña.
✅ Pasos a seguir:
1️⃣ Clonar el repositorio:
Para comenzar, debes clonar el repositorio usando el siguiente comando:
git clone ssh://bandit29-git@localhost:2220/home/bandit29-git/repo
2️⃣ Cambiar al directorio del repositorio:
Una vez que hayas clonado el repositorio, accede a él con cd repo
3️⃣ Ver las ramas en el repositorio:
En Git, una rama es una versión separada de tu proyecto. Las ramas permiten desarrollar nuevas características o realizar cambios sin afectar el código principal. Algunas ramas pueden estar en tu máquina local y otras pueden ser remotas (en el servidor).
Para listar las ramas disponibles en el repositorio, usa:
git branch # es utilizado para listar las ramas locales en un repositorio de Git
git branch -a # Muestra una lista de **todas las ramas** en el repositorio, tanto locales como remotas.
`
La salida te mostrará algo como esto:

Aquí se pueden observar dos tipos de ramas:
-
Ramas locales: En este caso, solo hay una rama local llamada
master. -
Ramas remotas: Estas son las ramas en el servidor.
origin/master,origin/dev, yorigin/sploits-devson ramas remotas que ya existen en el repositorio.
4️⃣ Cambiar a la rama dev:
Para ver los cambios y buscar la contraseña del siguiente nivel, cambia a la rama dev con el siguiente comando:
git checkout dev
git checkout dev
5️⃣ Revisar el archivo README.md:
Ahora, revisa el contenido del archivo README.md para encontrar las credenciales del siguiente nivel:
cat README.md
La salida mostrará algo como:

📥 Conéctate al siguiente nivel:
sshpass -p 'qp30ex3VLz5MDG1n91YowTv4Q8l7CDZL' ssh bandit30@bandit.labs.overthewire.org -p 2220
🏴☠️ Bandit Level 30 → Level 31
🎯 Objetivo:
Acceder al siguiente nivel utilizando una etiqueta (tag) de Git que contiene la contraseña.
📦 Pasos a seguir:
¿Qué es un tag en Git?
En Git, un tag es como una etiqueta especial que marca un punto específico en la historia de tu proyecto. Es similar a una rama, pero con una gran diferencia: no cambia jamás. 🚀
Un tag es un nombre que apunta a un commit específico y no se mueve, lo que lo hace perfecto para marcar versiones importantes, como lanzamientos. Es decir, un tag es inmutable, siempre apunta al mismo commit y se usa para señalar momentos clave, como versiones o hitos importantes en el repositorio. 🎯
1️⃣ Clonar el repositorio:
Primero, necesitas clonar el repositorio proporcionado para empezar a trabajar con él.
git clone ssh://bandit30-git@localhost:2220/home/bandit30-git/repo
2️⃣ Accede al repositorio:
Entra en el directorio del repositorio clonado:
cd repo
3️⃣ Verifica las etiquetas (tags) en el repositorio:
Ahora, vamos a listar las etiquetas disponibles en el repositorio:
git tag
4️⃣ Acceder al contenido de la etiqueta 'secret':
Para ver el contenido de la etiqueta 'secret', usa el siguiente comando:
git show secret
La salida mostrará la contraseña, que es la siguiente:

📥 Conéctate al siguiente nivel:
Finalmente, conéctate al siguiente nivel utilizando la contraseña obtenida:
sshpass -p '<contraseña>' ssh bandit31@bandit.labs.overthewire.org -p 2220
🏴☠️ Bandit Level 30 → Level 31
🎯 Objetivo: Empujar un archivo key.txt con un contenido específico al repositorio remoto.
Primero, clonamos el repositorio con el siguiente comando:
git clone ssh://bandit31-git@localhost:2220/home/bandit31-git/repo
Luego, creamos el archivo key.txt con el siguiente contenido:
nano key.txt
May I come in?
El archivo fue añadido al área de preparación con el comando:
git add -f key.txt
Realizamos un commit para registrar el archivo en el repositorio:
git commit -m "Fichero nuevo subido"
Una vez realizado el commit, ahora empujamos los cambios al repositorio remoto:
git push -u origin master
Al hacer el push, el sistema valida el archivo y, si todo está correcto, te da la contraseña para el siguiente nivel:

📥 Conéctate al siguiente nivel:
Finalmente, conéctate al siguiente nivel utilizando la contraseña obtenida:
sshpass -p '<contraseña>' ssh bandit32@bandit.labs.overthewire.org -p 2220
🏴☠️ Bandit Level 33 → Level 34
🎯 Objetivo: ¡Accede al siguiente nivel utilizando el "Uppercase Shell"! 🚀
🚨 Problema:
Al intentar usar ls, obtienes:
ls: Permission denied
🧩 Solución: ¡Usa el comando especial!
Ejecuta:
$0
Esto te llevará a un shell sin restricciones .
🎉 Final
¡Has terminado el juego de Bandit! Felicitaciones por completar todos los niveles. 🏆