
إثبات مفهوم لـ CVE-2022-30600
يحتوي هذا المستودع على تطبيقين لإثبات المفهوم الذي يستغل CVE-2022-30600.
CVE-2022-30600 هي ثغرة أمنية تسمح للمهاجم بتجاوز حد قفل الحساب داخل تطبيق moodle web.
كما هو موضح في الإدخال التالي في قاعدة بيانات NVD https://nvd.nist.gov/vuln/detail/CVE-2022-30600، من المعروف أن الإصدارات التالية معرضة لهذا الاستغلال.
3.9 - 3.9.13
3.10 - 3.10.10
3.11 - 3.11.6
كما هو موضح في الالتزام المستخدم لتصحيح هذه الثغرة، تكمن المشكلة في المنطق المستخدم للوصول إلى قيمة login_failed_count وزيادتها في قاعدة البيانات.
في حالة حدوث أكثر من طلب تسجيل دخول متزامن واحد، فقد يفشل تطبيق moodle web في التحقق بشكل صحيح من قيمة تسجيل الدخول وتحديثها داخل التطبيق. ويؤدي ذلك إلى احتساب فشلين أو أكثر في تسجيل الدخول كفشل واحد فقط.
لفهم ذلك بشكل أفضل، يوضح الرسم البياني أدناه تحليلًا عالي المستوى لطلب تسجيل دخول فاشل من منظور العميل وتطبيق الويب وقاعدة البيانات.
sequenceDiagram
participant C as Client
participant W as Webapp
participant D as Database
C->>W: Login Request
W->>D: Requests failed_login_attempt
D->>W: failed_login_attempt = 0
W->>W: local failed_login_attempt = 0
W->>W: local failed_login_attempt = 1
W->>D: failed_login_attempt = 1
W->>C: Login Failedالنتيجة هي أن قيمة failed_login_attempt في قاعدة البيانات صحيحة وستقوم محاولات تسجيل الدخول اللاحقة بتحديث القيمة بشكل صحيح.
إذا أرسل المهاجم عددًا من طلبات تسجيل الدخول المتزامنة، فستحدث المشكلة التالية.
sequenceDiagram
participant C as Client
participant W as Webapp
participant D as Database
C->>W: Login Request (session 1)
C->>W: Login Request (session 2)
W->>D: Requests failed_login_attempt (session 1)
W->>D: Requests failed_login_attempt (session 2)
D->>W: failed_login_attempt = 0 (session 1)
D->>W: failed_login_attempt = 0 (session 2)
W->>W: local failed_login_attempt = 0 (session 1)
W->>W: local failed_login_attempt = 0 (session 2)
W->>W: local failed_login_attempt = 1 (session 1)
W->>W: local failed_login_attempt = 1 (session 2)
W->>D: failed_login_attempt = 1 (session 1)
W->>D: failed_login_attempt = 1 (session 2)
W->>C: Login Failed (session 1)
W->>C: Login Failed (session 2)نتيجة هذا التفاعل هي أن قيمة قاعدة البيانات failed_login_attempt تزداد بمقدار 1 فقط على الرغم من حدوث طلبي تسجيل دخول فاشلين. يمكن توسيع نطاق ذلك إلى مئات الطلبات، وتكون الحدود هي عدد الطلبات المتزامنة التي يمكن للعميل إرسالها وعدد الطلبات التي يمكن لخادم الويب إدارتها بشكل متزامن.
علاوة على ذلك، إذا كان المهاجم لديه إمكانية الوصول إلى عدة عملاء (مثل شبكة بوت) وكان قادرًا على مزامنة الوقت الذي تُجرى فيه هذه الطلبات، فيمكن للمهاجم التغلب على القيود باستخدام عميل واحد وجعل الهجوم أكثر صعوبة في التخفيف.
poc.py هو تنفيذ بايثون 3 لهذا الهجوم. يستخدم الخيوط (threads) من أجل تنفيذ الطلبات المتزامنة. على الرغم من أن إثبات المفهوم هذا يعمل، إلا أن قفل المفسر العام (GIL) الموجود في بايثون 3 يعيق فائدة استخدام خيوط متعددة في هذه الظروف. أوصي بشدة باستخدام تنفيذ C++ لأنه يعمل بشكل أفضل عند تنفيذ الهجوم على عميل واحد.
poc.py [-h] -u USERNAME -url TARGET -w WORDLIST -t THREADS [-a ATTEMPTS] [-d DELAY]
options:
-h, --help
يعرض رسالة المساعدة هذه
-u USERNAME, --username USERNAME
اسم المستخدم للحساب المستهدف
-url TARGET, --target TARGET
عنوان URL الأساسي لتطبيق moodle web المستهدف
-w WORDLIST, --wordlist WORDLIST
المسار إلى ملف قائمة الكلمات المستخدمة
-t THREADS, --threads THREADS
عدد الخيوط التي سيتم إنشاؤها لكل محاولة
-a ATTEMPTS, --attempts ATTEMPTS
عدد المحاولات التي ترغب في القيام بها. القيمة الافتراضية هي 1
-d DELAY, --delay DELAY
هذا هو عدد الثواني بين كل محاولة. القيمة الافتراضية هي 2
python3 poc.py -u admin -url https://moodle/ -w /usr/share/wordlists/rockyou.txt -t 15 -a 8
الهدف : https://moodle/
اسم مستخدم الحساب : admin
قائمة الكلمات : /usr/share/wordlists/rockyou.txt
الخيوط : سيتم إجراء 15 طلب تسجيل دخول في كل محاولة
المحاولات : سيتكرر الهجوم 8 مرات بإجمالي.
في هذا المثال، سيتم إجراء 120 (8 * 15) طلب تسجيل دخول. سيكون هناك تأخير لمدة ثانيتين بين كل محاولة
poc.cpp هو تنفيذ C++ للهجوم الذي يستخدم مكتبة curl لتنفيذ الهجوم. وبالتالي، يحتاج إلى بعض علامات المترجم (compiler flags) لكي يتم تجميع التطبيق. بشكل عام، يعمل هذا التنفيذ بشكل أفضل من إصدار بايثون 3 حيث أن الخيوط قادرة على استخدام جميع أنوية جهاز العميل مما يسمح باتصالات متزامنة أكثر في وقت أقصر. هذا يعني أن الاستغلال قادر على العمل بشكل أكثر اتساقًا.
g++ poc.cpp -o poc -lcurl
Usage:
poc [OPTION...]
-a, --attempts
عدد مرات تنفيذ الهجوم.
-t, --threads
عدد الخيوط المستخدمة في كل محاولة.
-n, --username
مستخدم الحساب الذي تستهدفه
-u, --URL
عنوان URL الأساسي لتطبيق moodle web
-d, --delay
التأخير الزمني بين المحاولات. القيمة الافتراضية هي 5
-v, --version
إظهار الإصدار
-h, --help
عرض رسالة المساعدة
-w, --wordlist arg
قائمة كلمات كلمات المرور.
./poc -w /usr/share/wordlists/rockyou.txt -u https://moodle/ -n admin -a 3 -t 5 -d 2
قائمة الكلمات : /usr/share/wordlists/rockyou.txt
عنوان URL : https://moodle/
اسم مستخدم الحساب : admin
المحاولات : سيتم إجراء 3 محاولات
الخيوط : سيتم استخدام 5 خيوط في كل محاولة
التأخير : سيكون هناك تأخير لمدة ثانيتين بين كل محاولة
من أجل تطوير واختبار وتصحيح هذه النصوص البرمجية، قمت بإنشاء آلة افتراضية. استخدمت هذه الآلة الافتراضية البرامج والإصدارات التالية.
Moodle 3.9.0 PHP 7.2.34 MySQL 8.0.30 Ubuntu 5.15.0-41-generic Apache 2.4.52
أنا لا أقر باستخدام كود المصدر الخاص بي في أنشطة غير قانونية.