Bandit: nivel 27 → 28
Cómo resolver el nivel 27 → 28 de OverTheWire Bandit clonando un repositorio Git por SSH desde tu máquina local, con el porqué de no clonar desde el propio servidor.
Empieza el bloque de Git. A partir de aquí varios niveles van de lo mismo: clonar un repositorio y buscar secretos en él. Este primero es el más sencillo (la contraseña está a la vista en el README), pero tiene una trampa de conexión que atasca a mucha gente, así que vamos a entenderla bien.
Las contraseñas de los niveles aparecen como [REDACTED]. Siguiendo las normas de OverTheWire, no publico credenciales: la gracia es que llegues a ellas tú.
El enunciado
El enunciado del nivel dice que hay un repositorio Git en ssh://bandit27-git@localhost/home/bandit27-git/repo, y que hay que clonarlo para encontrar la contraseña del siguiente nivel. La credencial de bandit27-git es la contraseña de bandit27.
La trampa: desde dónde se clona
Lo primero que intuitivamente hace todo el mundo es conectarse por SSH a Bandit como bandit27 y clonar ahí. No funciona, y el error lo explica solito:
1
2
3
!!! You are trying to log into this SSH server from localhost.
!!! Connecting from/to localhost is blocked to conserve resources.
!!! Please log out and log in again, directly from your client machine.
¿Por qué? Cuando estás dentro del servidor de Bandit, el host bandit.labs.overthewire.org (o localhost) resuelve a 127.0.0.1, es decir, a la propia máquina. OverTheWire bloquea las conexiones de localhost a sí mismo para no malgastar recursos. Clonar el repo abre una conexión SSH nueva (git usa SSH por debajo), y esa conexión sería localhost → localhost: bloqueada.
La solución es clonar desde tu propia máquina, no desde la sesión de Bandit. Desde tu equipo, bandit.labs.overthewire.org es un host remoto normal y la conexión se permite.
El prompt es tu mejor pista: si pone
bandit27@bandit:~$, estás dentro del servidor y vas a chocar con el bloqueo. Si pone el nombre de tu usuario y tu máquina, estás donde tienes que estar. Hazexithasta volver a tu terminal local.
La solución
En mi máquina, creo un directorio temporal y clono con la URL completa, incluyendo el puerto 2220:
1
2
3
$ cd $(mktemp -d)
$ git clone ssh://bandit27-git@bandit.labs.overthewire.org:2220/home/bandit27-git/repo
Cloning into 'repo'...
Me pide la contraseña de bandit27-git (la de bandit27), la pongo y clona. Dentro hay un README:
1
2
3
4
5
$ cd repo
$ ls
README
$ cat README
The password to the next level is [REDACTED]
La contraseña está en texto plano. Como siempre, para sacar solo la contraseña sin el texto de alrededor:
1
2
$ cat README | awk '{print $NF}'
[REDACTED]
awk '{print $NF}' imprime el último campo de la línea ($NF = number of fields), es decir, la última palabra, que es justo la contraseña.
Detalle importante: el puerto en la URL de Git
Un tropiezo clásico: en una URL ssh:// el puerto va pegado al host con dos puntos (host:2220), no con -p como en el comando ssh. Si omites el puerto, git usa el 22 por defecto y el servidor de Bandit te rechaza (solo escucha el juego en el 2220).
Existe la forma “corta” tipo scp (usuario@host:ruta), pero esa no admite puerto. Por eso aquí usamos obligatoriamente la forma larga ssh://...:2220/....
Otras formas de hacerlo
1. Pasarle el puerto a git por la variable de entorno
Si prefieres la sintaxis corta, puedes indicarle el puerto a SSH con GIT_SSH_COMMAND:
1
$ GIT_SSH_COMMAND='ssh -p 2220' git clone bandit27-git@bandit.labs.overthewire.org:/home/bandit27-git/repo
Aquí el -p 2220 se lo pasas tú al ssh que git usa por debajo, así que ya puedes usar la forma corta.
2. Dejarlo fijo en tu ~/.ssh/config
Si vas a tocar mucho Bandit, define el host una vez:
1
2
3
4
Host bandit-git
HostName bandit.labs.overthewire.org
Port 2220
User bandit27-git
Y clonas sin repetir puerto ni usuario:
1
$ git clone ssh://bandit-git/home/bandit27-git/repo
Por qué esto importa en seguridad
Este nivel es trivial a propósito: el secreto está en el README. Pero el mensaje de fondo es enorme: los repositorios Git son una mina de credenciales. Contraseñas, tokens de API, claves privadas… acaban commiteados por error constantemente. Y aquí está la parte interesante que explotaremos en los próximos niveles: aunque borres un secreto en un commit posterior, sigue vivo en el historial (git log, git diff, ramas, stash…). Clonar un repo te da todo ese historial, no solo la versión actual.
Por eso, en un pentest, cuando encuentras un repositorio (o un
.gitexpuesto en una web), lo primero es revisar el historial completo, no solo los ficheros actuales. Herramientas comogitleaksotrufflehogautomatizan justo esa búsqueda de secretos en el historial.
Pasar al nivel siguiente
1
$ sshpass -p '[REDACTED]' ssh bandit28@bandit.labs.overthewire.org -p 2220
El siguiente nivel sigue con Git, pero ya sube el nivel: la contraseña actual está “censurada” en el README, y tendrás que bucear en el historial de commits para encontrar la versión en la que aún estaba visible.
Resumen
| Comando / concepto | Para qué sirve |
|---|---|
git clone ssh://user@host:2220/ruta | Clonar un repo por SSH indicando el puerto |
| Bloqueo de localhost | OverTheWire rechaza conexiones localhost → localhost |
cd $(mktemp -d) | Trabajar en un directorio temporal escribible |
awk '{print $NF}' | Imprimir la última palabra de una línea |
GIT_SSH_COMMAND='ssh -p 2220' | Pasarle el puerto a git con la sintaxis corta |
~/.ssh/config | Guardar host, puerto y usuario para no repetirlos |
| Historial de Git | Guarda versiones antiguas: los secretos borrados siguen ahí |