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

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) :

  1. Le client propose nom d'utilisateur + clé publique (pas encore de signature)
  2. Le serveur reconnaßt que la clé appartient à l'utilisateur et attache prématurément l'utilisateur à la session, retourne true ("acceptable")
  3. Le client ne peut pas signer (pas de clé privée), donc l'authentification retombe sur le mot de passe
  4. 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):

sshconfig
# ~/.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) :

bash
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

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