Bandit Nivel 23 a 24
Nivel del wargame OverTheWire Bandit — juego legal y educativo para aprender terminal Linux y conceptos de seguridad.
Objetivo
Encontrar la contraseña de bandit24, que solo puede leerla el propio usuario bandit24. La clave del nivel: existe un proceso automático (un cron job) que ejecuta como bandit24 cualquier script que aparezca en /var/spool/bandit24/foo/. Si depositas un script ahí que copie la contraseña a un lugar accesible para ti, el cron lo hará por ti.
Qué aprendes
| Herramienta / Concepto | Para qué sirve aquí |
|---|---|
cron / crontab | Ejecutar tareas automáticas en intervalos de tiempo |
| Script bash | Archivo de texto con comandos que el shell ejecuta en secuencia |
chmod | Cambiar permisos de archivos y directorios |
/tmp/ | Directorio temporal disponible para todos los usuarios |
mkdir | Crear directorios |
cp | Copiar archivos |
cat | Leer el contenido de un archivo |
sleep / espera activa | Dar tiempo al cron para que se dispare |
Conceptos clave antes de empezar
¿Qué es un cron job?
cron es el planificador de tareas de Linux. Permite decir “ejecuta este comando cada minuto”, “cada hora”, “cada lunes”… Lo que se programa se llama cron job. En este nivel, alguien (los admins del juego) ya ha configurado un cron job que dice: “Cada minuto, ejecuta todos los scripts de /var/spool/bandit24/foo/ usando la identidad de bandit24, y luego bórralos”.
¿Por qué importan los permisos aquí?
bandit24 ejecuta tu script, pero el resultado (el archivo donde copias la contraseña) tiene que ser escribible por bandit24 y legible por bandit23 (tú). Por eso usarás chmod 777 en el directorio de destino.
Paso a paso
1. Conectarse al nivel 23
ssh bandit23@bandit.labs.overthewire.org -p 22201 Introduce la contraseña que obtuviste en el nivel anterior cuando te la pida.
2. Inspeccionar el cron job (para entender qué ocurre)
cat /etc/cron.d/cronjob_bandit24Lo que verás (aproximadamente):
@reboot bandit24 /usr/bin/cronjob_bandit24.sh &> /dev/null
* * * * * bandit24 /usr/bin/cronjob_bandit24.sh &> /dev/null
Eso significa: “Cada minuto (* * * * *), ejecuta el script /usr/bin/cronjob_bandit24.sh con la identidad de bandit24”. Inspecciona el script:
cat /usr/bin/cronjob_bandit24.shVerás algo como:
#!/bin/bash
myname=$(whoami)
cd /var/spool/$myname/foo
echo "Executing and deleting all scripts in /var/spool/$myname/foo:"
for i in * .*;
do
if [ "$i" != "." -a "$i" != ".." ];
then
echo "Handling $i"
owner="$(stat --format "%U" ./$i)"
if [ "${owner}" = "bandit23" ]; then
timeout -s 9 60 ./$i
fi
rm -f ./$i
fi
doneLo importante: el cron entra en /var/spool/bandit24/foo/, ejecuta cada archivo que sea propiedad de bandit23 (es decir, tuyo), y luego lo borra. Ejecuta el script como bandit24, así que puede leer /etc/bandit_pass/bandit24.
3. Crear un directorio de trabajo en /tmp
Usas /tmp/ porque todos los usuarios pueden escribir ahí. El nombre del directorio es arbitrario; ponle uno único para evitar colisiones con otros jugadores.
mkdir /tmp/midir_b24
chmod 777 /tmp/midir_b24chmod 777 significa: el propietario, el grupo, y cualquier otro usuario pueden leer, escribir y ejecutar dentro de ese directorio. Esto es necesario porque quien finalmente escribirá ahí será bandit24, no tú.
4. Escribir el script que copiará la contraseña
nano /tmp/midir_b24/myscript.shTerminal Kitty: este
nanocorre en el servidor. Si te saleError opening terminal: xterm-kitty, ejecuta antesexport TERM=xterm(o prefija:TERM=xterm nano /tmp/midir_b24/myscript.sh). Alternativa sin editor: crear el script con un heredoc (cat > /tmp/midir_b24/myscript.sh <<'EOF' … EOF).
Escribe el siguiente contenido:
#!/bin/bash
cp /etc/bandit_pass/bandit24 /tmp/midir_b24/pass.txt
chmod 644 /tmp/midir_b24/pass.txtExplicación línea a línea:
#!/bin/bash— indica que este archivo es un script de bash (shebang).cp /etc/bandit_pass/bandit24 /tmp/midir_b24/pass.txt— copia la contraseña (que solo bandit24 puede leer) a tu directorio temporal.chmod 644 /tmp/midir_b24/pass.txt— hace el archivo legible por todos, no solo por bandit24.
Guarda con Ctrl+O, Enter, Ctrl+X.
5. Dar permisos de ejecución al script
Sin este paso, el cron no podrá ejecutar el script (sería como intentar correr un documento de texto).
chmod +x /tmp/midir_b24/myscript.sh6. Copiar el script al directorio vigilado por el cron
cp /tmp/midir_b24/myscript.sh /var/spool/bandit24/foo/myscript.shA partir de este momento, el cron ejecutará el script en el próximo ciclo de un minuto.
7. Esperar ~1 minuto y recoger la contraseña
ls /tmp/midir_b24/Mientras no veas pass.txt, el cron todavía no ha pasado. Espera y repite. Cuando aparezca:
cat /tmp/midir_b24/pass.txtVerás algo como:
<cadena_de_~32_caracteres>
Esa cadena es la contraseña de bandit24. Copiala.
Por qué funciona
El flujo completo es:
- El cron job corre cada minuto con los privilegios de bandit24.
- Entra en
/var/spool/bandit24/foo/y busca scripts propiedad de bandit23. - Encuentra tu script, lo ejecuta (aún como bandit24).
- Tu script le pide a bandit24 que lea
/etc/bandit_pass/bandit24— archivo que bandit24 sí puede leer. - El resultado se copia a
/tmp/midir_b24/pass.txt, donde tú (bandit23) lo puedes leer porque pusistechmod 777en el directorio ychmod 644en el archivo.
Es un ejemplo clásico de privilege escalation via cron: alguien que corre como root (o un usuario más privilegiado) ejecuta código que tú controlas.
Errores comunes
| Error | Causa probable | Solución |
|---|---|---|
pass.txt no aparece nunca | El script no era ejecutable | Repite desde el paso 5 asegurándote de hacer chmod +x antes de copiar al spool |
Permission denied al leer pass.txt | El directorio /tmp/midir_b24/ no tiene permisos abiertos | Crea de nuevo con chmod 777 en el directorio |
El script fue borrado pero no aparece pass.txt | El cron lo ejecutó pero hubo un error interno (p.ej. typo en el script) | Reescribe el script, vuelve a copiarlo y espera |
No such file or directory al copiar | Tecleaste mal la ruta del script o del directorio de destino | Revisa las rutas con ls antes de copiar |
| Esperas y nada pasa | Te fijaste en el reloj del servidor, no en el tuyo (el cron del servidor tiene su propio reloj) | Espera al menos 2 minutos por si acaso |
Nota sobre el nombre del script
El cron borra todos los scripts después de ejecutarlos. Si quieres repetir el intento, crea el script de nuevo y vuelve a copiarlo al directorio spool.
Pasar al siguiente nivel
Con la contraseña obtenida en pass.txt, conéctate como bandit24:
ssh bandit24@bandit.labs.overthewire.org -p 2220Introduce <cadena_de_~32_caracteres> (la que copiaste de pass.txt) cuando te lo pida.
Conexiones
- 00_README — índice general del wargame
- MOC_Ciberseguridad — mapa de contenido de ciberseguridad