Gitblit Embedded SSH Auth Bypass (CVE-2024-28080)

Tip

Apprenez & pratiquez AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Apprenez & pratiquez GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Apprenez & pratiquez Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

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

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

Tip

Apprenez & pratiquez AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Apprenez & pratiquez GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Apprenez & pratiquez Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Soutenez HackTricks