Bandit Nivel 22 a 23

Pagina oficial: https://overthewire.org/wargames/bandit/bandit23.html

Este es un nivel del wargame Bandit de OverTheWire, un juego legal y educativo para aprender terminal Linux y conceptos de seguridad. No hay nada ilegal aqui: el objetivo es leer la contrasena de tu propio nivel siguiente, contenida en un archivo al que solo puedes acceder indirectamente.


Objetivo

Otro trabajo programado (cron job) ejecuta un script automaticamente. Ese script calcula un nombre de archivo usando el hash MD5 de una cadena que incluye el nombre de usuario bandit23, y escribe la contrasena de bandit23 en /tmp/<ese_hash>.

Tu trabajo: entender el script, reproducir el calculo del hash desde tu sesion como bandit22, y leer el archivo resultante en /tmp/.


Que aprendes

Herramienta / ConceptoPara que sirve
cron / /etc/cron.d/Sistema de tareas programadas en Linux
catLeer contenido de un archivo
md5sumCalcular el hash MD5 de una cadena o archivo
cut -d ' ' -f 1Recortar la salida: quedarse solo con el primer campo separado por espacio
$(...) — sustitucion de comandosEjecutar un comando dentro de otro y usar su salida como texto
Scripts de shellLeer y entender un script .sh escrito por otro

Conceptos clave explicados

Hash MD5: una funcion matematica que convierte cualquier texto en una cadena de 32 caracteres hexadecimales. La misma entrada siempre produce la misma salida. No es encriptacion (no hay clave), es una huella digital del texto.

"I am user bandit23"  →  md5sum  →  8ca319486bfbbc3663ea0fbe81326349  (ejemplo)

Sustitucion de comandos $(...): permite usar la salida de un comando como argumento o valor dentro de otro comando o variable. Ejemplo:

nombre=$(whoami)
echo "Hola, $nombre"
# Resultado: Hola, bandit22

cron: demonio (proceso en segundo plano) de Linux que ejecuta comandos o scripts segun un horario definido. Los trabajos del sistema se guardan en /etc/cron.d/.


Paso a paso

1. Conectarte como bandit22

ssh [email protected] -p 2220

Introduce la contrasena que obtuviste en el nivel anterior cuando te la pida.

2. Leer el cron job de bandit23

cat /etc/cron.d/cronjob_bandit23

Lo que veras:

@reboot bandit23 /usr/bin/cronjob_bandit23.sh  &> /dev/null
* * * * * bandit23 /usr/bin/cronjob_bandit23.sh  &> /dev/null

Interpretacion:

  • * * * * * significa “cada minuto, siempre”.
  • El usuario que ejecuta el script es bandit23.
  • El script es /usr/bin/cronjob_bandit23.sh.
  • &> /dev/null descarta toda la salida (errores y mensajes) para que no molesten.

3. Leer el script que ejecuta el cron

cat /usr/bin/cronjob_bandit23.sh

Lo que veras:

#!/bin/bash
 
myname=$(whoami)
mytarget=$(echo I am user $myname | md5sum | cut -d ' ' -f 1)
 
echo "Copying passwordfile /etc/bandit_pass/$myname to /tmp/$mytarget"
 
cat /etc/bandit_pass/$myname > /tmp/$mytarget

Analisis linea a linea:

LineaQue hace
myname=$(whoami)Guarda el nombre del usuario actual en $myname. Cuando corre el cron, es bandit23.
mytarget=$(echo I am user $myname | md5sum | cut -d ' ' -f 1)Calcula el hash MD5 de la frase “I am user bandit23” y se queda solo con el hash (sin el - ni el espacio que imprime md5sum).
cat /etc/bandit_pass/$myname > /tmp/$mytargetCopia la contrasena de bandit23 al archivo /tmp/<hash>.

4. Reproducir el calculo del nombre de archivo

El script usa $myname que cuando lo corre el cron vale bandit23. Tu debes ejecutar la misma formula pero con bandit23 escrito literalmente, porque tu sesion actual es bandit22:

echo I am user bandit23 | md5sum | cut -d ' ' -f 1

Lo que veras (el hash real variara; este es un ejemplo ilustrativo):

8ca319486bfbbc3663ea0fbe81326349

Ese valor de 32 caracteres es el nombre del archivo en /tmp/.

Desglose del comando:

  • echo I am user bandit23 — imprime la frase exacta (sin comillas en la salida).
  • | md5sum — pasa la frase a md5sum, que devuelve algo como 8ca319486bfbbc3663ea0fbe81326349 - (hash + espacio + guion).
  • | cut -d ' ' -f 1 — divide por espacios (-d ' ') y se queda con el campo 1 (-f 1), es decir, solo el hash.

5. Leer la contrasena del archivo en /tmp/

Sustituye <hash_obtenido> por el valor que obtuviste en el paso anterior:

cat /tmp/<hash_obtenido>

Lo que veras:

<cadena_de_~32_caracteres>

Esa cadena es la contrasena de bandit23. Copiala para el siguiente nivel.


Por que funciona

El script del cron corre con identidad bandit23, por lo que whoami devuelve bandit23 y puede leer /etc/bandit_pass/bandit23 (archivo que tu como bandit22 no puedes leer directamente). El script escribe esa contrasena en /tmp/ con permisos de lectura para todos.

El nombre del archivo en /tmp/ es determinista: siempre es el MD5 de "I am user bandit23\n" (con el salto de linea que agrega echo). Cualquier usuario del sistema puede calcular ese nombre y leer el archivo, que es exactamente lo que haces.

No necesitas esperar: el cron ya corrio (lo hace cada minuto), el archivo ya existe en /tmp/. Solo necesitas calcular su nombre.


Errores comunes

Error: el archivo no existe todavia

Si acabas de conectarte y el cron no ha corrido en este ciclo, espera hasta 1 minuto y reintenta el cat /tmp/<hash>.

Error: usas whoami en lugar de escribir bandit23 literalmente

# INCORRECTO — whoami devuelve bandit22 (tu sesion actual)
echo I am user $(whoami) | md5sum | cut -d ' ' -f 1
 
# CORRECTO — escribes bandit23 a mano
echo I am user bandit23 | md5sum | cut -d ' ' -f 1

Si usas whoami, calculas el MD5 de "I am user bandit22", que apunta a un archivo diferente (con la pass de bandit22, que ya tienes).

Error: comillas que cambian el texto

# INCORRECTO — las comillas dobles funcionan pero observa diferencias sutiles
echo "I am user bandit23"   # produce: I am user bandit23\n  — igual, OK
 
# PROBLEMATICO si usas comillas simples mal anidadas

En este caso concreto las comillas dobles no cambian nada, pero ten cuidado en general.

Error: cut con delimitador equivocado

md5sum imprime <hash> - (dos espacios antes del guion). -d ' ' separa por espacio simple, lo que deja el hash limpio en el campo 1. Si cambias el delimitador, el resultado cambia.


Pasar al siguiente nivel

Con la contrasena obtenida, conéctate como bandit23:

ssh [email protected] -p 2220

Introduce <cadena_de_~32_caracteres> (la que copiaste del cat /tmp/<hash>) cuando te pida la contrasena.


Conexiones

Niveles adyacentes

  • Nivel anterior: 22-nivel-21-a-22 — cron basico, archivo con pass en /tmp fijo
  • Nivel siguiente: 24-nivel-23-a-24 — cron que ejecuta scripts escritos por ti en un directorio temporal