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 / ConceptoPara qué sirve aquí
cron / crontabEjecutar tareas automáticas en intervalos de tiempo
Script bashArchivo de texto con comandos que el shell ejecuta en secuencia
chmodCambiar permisos de archivos y directorios
/tmp/Directorio temporal disponible para todos los usuarios
mkdirCrear directorios
cpCopiar archivos
catLeer el contenido de un archivo
sleep / espera activaDar 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 2220

1 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_bandit24

Lo 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.sh

Verá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
done

Lo 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_b24

chmod 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.sh

Terminal Kitty: este nano corre en el servidor. Si te sale Error opening terminal: xterm-kitty, ejecuta antes export 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.txt

Explicació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.sh

6. Copiar el script al directorio vigilado por el cron

cp /tmp/midir_b24/myscript.sh /var/spool/bandit24/foo/myscript.sh

A 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.txt

Verás algo como:

<cadena_de_~32_caracteres>

Esa cadena es la contraseña de bandit24. Copiala.


Por qué funciona

El flujo completo es:

  1. El cron job corre cada minuto con los privilegios de bandit24.
  2. Entra en /var/spool/bandit24/foo/ y busca scripts propiedad de bandit23.
  3. Encuentra tu script, lo ejecuta (aún como bandit24).
  4. Tu script le pide a bandit24 que lea /etc/bandit_pass/bandit24 — archivo que bandit24 sí puede leer.
  5. El resultado se copia a /tmp/midir_b24/pass.txt, donde tú (bandit23) lo puedes leer porque pusiste chmod 777 en el directorio y chmod 644 en 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

ErrorCausa probableSolución
pass.txt no aparece nuncaEl script no era ejecutableRepite desde el paso 5 asegurándote de hacer chmod +x antes de copiar al spool
Permission denied al leer pass.txtEl directorio /tmp/midir_b24/ no tiene permisos abiertosCrea de nuevo con chmod 777 en el directorio
El script fue borrado pero no aparece pass.txtEl 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 copiarTecleaste mal la ruta del script o del directorio de destinoRevisa las rutas con ls antes de copiar
Esperas y nada pasaTe 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 2220

Introduce <cadena_de_~32_caracteres> (la que copiaste de pass.txt) cuando te lo pida.


Conexiones