كنز FortiGate SSL-VPN الذهبي. CVE-2024-21762 وCVE-2023-27997. 79 عميل استغلال يعمل. 53 طراز أجهزة. 55 إصدار FortiOS.
أرشيف بحثي. تم استردادها كما وُجدت. لم أكتب هذه الملفات.
تاريخ النشر: 1 سبتمبر 2026
هذا المستودع هو المنسّق (orchestrator)، والحمولات من المرحلة الثانية، ومستمعات المشغّل (operator listeners) التي تقع فوق كتالوج استغلال FortiGate SSL-VPN الخاص بكل طراز (SKU). القصة الكاملة، والأعداد، وملاحظات الصيد موجودة في السلسلة The SSL-VPN pot of gold على Abraxas Labs.
لا تشغّل هذه المواد ضد أي مضيف إلا إذا كان لديك إذن كتابي صريح من كل من الطرف المستضيف لهذا المستودع ومالك الأنظمة المستهدفة. كانت ثغرات CVE ذات الصلة عامة وتم تصحيحها قبل هذا الإصدار. هذه الشجرة مخصصة للبحث والكشف والتحليل التاريخي.
عثرت على حزمة FortiGate SSL-VPN خاصة في البرية. أول إصدار كان دليلاً من العملاء العاملين: أسماء مثل exp/exp_60E-v6.4.7.py و exp/exp_1000D-v7.4.0.py. كل ملف هو عميل إفساد ذاكرة خاص بكل طراز (SKU) وكل إصدار FortiOS. ثغرتان عامتان من نوع n-day، أعيدت صياغتهما عبر العتاد والبرامج الثابتة حتى بدا المجلد ككتالوج قطع غيار.
الكنز هو مصفوفة الإزاحات (offset matrix)، وليس ثغرة جديدة. هذه الحجة موجودة في المرحلة 0 من السلسلة. المرحلة 1 تغطي البدائيتين كسلوك. المرحلة 2 هي خريطة SKU / train / CPU القابلة للبحث. المرحلة 3 هي الصيد.
هذا المستودع هو بقية نفس الحزمة، وليس عائلة استغلال ثانية.
exp/ هي العملاء الخاصون بكل صورة تم وصفهم بالفعل في السلسلة.shellcode/ هي المُطلِق (launcher)، وجالب الحمولة، ومستمعات سرقة الإعدادات التي كُتب هؤلاء العملاء لاستدعائها.exp_*.py لم تحتوِ أبداً على الحمولة. كانت تعرف فقط (1) سحب بايتات خام من "خادم شيلكود" أو (2) GET /s.js وتنفيذها عبر eval. تلك القطع المفقودة موجودة هنا.البدائيتان:
| العائلة | CVE | استشارة Fortinet | اللون العام |
|---|---|---|---|
| A | CVE-2024-21762 | FG-IR-24-015 | Assetnote — Two Bytes is Plenty |
| B | CVE-2023-27997 | FG-IR-23-097 | Lexfo — XORtigate, Bishop Fox |
كلاهما موجود في كتالوج الثغرات المستغلة المعروفة لدى CISA. poc.py لا ينفذ أي من ثغرتي CVE. إنه يختار ويلف العائلتين المصنفتين بالفعل (الكتابة المجزأة 21762؛ تجاوز سعة الكومة enc= 27997).
.
├── poc.py # مُطلِق pocsuite3 / بصمة / مدير عمليات
├── s.js # المرحلة الثانية Node (سارق الإعدادات)
├── send_cmd.py # معالج الاستدعاء لمسار stager
├── init.sh # تثبيت حزم محطة عمل المشغّل
├── requirements.txt # pwntools
├── exp/
│ └── exp_<SKU>-v<FortiOS>.py
└── shellcode/
├── shellcode_server.py # مضخة كتل مسبوقة الطول
├── shellcode_arm # ~2.0 MB مرحلة ثانية خام
└── shellcode_amd64 # ~2.7 MB مرحلة ثانية خام
exp/index.html و shellcode/index.html هما قوائم أدلة عادية من خادم Python http.server. تُظهران فقط أن هذه الشجرة كانت مستضافة كجذر ويب في وقت ما.
هذه النسخة من exp/ هي الكتالوج الأقدم بالإضافة إلى أربعة عملاء إضافيين: exp_30E-v6.2.4.py، exp_30E-v6.2.12.py، exp_30E-v6.2.14.py، exp_40F-v7.0.5.py.
poc.py المنسّق (pocsuite3)
│
├─ بصمة البوابة ───────────── VERSION_LIBS (hash → SKU + FortiOS)
├─ اختيار الملف ───────────── exp/exp_<SKU>-v<ver>.py
│
├─ إذا كان العميل من نوع "stager" (عائلة A ARM / بعض amd64)
│ تشغيل shellcode/shellcode_server.py
│ يقرأ shellcode/shellcode_arm أو shellcode_amd64
│ تشغيل send_cmd.py (انتظار الاستدعاء)
│ تشغيل مستقبل الإعدادات على :9999
│ تشغيل exp_*.py المختار
│
└─ إذا كان العميل من نوع "Node /s.js" (معظم عائلة B + كثير من عائلة A)
تقديم s.js عبر HTTP
تشغيل مستقبل الإعدادات على :9999
تشغيل exp_*.py المختار
→ جدار الحماية GET /s.js → eval → تسريب
خط الأنابيب في سطر واحد: تحديد → اختيار ملف الإزاحة → إفساد sslvpnd → سحب الحمولة → تسريب /data/config/*.gz → أرشفة في جانب المشغّل.
تلك الخطوة الأخيرة هي الهدف. الإصابة هي تنفيذ كود غير مصادق عليه في sslvpnd على جدار الحماية نفسه — مُنهي TLS، وسياسة التوجيه، وجلسات VPN، وغالباً روابط LDAP/RADIUS. لا يوفر FortiOS /bin/sh مفيداً. البحث العام وهذه الحزمة يمران عبر مساعد أوامر داخلي و/أو /bin/node، الذي يشحنه FortiOS فعلاً. تعامل مع الإصابة المؤكدة على أنها اختراق لحافة الشبكة، وليس تعطل خدمة. انظر What a hit means.
poc.py — المُطلِقواجهة المشغّل الأمامية (pocsuite3 POCBase). لا ينفذ CVE-2024-21762 أو CVE-2023-27997.
https://<target>/remote/login?lang=en (الاحتياط GB2312)./sslvpn/js/login.js?q=<md5>.VERSION_LIBS (182 صف hash,SKU,version). هذا الجدول هو سبب قدرة الحزمة على الاختيار بين أكثر من 50 جهازاً دون أن يسمي المشغّل الطراز. نفس طرازات المصفوفة، مدفوعة بتجزئة مورد SSL-VPN عام بدلاً من SNMP أو واجهة إدارة.exp/exp_<SKU>-v<version>.py.s.js → النوع 2 (مُحمّل Node)Shellcode Server → النوع 1 (stager)؛ ثم يبحث عن arm مقابل amd64 في السكربتexp_*.py عبر Popen مع وسائط المضيف/المنفذ/الاستدعاء.عنوان المشغّل الافتراضي في هذه النسخة: HOST_IP من البيئة، وإلا ATTACKER_HOST. تم استبدال عناوين IPv4 الحرفية في هذه الشجرة بتسميات أدوار (المنافذ دون تغيير):