
مختبر قائم على Docker يعيد إنتاج ثغرة SSRF CVE-2023-27163 في Request-Baskets، مع التحقق من الاستغلال، وسكربت كشف، ومعالجة عبر عزل الشبكة.
المشروع: مختبر أبحاث الثغرات وإعادة إنتاجها — CVE-2023-27163
المؤلف: Amulya Kaushik
الدور: مرشح متدرب في مجال البحث والتطوير الأمني السيبراني وتطوير محتوى المختبرات
تزوير الطلبات من جانب الخادم في Request-Baskets ≤ 1.2.1
مختبر بحثي محلي مكتفٍ ذاتيًا لإعادة إنتاج CVE-2023-27163 واكتشافه ومعالجته باستخدام بنية الدفاع في العمق.
| الحقل | القيمة |
|---|---|
| معرّف CVE | CVE-2023-27163 |
| CWE | CWE-918 — تزوير الطلبات من جانب الخادم (SSRF) |
| المنتج المتأثر | Request-Baskets |
| الإصدارات المتأثرة | ≤ 1.2.1 |
| الإصدار المُصلَّح | 1.2.2 (المصدر الأصلي) / عزل الشبكة بالدفاع في العمق |
| درجة CVSS v3.1 | 6.5 (متوسطة) |
| متجه CVSS | AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N |
| تعقيد الهجوم | منخفض — استدعاء API واحد بدون مصادقة |
ملاحظة حول قيود المصدر الأصلي والمعالجة:
بينما يتتبع CVE-2023-27163 التحقق التعسفي من عنوان URL الأمامي، فإن عمليات بناء الحاويات العامة لـdarklynx/request-basketsلا تفرض تصفية loopback أو الشبكات الفرعية الخاصة بشكل افتراضي. وفقًا لأفضل ممارسات DevSecOps الواقعية، يوضح مختبرنا المعالجة من خلال عزل شبكة الحاويات بالدفاع في العمق. من خلال عزل الواجهات الخلفية الداخلية الحساسة على شبكة Docker داخلية فقط (secure-internal-netمعinternal: true)، يتم قطع مسار التمرير، مما يخفف من قابلية استغلال ثغرة SSRF حتى عند تشغيل مُمرِّرات webhook غير موثوقة.
يوفر هذا المختبر بنيتين منفصلتين لـ Docker Compose:
docker-compose.yml): يتشارك Request-Baskets وخدمة echo داخلية سرية شبكة الجسر lab-net. يتم تعيين Request-Baskets إلى منفذ المضيف 55556 (معيَّن من منفذ الحاوية 55555).docker-compose.patched.yml): يتم ربط Request-Baskets حصريًا بـ public-net، بينما يتم ربط خدمة echo الداخلية بـ secure-internal-net (internal: true).docker-compose.yml)┌─────────────────────────────────────────────────────────┐
│ Docker: lab-net │
│ │
│ ┌─────────────────────┐ ┌────────────────────────┐ │
│ │ request-baskets │───▶│ internal-service │ │
│ │ (v1.2.1) │ │ (http-echo:5678) │ │
│ │ Port 55556 ◀──HOST │ │ NOT exposed to host │ │
│ └─────────────────────┘ └────────────────────────┘ │
└─────────────────────────────────────────────────────────┘
▲
│ HTTP (port 55556)
│
┌────┴─────┐
│ Attacker │
└──────────┘
docker-compose.patched.yml)┌─────────────────────────┐ ┌─────────────────────────┐
│ public-net │ │ secure-internal-net │
│ │ │ (internal: true) │
│ ┌───────────────────┐ │ │ ┌───────────────────┐ │
│ │ request-baskets │ │ ✕ │ │ internal-service │ │
│ │ Port 55556◀─HOST │ │ ──/──▶ │ │ (http-echo:5678) │ │
│ └───────────────────┘ │ │ └───────────────────┘ │
└─────────────────────────┘ └─────────────────────────┘
| المتطلب | الحد الأدنى للإصدار | ملاحظات |
|---|---|---|
| Docker Engine | 20.10+ | بيئة تشغيل المحاكاة الافتراضية للحاويات |
| Docker Compose | v2.0+ | تنسيق متعدد الحاويات |
| Python | 3.8+ | أدوات التحقق والاكتشاف عبر سطر الأوامر |
إعداد البيئة الافتراضية لـ Python والتبعيات:
python3 -m venv .venv
source .venv/bin/activate
pip install requests fpdf2
ابدأ البيئة المُعرَّضة للثغرة (Request-Baskets v1.2.1 متاح على http://localhost:55556):
docker compose up -d
تحقق من تشغيل كلتا الحاويتين:
docker compose ps
المخرجات المتوقعة:
NAME IMAGE COMMAND SERVICE STATUS PORTS
isolated-internal-service hashicorp/http-echo:latest "/http-echo -text=CO…" internal-service Up 5678/tcp
vulnerable-request-baskets darklynx/request-baskets:v1.2.1 "/bin/sh -c /bin/ent…" request-baskets Up 0.0.0.0:55556->55555/tcp
تأكد من أن الخدمة الداخلية غير قابلة للوصول مباشرة من المضيف:
curl http://localhost:5678 2>&1 || echo "Connection refused — internal service isolated as expected"
نفّذ سكربت التحقق الآلي من SSRF:
python3 scripts/verify_vulnerability.py
ما يحدث:
/api/baskets/ssrf-verification-basket مع تعيين forward_url: "http://internal-service:5678" و proxy_response: true.CONFIDENTIAL_DATA{INTERNAL_SSRF_DEMONSTRATION_SUCCESS} وتُخرج RESULT: VULNERABLE.شغّل فحص التدقيق غير التدميري:
python3 scripts/detect.py
ما يحدث:
http://127.0.0.1:80) مقبولًا.AUDIT RESULT: VULNERABLE عند القبول (HTTP 201) وتنظيف سلة الفحص.انتقل إلى البنية المُعالَجة المُجزَّأة:
docker compose down
docker compose -f docker-compose.patched.yml up -d
python3 scripts/verify_vulnerability.py
المخرجات المتوقعة:
==============================================================
[✓] REMEDIATION VERIFIED: TARGET SECURED
The Request-Baskets instance failed to reach the internal
isolated service (HTTP 502 / Host Unreachable).
Network segmentation successfully prevented SSRF data exfiltration.
==============================================================
قم بإيقاف البيئة عند الانتهاء:
docker compose -f docker-compose.patched.yml down
يتم الاحتفاظ بمجموعة الأدلة المرئية الكاملة للمُخرَج 3 في دليل evidence/:
تم توثيق الشروحات التفصيلية والأوامر ونصوص وحدة التحكم لكل لقطة شاشة في evidence/README.md.
لالتقاط جميع لقطات شاشة الطرفية بالتسلسل دون متاعب الإعداد اليدوي، شغّل:
./scripts/capture_evidence_flow.sh
قم بتجميع التقرير التقني الأكاديمي إلى PDF:
python3 docs/generate_blog_pdf.py
المخرجات المُنشأة: docs/CVE-2023-27163-Technical-Blog.pdf
cve-2023-27163-lab/
├── .gitignore # Git artifact exclusions (.venv, cache, OS files)
├── docker-compose.yml # Vulnerable environment (shared lab-net, port 55556)
├── docker-compose.patched.yml # Remediated environment (disjoint network isolation)
├── README.md # Complete documentation, attribution & guide
├── scripts/
│ ├── capture_evidence_flow.sh # Interactive runner for capturing screenshots
│ ├── verify_vulnerability.py # SSRF exploitation & remediation verification CLI
│ └── detect.py # Defensive audit and detection tool
├── evidence/
│ └── README.md # Formal screenshot evidence walkthrough
└── docs/
├── technical_blog.md # Academic technical write-up (800–1,200 words)
├── generate_blog_pdf.py # Markdown → PDF converter
└── CVE-2023-27163-Technical-Blog.pdf # Compiled academic report PDF
يستند هذا البحث وتطوير المختبر إلى معايير الأمان المفتوحة وإرشادات البائعين وقواعد بيانات الثغرات:
AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N).هذا المختبر مخصص للأغراض التعليمية وأبحاث الأمان المصرح بها فقط. لا تستخدم هذه الأدوات ضد أنظمة لا تملكها أو ليس لديك إذن صريح باختبارها.
| العنصر | الغرض | رابط الملف | الوصف |
|---|
| لقطة الشاشة 1 | البيئة قيد التشغيل | 01_lab_running.png | تُظهر تشغيل vulnerable-request-baskets (المنفذ 55556) و isolated-internal-service في وقت واحد على lab-net. |
| لقطة الشاشة 2 | استغلال SSRF | 02_reproduction_ssrf.png | تعرض العلم المُسرَّب CONFIDENTIAL_DATA{...} وحالة VULNERABLE. |
| لقطة الشاشة 3 | أداة الاكتشاف الدفاعية | 03_detection_tool_run.png | تعرض فحص البصمات ثنائي المرحلة وتدقيق loopback الذي يشير إلى VULNERABLE. |
| لقطة الشاشة 4 | التحقق من المعالجة | 04_remediation_verified.png | تُثبت فشل التمرير (HTTP 502 / Host Unreachable) تحت دفاع الشبكة المُجزَّأة. |
| لقطة الشاشة 5 | تكوين واجهة الويب | 05_web_ui_ssrf.png | (إضافي) لقطة متصفح لإعدادات واجهة Request-Baskets المُكوَّنة مع Proxy Response. |