Git stocke un dépôt sous forme de base de données d'objets adressée par le contenu sous .git/ : commits, trees et blobs indexés par SHA-1, plus des refs, un store d'objets packés et un config. Tout ce qu'un attaquant veut découle de cette disposition. Si un serveur web sert .git/, l'ensemble de l'arborescence et son historique peuvent être reconstruits hors ligne. Si l'historique contient un identifiant supprimé par la suite, il reste dans le store d'objets. Si un serveur de dépôt est anonyme, il peut être cloné. Et parce que Git exécute des hooks et honore la config de dépôt automatiquement, un clone ou un push peut devenir une exécution de code.
Triage#
curl -s -o /dev/null -w '%{http_code}\n' https://<target>/.git/HEAD # 200 + "ref: refs/heads/..." => exposed
nmap -p9418 -sV <target> # git:// daemon
git ls-remote git://<target>/<repo> # anonymous clone test
Pages#
- Répertoire .git exposé : reconstruire l'arborescence source complète et la config depuis un
.gitservi par le web. - Secrets dans l'historique : récupérer des identifiants depuis l'historique des commits, les objets orphelins et le reflog.
- Démon : cloner des dépôts privés depuis un service
git://non authentifié. - Hooks et exécution par la config : exécution de code via les hooks et la configuration au moment du clone.