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.
Ú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 showes un comando “navaja suiza”: le puedes pasar un commit, una rama, una tag ocommit: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 / concepto | Para qué sirve |
|---|---|
git tag | Listar todas las tags (etiquetas) del repositorio |
| Tag de Git | Etiqueta 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 repo | Working tree, historial, ramas, tags, stash, reflog… |