Bandit: nivel 29 → 30
Cómo resolver el nivel 29 → 30 de OverTheWire Bandit buscando la contraseña en una rama distinta del repositorio Git con git branch y git checkout.
Seguimos con Git, y ahora entran las ramas. En el nivel anterior el secreto estaba en el historial de la rama principal; aquí la rama master no lo tiene, pero el propio README nos da una pista enorme de dónde mirar. La lección: un repo no es solo lo que ves en la rama por defecto.
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ú.
Clonar el repo (desde tu máquina)
Como en los niveles anteriores, el clone se hace desde tu máquina local. La credencial de bandit29-git es la contraseña de bandit29.
1
2
3
4
$ cd $(mktemp -d)
$ git clone ssh://bandit29-git@bandit.labs.overthewire.org:2220/home/bandit29-git/repo
$ cd repo
$ cat README.md
1
2
3
4
5
6
7
# Bandit Notes
Some notes for bandit30 of bandit.
## credentials
- username: bandit30
- password: <no passwords in production!>
La pista: “no passwords in production!”
Donde debería estar la contraseña pone <no passwords in production!>. No es un fallo: es la pista. Nos está diciendo que en producción (la rama master, la de por defecto) no hay contraseña. Y si existe una rama de “producción”, lo normal es que existan otras: desarrollo, pruebas… Ahí es donde seguramente se les ha colado el secreto.
Buscar en las ramas
git branch -a lista todas las ramas, incluidas las remotas (-a = all):
1
2
3
4
5
6
$ git branch -a
* master
remotes/origin/HEAD -> origin/master
remotes/origin/dev
remotes/origin/master
remotes/origin/sploits-dev
Además de master, hay dos ramas interesantes: dev (desarrollo) y sploits-dev. La de desarrollo es la candidata obvia: es justo donde la gente mete datos de prueba (contraseñas reales incluidas) sin el cuidado que ponen en producción.
La solución: cambiar a la rama dev
git checkout <rama> cambia a esa rama, dejando el directorio de trabajo con su contenido:
1
2
3
$ git checkout dev
$ ls
code README.md
Aquí el README es distinto al de master. Lo leo:
1
$ cat README.md
1
2
3
4
5
6
7
# Bandit Notes
Some notes for bandit30 of bandit.
## credentials
- username: bandit30
- password: [REDACTED]
Esta vez la contraseña está en claro. Como siempre, afino para sacar solo la contraseña:
1
2
$ cat README.md | tail -n 2 | cut -d ':' -f 2
[REDACTED]
Desglose: tail -n 2 se queda con las dos últimas líneas, y cut -d ':' -f 2 corta por los dos puntos (-d ':') y se queda con el segundo campo (-f 2), es decir, lo que va después de password:. Te queda con un espacio delante, pero la contraseña es correcta.
cut -d ':' -f 2es la herramienta ideal cuando el dato va después de una etiqueta tipoclave: valor. En este blog ya hemos usadoawk '{print $NF}'para lo mismo; cualquiera de las dos vale, es cuestión de con cuál te sientas más cómodo.
Por qué esto importa en seguridad
La idea de fondo conecta con el nivel anterior: un repositorio Git es mucho más que su rama principal. Los secretos se cuelan sobre todo en las ramas de desarrollo, donde se trabaja con datos de prueba y menos disciplina. Al auditar un repo nunca te quedes solo en master/main:
git branch -apara ver todas las ramas (locales y remotas).- Revisa cada una, sobre todo las de desarrollo/pruebas (
dev,staging,test…). - Y no olvides lo del nivel anterior: el historial de cada rama, no solo su estado actual.
Por eso herramientas como
gitleaksotrufflehogescanean todo: todas las ramas y todo el historial de cada una. Una credencial puede estar enterrada en un commit viejo de una rama que nadie mira.
Pasar al nivel siguiente
1
$ sshpass -p '[REDACTED]' ssh bandit30@bandit.labs.overthewire.org -p 2220
El siguiente nivel cierra la parte de rarezas de Git con una función menos conocida: las tags (etiquetas), otro sitio donde se puede esconder información en un repositorio.
Resumen
| Comando / concepto | Para qué sirve |
|---|---|
git branch -a | Listar todas las ramas, locales y remotas |
git checkout <rama> | Cambiar a otra rama del repositorio |
Rama dev / master | Desarrollo vs producción: el secreto suele estar en desarrollo |
cut -d ':' -f 2 | Quedarse con lo que va después de etiqueta: |
| Auditar un repo | Revisar todas las ramas y el historial, no solo la principal |