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

ComandoPara qué sirve
git clone <url>Descarga un repositorio remoto completo (incluyendo su historial)
git logMuestra 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 -pMuestra 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 2220

Introduce 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_28

Por 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/repo

Desglose 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 usuario bandit28-git (distinto de bandit28).
  • 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 repo

5. Leer el README actual

cat README.md

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

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 de bandit29. 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 -p

Esto 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 ocurrencia

Pulsa q para salir del paginador.

Terminal Kitty: git log/git show abren el paginador less en el servidor. Si ves Error opening terminal: xterm-kitty, usa export TERM=xterm, o evita el paginador con git --no-pager log -p (o git 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 674a5618

Pasar al siguiente nivel

Con la contraseña obtenida del historial de Git, conéctate a bandit29:

ssh bandit29@bandit.labs.overthewire.org -p 2220

Introduce <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