Bandit Nivel 28 → 29
Pagina oficial del nivel: https://overthewire.org/wargames/bandit/bandit29.html
Marco: OverTheWire Bandit es un wargame legal y educativo diseñado para aprender Linux y conceptos de seguridad desde cero. No hay sistemas reales comprometidos.
Objetivo
Entrar al servidor como bandit28, clonar un repositorio Git que contiene un archivo README.md, y encontrar la contraseña de bandit29 que estuvo presente en un commit anterior pero fue borrada o censurada en el historial del repositorio.
La clave está en que Git guarda todos los cambios históricos. Aunque alguien elimine información sensible en un commit nuevo, los commits anteriores siguen accesibles.
Qué aprendes
Comandos principales
| Comando | Para qué sirve |
|---|---|
git clone <url> | Descarga un repositorio remoto completo (incluyendo su historial) |
git log | Muestra la lista de commits del repositorio, del más reciente al más antiguo |
git show <hash> | Muestra el contenido completo (diff) de un commit concreto |
git log -p | Muestra el log completo con el diff de cada commit (todo en uno) |
Conceptos clave
- Repositorio Git: carpeta con historial versionado de archivos. Cada cambio queda guardado como un “commit”.
- Commit: una instantánea del estado del proyecto en un momento dado. Tiene un identificador único (hash SHA-1) de 40 caracteres, como
a9b2c3d4.... git log: lista de commits con autor, fecha y mensaje. El hash es lo que usas para consultar un commit específico.git show: dado un hash, muestra exactamente qué líneas se añadieron (+) y qué líneas se eliminaron (-) en ese commit.- Lección de seguridad: nunca subas datos sensibles (contraseñas, tokens, claves API) a un repositorio Git, aunque luego los borres. El historial los conserva para siempre a menos que uses herramientas especializadas de reescritura de historial.
Paso a paso
1. Conectarte al servidor como bandit28
ssh bandit28@bandit.labs.overthewire.org -p 2220Introduce la contraseña de bandit28 (la que obtuviste en el nivel anterior) cuando te la pida.
Verás algo así:
bandit28@bandit:~$
2. Crear un directorio de trabajo temporal
Git necesita clonar el repo en algún lugar. /tmp es el sitio estándar para archivos temporales en estos niveles porque tienes permisos de escritura ahí.
mkdir /tmp/mi_trabajo_28
cd /tmp/mi_trabajo_28Por qué /tmp: tu directorio home (~) en estos servidores suele ser de solo lectura para evitar que los jugadores se molesten entre sí.
3. Clonar el repositorio
git clone ssh://bandit28-git@localhost/home/bandit28-git/repoDesglose del comando:
git clone: descarga el repositorio completo con todo su historial.ssh://bandit28-git@localhost/...: la URL apunta a un servidor Git local en el propio servidor de Bandit. Usa el usuariobandit28-git(distinto debandit28).- Se te pedirá la misma contraseña de
bandit28.
Verás algo así:
Cloning into 'repo'...
bandit28-git@localhost's password:
remote: Enumerating objects: 9, done.
remote: Counting objects: 100% (9/9), done.
remote: Compressing objects: 100% (6/6), done.
remote: Total 9 (delta 2), reused 0 (delta 0), pack-reused 0
Receiving objects: 100% (9/9), done.
Resolving deltas: 100% (2/2), done.
4. Entrar al repositorio clonado
cd repo5. Leer el README actual
cat README.mdVerás algo así:
# Bandit Notes
Some notes for level 29 of bandit.
## credentials
- username: bandit29
- password: xxxxxxxxxx
La contraseña está censurada (xxxxxxxxxx). Alguien la reemplazó intencionalmente. Pero Git guarda el historial…
6. Ver el historial de commits
git logVerás algo así:
commit 674a5618d27bb2060878e79ca20aef81a3827ac (HEAD -> master, origin/master, origin/HEAD)
Author: Morla Porla <morla@overthewire.org>
Date: Thu Apr 18 05:06:12 2024 +0000
fix info leak
commit 186a1038b9a3d76d7d93b2e11516c24a49a7b83
Author: Morla Porla <morla@overthewire.org>
Date: Thu Apr 18 05:06:10 2024 +0000
add missing data
commit 0c0ddb6d0a05ace78a9e8c6a5d58e6c50e38c66
Author: Ben Dover <noone@overthewire.org>
Date: Thu Apr 18 05:06:08 2024 +0000
initial commit of README.md
Fijate en los mensajes de commit:
- El mas reciente dice “fix info leak” — eso es exactamente la accion de censurar la contraseña.
- El anterior dice “add missing data” — probablemente ahí estaba la contraseña real.
7. Inspeccionar el commit que censuro la contraseña
Copia el hash del commit “fix info leak” y usa git show para ver exactamente qué cambio:
git show 674a5618d27bb2060878e79ca20aef81a3827ac(Tu hash será diferente; copia el que aparezca en tu git log.)
Verás algo así:
commit 674a5618d27bb2060878e79ca20aef81a3827ac (HEAD -> master, origin/master, origin/HEAD)
Author: Morla Porla <morla@overthewire.org>
Date: Thu Apr 18 05:06:12 2024 +0000
fix info leak
diff --git a/README.md b/README.md
index b302105..5c6457b 100644
--- a/README.md
+++ b/README.md
@@ -4,5 +4,5 @@ Some notes for level 29 of bandit.
## credentials
- username: bandit29
-- password: <cadena_de_~32_caracteres>
+- password: xxxxxxxxxx
La linea que empieza con - (en rojo en terminales con color) es lo que se elimino — ahi esta la contraseña real: <cadena_de_~32_caracteres>.
La linea con + es lo que se añadio en su lugar: la censura xxxxxxxxxx.
La cadena que ves en lugar de
<cadena_de_~32_caracteres>es la contraseña real debandit29. Copiala.
8. Alternativa: ver todo el historial con diffs de golpe
Si prefieres no copiar hashes, puedes ver todos los commits con sus cambios de una vez:
git log -pEsto muestra cada commit seguido de su diff completo. Busca visualmente las lineas con - que contengan algo parecido a una contraseña.
Por qué funciona
Git esta disenado para nunca perder informacion por defecto. Cada commit es una instantanea inmutable del estado del proyecto en ese momento. Cuando alguien hace git commit con la contraseña visible y luego hace otro commit que la elimina, el primer commit sigue existiendo en el historial.
git show <hash> recupera ese snapshot antiguo y muestra el diff respecto al commit anterior. Las lineas prefijadas con - son las que existian antes y fueron eliminadas — exactamente lo que buscamos.
Esto tiene implicaciones de seguridad reales:
- Proyectos publicos en GitHub con tokens API filtrados en commits antiguos han sido explotados incluso meses despues de que el desarrollador “arreglara” el codigo.
- La unica forma de eliminar datos de verdad del historial Git es reescribir el historial con herramientas como
git filter-repo— y aun asi, si alguien ya clono el repo antes, tiene la informacion.
Errores comunes
”fatal: destination path ‘repo’ already exists”
Ya existe la carpeta del clon anterior. Borrala o usa otro directorio:
rm -rf repo
git clone ssh://bandit28-git@localhost/home/bandit28-git/repo“Permission denied” al clonar
Asegurate de estar usando el usuario correcto en la URL (bandit28-git, no bandit28) y de introducir la contraseña de bandit28 cuando te la pida.
No encuentro la contraseña en git log -p
La salida de git log -p puede ser muy larga. Usa / para buscar dentro del paginador (less):
git log -p
# dentro del paginador, escribe:
/password
# y pulsa Enter para saltar a la siguiente ocurrenciaPulsa q para salir del paginador.
Terminal Kitty:
git log/git showabren el paginadorlessen el servidor. Si vesError opening terminal: xterm-kitty, usaexport TERM=xterm, o evita el paginador congit --no-pager log -p(ogit config --global core.pager cat). Aplica a todos los niveles git (28→32).
El hash que escribo no funciona
No hace falta escribir el hash completo. Los primeros 7-8 caracteres suelen ser suficientes:
git show 674a5618Pasar al siguiente nivel
Con la contraseña obtenida del historial de Git, conéctate a bandit29:
ssh bandit29@bandit.labs.overthewire.org -p 2220Introduce <cadena_de_~32_caracteres> (la contraseña real que encontraste en el diff) cuando te la pida.
Conexiones
- 00_README — indice general del wargame y como empezar
- MOC_Ciberseguridad — mapa de contenido de ciberseguridad
- git-en-detalle — conceptos de Git: commits, ramas, historial, reescritura de historial