Files
hacktricks-cloud/src/pentesting-ci-cd/gitblit-security/gitblit-embedded-ssh-auth-bypass-cve-2024-28080.md

7.2 KiB
Raw Blame History

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

{{#include ../../banners/hacktricks-training.md}}

Summary

CVE-2024-28080 ist ein authentication bypass im embedded SSHService von Gitblit, verursacht durch falsche Handhabung des Sitzungszustands bei der Integration mit Apache MINA SSHD. Wenn ein Benutzerkonto mindestens einen SSH public key registriert hat, kann ein Angreifer, der den Benutzernamen und einen der public keys dieses Benutzers kennt, sich ohne privaten Schlüssel und ohne Passwort authentifizieren.

  • Affected: Gitblit < 1.10.0 (beobachtet in 1.9.3)
  • Fixed: 1.10.0
  • Requirements to exploit:
  • Git over SSH auf der Instanz aktiviert
  • Das Opferkonto hat mindestens einen SSH public key in Gitblit registriert
  • Angreifer kennt den Benutzernamen des Opfers und einen seiner public keys (oft auffindbar, z.B. https://github.com/.keys)

Root cause (state leaks between SSH methods)

In RFC 4252 verläuft die publickey authentication in zwei Phasen: Der Server prüft zuerst, ob ein bereitgestellter public key für einen Benutzernamen akzeptabel ist, und erst nach einem Challenge/Response mit einer Signatur authentifiziert er den Benutzer. In MINA SSHD wird der PublickeyAuthenticator zweimal aufgerufen: beim KeyAcceptance (noch keine Signatur) und später, nachdem der Client eine Signatur zurücksendet.

Der PublickeyAuthenticator von Gitblit veränderte den Sitzungskontext beim ersten, presignature Aufruf, indem er das authentifizierte UserModel an die Session bindete und true zurückgab ("key acceptable"). Wenn die Authentifizierung später auf Passwort zurückfiel, vertraute der PasswordAuthenticator dem veränderten SessionZustand und machte einen ShortCircuit, indem er true zurückgab, ohne das Passwort zu validieren. Infolgedessen wurde nach einer vorherigen publickey "acceptance" für denselben Benutzer jedes Passwort (einschließlich leerer) akzeptiert.

Fehlerhafter Ablauf (auf hoher Ebene):

  1. Client bietet username + public key an (noch keine Signatur)
  2. Server erkennt den Key als zum Benutzer gehörig, bindet vorzeitig den Benutzer an die Session und gibt true zurück ("acceptable")
  3. Client kann nicht signieren (kein private key), daher fällt die Auth auf Passwort zurück
  4. Password auth sieht bereits einen Benutzer in der Session und gibt bedingungslos Erfolg zurück

Stepbystep exploitation

  • Sammle den Benutzernamen des Opfers und einen seiner public keys:
  • GitHub stellt public keys unter https://github.com/.keys bereit
  • Öffentliche Server geben oft authorized_keys preis
  • Konfiguriere OpenSSH so, dass nur die publicHälfte präsentiert wird, sodass die Signaturerzeugung fehlschlägt und ein Fallback auf Passwort erzwungen wird, während gleichzeitig der publickey acceptancePfad auf dem Server ausgelöst wird.

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)

Verbinden und drücken Sie Enter bei der Passwortabfrage (oder geben Sie eine beliebige Zeichenfolge ein):

ssh gitblit-target
# or Git over SSH
GIT_SSH_COMMAND="ssh -F ~/.ssh/config" git ls-remote ssh://<victim-username>@<host>/<repo.git>

Die Authentifizierung gelingt, weil die vorherige publickeyPhase den SessionZustand in einen authentifizierten Benutzer verändert hat, und password auth diesem Zustand fälschlicherweise vertraut.

Hinweis: Wenn ControlMasterMultiplexing in Ihrer SSHKonfiguration aktiviert ist, können nachfolgende GitBefehle die bereits authentifizierte Verbindung wiederverwenden, was die Auswirkungen erhöht.

Impact

  • Vollständige Identitätsübernahme jedes GitblitBenutzers mit mindestens einem registrierten SSH publickey
  • Lese-/Schreibzugriff auf Repositories entsprechend den Berechtigungen des Opfers (SourceExfiltration, unautorisierte Pushes, SupplyChainRisiken)
  • Potenzielle administrative Auswirkungen bei Zielvorgabe eines AdminBenutzers
  • Reiner NetzwerkExploit; kein BruteForce oder private key erforderlich

Detection ideas

  • Überprüfen Sie SSHLogs auf Sequenzen, in denen ein publickeyVersuch von einer erfolgreichen passwordAuthentifizierung mit leerem oder sehr kurzem Passwort gefolgt wird
  • Suchen Sie nach Abläufen: publickeyMethode bietet nicht unterstütztes/inkompatibles KeyMaterial an, gefolgt von sofortigem passwordErfolg für denselben Benutzernamen

Mitigations

  • Upgrade auf Gitblit v1.10.0+
  • Bis zum Upgrade:
  • Git over SSH auf Gitblit deaktivieren, oder
  • Netzwerkzugriff auf den SSHDienst einschränken, und
  • Auf die oben beschriebenen verdächtigen Muster überwachen
  • Betroffene Benutzeranmeldeinformationen rotieren, falls ein Kompromiss vermutet wird

General: abusing SSH auth method stateleakage (MINA/OpenSSHbased services)

Pattern: Wenn der publickeyAuthenticator eines Servers Benutzer-/SessionZustand während der presignature "key acceptable"Phase verändert und andere Authenticators (z. B. password) diesem Zustand vertrauen, kann man die Authentifizierung umgehen, indem man:

  • Einen legitimen public key für den Zielbenutzer präsentiert (kein private key)
  • Den Client dazu bringt, beim Signieren zu scheitern, sodass der Server auf password zurückfällt
  • Beliebiges Passwort angibt, während der passwordAuthenticator aufgrund des geleakten Zustands kurzschließt

Praktische Tipps:

  • Public key harvesting at scale: public keys aus üblichen Quellen abrufen, z. B. https://github.com/.keys, organisatorische Verzeichnisse, TeamSeiten, leaked authorized_keys
  • Forcing signature failure (clientside): IdentityFile nur auf die .pub zeigen lassen, IdentitiesOnly yes setzen, PreferredAuthentications so belassen, dass publickey zuerst und dann password versucht wird
  • MINA SSHD integration pitfalls:
  • PublickeyAuthenticator.authenticate(...) darf Benutzer-/SessionZustand nicht anhängen, bevor der postsignatureVerifizierungsPfad die Signatur bestätigt
  • PasswordAuthenticator.authenticate(...) darf keinen Erfolg aus einem während einer vorherigen, unvollständigen Authentifizierungsmethode veränderten Zustand ableiten

Related protocol/design notes and literature:

  • SSH userauth protocol: RFC 4252 (publickey method is a twostage process)
  • Historical discussions on early acceptance oracles and auth races, e.g., CVE201620012 disputes around OpenSSH behavior

References

{{#include ../../banners/hacktricks-training.md}}