Gitblit Embedded SSH Auth Bypass (CVE-2024-28080)
Reading time: 7 minutes
tip
Apprenez et pratiquez le hacking AWS :
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP :
HackTricks Training GCP Red Team Expert (GRTE)
Apprenez et pratiquez le hacking Azure :
HackTricks Training Azure Red Team Expert (AzRTE)
Soutenir HackTricks
- Vérifiez les plans d'abonnement !
- Rejoignez le đŹ groupe Discord ou le groupe telegram ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépÎts github.
Résumé
CVE-2024-28080 est un contournement d'authentification dans le service SSH embarqué de Gitblit dû à une gestion incorrecte de l'état de session lors de l'intégration avec Apache MINA SSHD. Si un compte utilisateur possÚde au moins une clé publique SSH enregistrée, un attaquant qui connaßt le nom d'utilisateur et l'une des clés publiques de cet utilisateur peut s'authentifier sans la clé privée et sans le mot de passe.
- Affecté : Gitblit < 1.10.0 (observé sur 1.9.3)
- Corrigé : 1.10.0
- Conditions nécessaires pour exploiter :
- Git over SSH activé sur l'instance
- Le compte victime a au moins une clé publique SSH enregistrée dans Gitblit
- L'attaquant connaßt le nom d'utilisateur de la victime et l'une de ses clés publiques (souvent découvrable, p.ex. https://github.com/
.keys)
Cause racine (state leaks between SSH methods)
Dans la RFC 4252, l'authentification par clĂ©âpublique se dĂ©roule en deux phases : le serveur vĂ©rifie d'abord si une clĂ© publique fournie est acceptable pour un nom d'utilisateur, et ce n'est qu'aprĂšs un challenge/rĂ©ponse avec une signature qu'il authentifie l'utilisateur. Dans MINA SSHD, le PublickeyAuthenticator est invoquĂ© deux fois : lors de l'acceptation de la clĂ© (pas encore de signature) et plus tard aprĂšs que le client renvoie une signature.
Le PublickeyAuthenticator de Gitblit a mutĂ© le contexte de session lors du premier appel prĂ©âsignature en liant le UserModel authentifiĂ© Ă la session et en retournant true ("key acceptable"). Lorsque l'authentification est ensuite retombĂ©e sur le mot de passe, le PasswordAuthenticator s'est fiĂ© Ă cet Ă©tat de session mutĂ© et a courtâcircuitĂ©, retournant true sans valider le mot de passe. En consĂ©quence, n'importe quel mot de passe (y compris vide) Ă©tait acceptĂ© aprĂšs une "acceptation" prĂ©alable par clĂ©âpublique pour le mĂȘme utilisateur.
Flux défaillant (haut niveau) :
- Le client propose nom d'utilisateur + clé publique (pas encore de signature)
- Le serveur reconnaßt que la clé appartient à l'utilisateur et attache prématurément l'utilisateur à la session, retourne true ("acceptable")
- Le client ne peut pas signer (pas de clé privée), donc l'authentification retombe sur le mot de passe
- L'authentification par mot de passe voit un utilisateur déjà présent dans la session et renvoie inconditionnellement le succÚs
Exploitation pas Ă pas
- Recueillir le nom d'utilisateur d'une victime et l'une de ses clés publiques :
- GitHub expose les clés publiques à https://github.com/
.keys - Les serveurs publics exposent souvent authorized_keys
- Configurer OpenSSH pour ne prĂ©senter que la moitiĂ© publique afin que la gĂ©nĂ©ration de signature Ă©choue, forçant un retour arriĂšre vers le mot de passe tout en dĂ©clenchant quand mĂȘme le chemin d'acceptation par clĂ©âpublique sur le serveur.
Example SSH client config (no private key available):
# ~/.ssh/config
Host gitblit-target
HostName <host-or-ip>
User <victim-username>
PubkeyAuthentication yes
PreferredAuthentications publickey,password
IdentitiesOnly yes
IdentityFile ~/.ssh/victim.pub # public half only (no private key present)
Connectez-vous et appuyez sur Entrée à l'invite du mot de passe (ou tapez n'importe quelle chaßne) :
ssh gitblit-target
# or Git over SSH
GIT_SSH_COMMAND="ssh -F ~/.ssh/config" git ls-remote ssh://<victim-username>@<host>/<repo.git>
L'authentification rĂ©ussit parce que la phase prĂ©cĂ©dente de publicâkey a mutĂ© l'Ă©tat de session en celui d'un utilisateur authentifiĂ©, et password auth fait incorrectement confiance Ă cet Ă©tat.
Note : Si le ControlMaster multiplexing est activé dans la configuration SSH, les commandes Git suivantes peuvent réutiliser la connexion authentifiée, augmentant l'impact.
Impact
- Usurpation complÚte de n'importe quel utilisateur Gitblit disposant d'au moins une SSH public key enregistrée
- AccÚs en lecture/écriture aux repositories selon les permissions de la victime (exfiltration de code source, pushes non autorisés, risques pour la chaßne d'approvisionnement)
- Impact administratif possible si un utilisateur admin est ciblé
- Exploit purement réseau ; pas de brute force ni de private key requis
Idées de détection
- Passer en revue les logs SSH pour des sĂ©quences oĂč une tentative publickey est suivie d'une authentification password rĂ©ussie avec un mot de passe vide ou trĂšs court
- Rechercher des flux : la mĂ©thode publickey propose un matĂ©riel de clĂ© non pris en charge/incompatible suivi d'un succĂšs immĂ©diat de password pour le mĂȘme nom d'utilisateur
Atténuations
- Mettre Ă jour vers Gitblit v1.10.0+
- Jusqu'Ă la mise Ă jour :
- Désactiver Git over SSH sur Gitblit, ou
- Restreindre l'accÚs réseau au service SSH, et
- Surveiller les schĂ©mas suspects dĂ©crits ciâdessus
- Réinitialiser les identifiants des utilisateurs affectés si une compromission est suspectée
GĂ©nĂ©ral : abus du stateâleakage des mĂ©thodes d'auth SSH (services basĂ©s sur MINA/OpenSSH)
ModĂšle : Si l'authenticator publicâkey d'un serveur modifie l'Ă©tat user/session pendant la phase prĂ©âsignature "key acceptable" et que d'autres authenticators (p.ex. password) font confiance Ă cet Ă©tat, vous pouvez contourner l'authentification en :
- Présentant une public key légitime pour l'utilisateur cible (pas de private key)
- Forçant le client à échouer la signature pour que le serveur retombe sur password
- Fournissant n'importe quel password pendant que le password authenticator courtâcircuite sur l'Ă©tat leaked
Conseils pratiques :
- Public key harvesting at scale: pull public keys from common sources such as https://github.com/
.keys, organizational directories, team pages, leaked authorized_keys - Forcer l'échec de signature (cÎté client) : pointer IdentityFile vers uniquement le .pub, définir IdentitiesOnly yes, garder PreferredAuthentications pour inclure publickey puis password
- MINA SSHD integration pitfalls :
- PublickeyAuthenticator.authenticate(...) ne doit pas attacher l'Ă©tat user/session tant que le chemin de vĂ©rification postâsignature ne confirme la signature
- PasswordAuthenticator.authenticate(...) ne doit pas inférer le succÚs à partir d'un état muté pendant une méthode d'authentification antérieure incomplÚte
Related protocol/design notes and literature:
- SSH userauth protocol: RFC 4252 (publickey method is a twoâstage process)
- Historical discussions on early acceptance oracles and auth races, e.g., CVEâ2016â20012 disputes around OpenSSH behavior
References
- Gitblit CVE-2024-28080: SSH publicâkey fallback to password authentication bypass (Silent Signal blog)
- Gitblit v1.10.0 release notes
- Apache MINA SSHD project
- PublickeyAuthenticator API
- RFC 4252: The Secure Shell (SSH) Authentication Protocol
tip
Apprenez et pratiquez le hacking AWS :
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP :
HackTricks Training GCP Red Team Expert (GRTE)
Apprenez et pratiquez le hacking Azure :
HackTricks Training Azure Red Team Expert (AzRTE)
Soutenir HackTricks
- Vérifiez les plans d'abonnement !
- Rejoignez le đŹ groupe Discord ou le groupe telegram ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépÎts github.
HackTricks Cloud