1. Descripción técnica
Muchas aplicaciones se despliegan copiando directamente el repositorio Git al servidor web, dejando el directorio .git/ accesible desde el navegador. Ese directorio contiene toda la historia del proyecto: código fuente, ramas, commits antiguos y, con frecuencia, secretos (credenciales, claves privadas, tokens) que se introdujeron y luego se "borraron" pero siguen en el historial.
Si .git/ es accesible (aunque el listado de directorios esté deshabilitado), un atacante puede reconstruir el repositorio completo descargando los objetos de Git (.git/HEAD, .git/index, .git/objects/...) con herramientas automatizadas, y luego inspeccionar el código y el historial en busca de información sensible o vulnerabilidades.
2. Impacto de la vulnerabilidad
- Divulgación del código fuente completo de la aplicación (facilita encontrar otras vulnerabilidades: LFI, SQLi, RCE...).
- Fuga de secretos presentes en el historial (claves SSH/API, contraseñas de BD,
.env). - Conocimiento de rutas internas, endpoints ocultos y lógica de autenticación.
3. Condiciones necesarias
- Desplegar la aplicación incluyendo el directorio
.git/en la raíz web. - Configuración del servidor que sirve el contenido de
.git/(no bloquea rutas ocultas). - Historial con secretos no purgados.
4. Validación y detección
- Nmap:
nmap -sV --script http-git -p80 target- Comprobación manual:
curl http://target/.git/HEAD # ref: refs/heads/master → existe- Reconstrucción del repositorio:
git-dumper http://target/.git/ ./loot
# o GitTools (gitdumper.sh + extractor.sh)- Revisar el historial una vez descargado:
git log --all
git log -p # ver diffs (secretos borrados aparecen aquí)5. Mitigación
- No desplegar el directorio
.git/en producción (usargit archive, CI/CD que excluya.git, o exportar sin él). - Bloquear el acceso a rutas ocultas en el servidor web (
location ~ /\.git { deny all; }en nginx;RedirectMatch 404 /\.giten Apache). - Purgar secretos del historial si se filtraron (
git filter-repo) y rotarlos.
6. Explotación documentada
6.1 018-university
Nmap detecta el repositorio y revela incluso el remoto de GitHub:
| http-git:
| 192.168.1.28:80/.git/
| Git repository found!
| Remotes:
|_ https://github.com/rskoolrash/Online-Admission-SystemDescargando el código (o consultando el repo público), se analiza el fuente y se descubren vulnerabilidades (p. ej. endpoints de subida de archivos sin control de sesión) o secretos en el historial:
git log -p | grep -iE 'password|secret|api[_-]?key|BEGIN .* PRIVATE KEY'En esta máquina, el repositorio expuesto identifica el proyecto Online Admission System. La revisión del código permite localizar un endpoint de subida sin una comprobación de sesión efectiva y el directorio donde se almacenan los archivos, que son los datos necesarios para continuar la explotación descrita en el writeup.
6.2 01-darkhole_2
En este caso se reconstruye el repositorio desde .git/ y se inspeccionan sus commits. Un estado anterior del proyecto conserva credenciales de acceso que ya no aparecen en la versión desplegada, demostrando que eliminar un secreto del árbol de trabajo no lo elimina del historial.
7. Clasificación
- Tipo: Source Code Disclosure / Sensitive Information Exposure
- CWE:
- CWE-527: Exposure of Version-Control Repository to an Unauthorized Control Sphere
- CWE-200: Exposure of Sensitive Information to an Unauthorized Actor