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 / Concepto | Para que sirve |
|---|---|
cron / /etc/cron.d/ | Sistema de tareas programadas en Linux |
cat | Leer contenido de un archivo |
md5sum | Calcular el hash MD5 de una cadena o archivo |
cut -d ' ' -f 1 | Recortar la salida: quedarse solo con el primer campo separado por espacio |
$(...) — sustitucion de comandos | Ejecutar un comando dentro de otro y usar su salida como texto |
| Scripts de shell | Leer 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, bandit22cron: 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 2220Introduce la contrasena que obtuviste en el nivel anterior cuando te la pida.
2. Leer el cron job de bandit23
cat /etc/cron.d/cronjob_bandit23Lo 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/nulldescarta toda la salida (errores y mensajes) para que no molesten.
3. Leer el script que ejecuta el cron
cat /usr/bin/cronjob_bandit23.shLo 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/$mytargetAnalisis linea a linea:
| Linea | Que 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/$mytarget | Copia 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 1Lo 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 amd5sum, que devuelve algo como8ca319486bfbbc3663ea0fbe81326349 -(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 1Si 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 anidadasEn 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 2220Introduce <cadena_de_~32_caracteres> (la que copiaste del cat /tmp/<hash>) cuando te pida la contrasena.
Conexiones
- 00_README
- MOC_Ciberseguridad
- git-en-detalle (no aplica a este nivel)
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