Entrada

Bandit: nivel 30 → 31

Cómo resolver el nivel 30 → 31 de OverTheWire Bandit encontrando la contraseña escondida en una tag (etiqueta) de Git con git tag y git show.

Bandit: nivel 30 → 31

Último rincón raro de Git en Bandit: las tags (etiquetas). Los ficheros están vacíos, el historial parece no tener nada… pero el secreto está metido en una tag. Es un sitio que casi nadie revisa, y justo por eso es interesante conocerlo.

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 bandit30-git es la contraseña de bandit30.

1
2
3
4
5
6
7
$ cd $(mktemp -d)
$ git clone ssh://bandit30-git@bandit.labs.overthewire.org:2220/home/bandit30-git/repo
$ cd repo
$ ls
README.md
$ cat README.md
just an empty file... muahaha

El README se burla de nosotros: está “vacío”. El historial (git log) tampoco tiene nada útil, y no hay ramas interesantes. Si los sitios habituales están vacíos, toca mirar en los menos habituales.

El concepto: las tags de Git

Una tag es una etiqueta con nombre que apunta a un punto concreto del repositorio (normalmente un commit). Se usan para marcar versiones (v1.0, v2.3…). Lo importante para nosotros: una tag puede llevar su propio mensaje y contenido, y no aparece en git log ni en git branch. Es un escondite perfecto.

La solución

git tag lista todas las tags del repo:

1
2
$ git tag
secret

Hay una tag llamada secret. Pinta de ser justo lo que buscamos. git show <tag> muestra a qué apunta y su contenido:

1
2
$ git show secret
[REDACTED]

Y ahí está la contraseña de bandit31. git show funciona con tags igual que con commits: te enseña el objeto al que apunta la etiqueta.

git show es un comando “navaja suiza”: le puedes pasar un commit, una rama, una tag o commit:fichero, y te muestra lo que haya ahí. Por eso ha aparecido en casi todos estos niveles de Git.

Por qué esto importa en seguridad

Este nivel cierra una idea que llevamos arrastrando desde el 27: un repositorio Git guarda información en muchos más sitios de los que parece. Resumiendo todo el bloque, al auditar un repo hay que mirar en:

  • El working tree (los ficheros actuales) — nivel 27 → 28.
  • El historial de commits — nivel 28 → 29.
  • Todas las ramas — nivel 29 → 30.
  • Las tags — este nivel.
  • Y también el stash, los reflogs, los objetos sueltos (git fsck --lost-found)…

Un secreto puede estar en cualquiera de esos rincones. Por eso las herramientas de escaneo (gitleaks, trufflehog) no se limitan a los ficheros: recorren el repo entero. Si tú ocultas información en una tag pensando que nadie la mira, te equivocas: un git tag la delata.

Pasar al nivel siguiente

1
$ sshpass -p '[REDACTED]' ssh bandit31@bandit.labs.overthewire.org -p 2220

El siguiente nivel le da la vuelta a Git: en vez de leer un repo, tendrás que hacer un push a él, cumpliendo unas condiciones concretas, para que te suelte la contraseña.

Resumen

Comando / conceptoPara qué sirve
git tagListar todas las tags (etiquetas) del repositorio
Tag de GitEtiqueta con nombre que apunta a un punto del repo; puede ocultar datos
git show <tag>Mostrar a qué apunta una tag y su contenido
Rincones de un repoWorking tree, historial, ramas, tags, stash, reflog…
Esta entrada está licenciada bajo CC BY 4.0 por el autor.