Bandit Nivel 31 a 32

Página oficial: https://overthewire.org/wargames/bandit/bandit32.html

Este nivel enseña una de las operaciones más habituales con Git: hacer push de un commit a un repositorio remoto. Con una vuelta de tuerca: el repositorio tiene un .gitignore que bloquea justamente el archivo que necesitas subir, así que aprenderás a forzar el staging para ignorar esa regla.


Objetivo

Dentro del home de bandit31 encontrarás un repositorio Git clonado. El README de ese repo te pide que subas un archivo llamado key.txt con el contenido exacto May I come in? a la rama master. Cuando el servidor remoto reciba tu push, te responderá con la contraseña de bandit32.


Qué aprendes

Comando / ConceptoPara qué sirve
cat README.mdLeer las instrucciones del nivel
cat .gitignoreVer qué patrones están excluidos del tracking
echo 'texto' > archivoCrear un archivo con contenido específico
git add -f archivoForzar el staging de un archivo ignorado por .gitignore
git commit -m 'mensaje'Crear un snapshot (punto de guardado) con tus cambios
git push origin masterEnviar tus commits al repositorio remoto
.gitignoreArchivo de configuración que le dice a Git qué ignorar

Concepto clave: ¿qué es .gitignore?

.gitignore es un archivo de texto donde cada línea define un patrón de archivos que Git debe ignorar: no los rastrea, no los incluye en commits, no los muestra en git status. Es muy común en proyectos reales para excluir binarios compilados, secretos (.env), logs, etc.

En este nivel el patrón *.txt ignora todos los archivos con extensión .txt, incluido el key.txt que necesitas subir.

Concepto clave: git add -f

La flag -f (o --force) le dice a Git “añade este archivo al staging aunque esté en .gitignore”. Sin esa flag, Git simplemente lo ignora y el archivo nunca llega al commit ni al push.


Paso a paso

1. Conectarte al nivel

ssh [email protected] -p 2220

Usa la contraseña que obtuviste en el nivel anterior.

2. Ver qué hay en el home

ls -la

Verás algo como:

total 20
drwxr-xr-x  3 bandit31 bandit31 4096 ...
drwxr-xr-x 49 root     root     4096 ...
drwxr-xr-x  8 bandit31 bandit31 4096 ...  repo

Hay una carpeta repo/. Es el repositorio Git clonado.

3. Entrar al repositorio y leer las instrucciones

cd repo
cat README.md

El servidor te mostrará algo como:

This time your task is to push a file to the remote repository.

Details:
    File name: key.txt
    Content: 'May I come in?'
    Branch: master

4. Investigar el .gitignore

cat .gitignore

Salida:

*.txt

Ahí está el problema. Git ignorará cualquier archivo .txt, incluido key.txt. Si intentas añadirlo sin -f, Git lo descartará en silencio.

5. Crear el archivo key.txt

echo 'May I come in?' > key.txt

Verifica que se creó con el contenido correcto:

cat key.txt

Salida esperada:

May I come in?

6. Intentar git status (para entender el problema)

git status

Salida:

On branch master
Your branch is up to date with 'origin/master'.

nothing to commit, working tree clean

Git ni siquiera ve el archivo porque está en .gitignore. Aquí es donde entra -f.

7. Forzar el staging del archivo ignorado

git add -f key.txt

No hay salida en pantalla, pero ahora el archivo está en el área de staging. Compruébalo:

git status

Salida:

On branch master
Your branch is up to date with 'origin/master'.

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        new file:   key.txt

Ahora Git sí lo ve y lo tiene listo para commitear.

8. Crear el commit

git commit -m "Añadir key.txt para obtener la contraseña"

Salida esperada:

[master xxxxxxx] Añadir key.txt para obtener la contraseña
 1 file changed, 1 insertion(+)
 create mode 100644 key.txt

El hash xxxxxxx será diferente en tu caso; es el identificador único del commit.

9. Hacer push al remoto

git push origin master

Salida esperada (presta atención a la última línea):

Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Delta compression using up to 2 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 319 bytes | 319.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
remote: ### Attempting to validate files... ####
remote:
remote: .oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.
remote:
remote: Well done! Here is the password for the next level:
remote: <cadena_de_~32_caracteres>
remote:
remote: .oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.
To ssh://localhost/home/bandit31-git/repo
   xxxxxxx..yyyyyyy  master -> master

La cadena que aparece en la línea remote: tras “Here is the password for the next level:” es la contraseña de bandit32. Copiala.


Por qué funciona

El flujo completo de Git que ejecutaste es:

Working directory  →  (git add -f)  →  Staging area  →  (git commit)  →  Local repo  →  (git push)  →  Remote repo
  1. git add -f: mueve el archivo del directorio de trabajo al área de staging, ignorando las reglas del .gitignore. Sin -f, el archivo nunca entraría al flujo.
  2. git commit: toma una foto del staging y la guarda en la historia local del repositorio. A partir de aquí el cambio existe de forma permanente en tu copia local.
  3. git push origin master: envía todos los commits locales que el remoto no tiene todavía. El servidor (origin) recibe el commit, verifica el contenido del archivo y, al comprobar que es correcto, imprime la contraseña en la salida del push.

El servidor está configurado con un hook de Git (concretamente un post-receive hook): un script que se ejecuta automáticamente cada vez que recibe un push. Ese script es el que valida tu archivo y escribe la contraseña en pantalla.


Errores comunes

”nothing to commit” después de crear key.txt

Has olvidado la flag -f. El .gitignore con el patrón *.txt bloquea el archivo. Solución:

git add -f key.txt

El push falla con “rejected”

Puede ocurrir si el remoto tiene commits que tu copia local no tiene. En este nivel no debería pasar, pero si ocurre:

git pull origin master --rebase
git push origin master

El contenido de key.txt no es exactamente May I come in?

El servidor valida el contenido de forma exacta (incluyendo mayúsculas, signos de puntuación y sin espacios extra). Comprueba:

cat key.txt

Debe mostrar exactamente:

May I come in?

Si usaste comillas dobles en lugar de simples con echo, en algunos shells puede haber diferencias. Usa siempre comillas simples para este caso:

echo 'May I come in?' > key.txt

No encuentras el directorio repo/

Asegúrate de que estás en el home de bandit31. Ejecuta cd ~ y luego ls.


Pasar al siguiente nivel

Con la contraseña obtenida del push, conéctate a bandit32:

ssh [email protected] -p 2220

Introduce como contraseña la cadena <cadena_de_~32_caracteres> que el servidor mostró en la salida del push.


Conexiones