Entrada

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.

Bandit: nivel 29 → 30

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 2 es la herramienta ideal cuando el dato va después de una etiqueta tipo clave: valor. En este blog ya hemos usado awk '{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 -a para 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 gitleaks o trufflehog escanean 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 / conceptoPara qué sirve
git branch -aListar todas las ramas, locales y remotas
git checkout <rama>Cambiar a otra rama del repositorio
Rama dev / masterDesarrollo vs producción: el secreto suele estar en desarrollo
cut -d ':' -f 2Quedarse con lo que va después de etiqueta:
Auditar un repoRevisar todas las ramas y el historial, no solo la principal
Esta entrada está licenciada bajo CC BY 4.0 por el autor.