
# مختبر CTF قائم على Docker يوضح ثغرة CVE-2024-4577 في حقن وسائط PHP-CGI المؤدية إلى تنفيذ الأوامر عن بُعد (RCE). يتضمن إصدار PHP 5.4.1 CGI الضعيف، ونصوص استغلال، واسترجاع العلم.
مختبر Docker من الصفر ومتكامل بذاته يوضح الآلية الحقيقية لحقن الوسائط ← تنفيذ الأوامر عن بُعد الكامنة وراء CVE-2024-4577.
استغله عبر http://localhost:8080، افتح شل، واقرأ العلم من داخل الحاوية.
هذه ثغرة حقيقية، وليست محاكاة. تقوم الحاوية بترجمة ثنائي PHP 5.4.1 CGI غير مُصَحَّح وتربطه خلف Apache بنفس الطريقة التي تُهيَّأ بها الأنظمة الحقيقية المعرضة للخطر. لا يوجد أي فحص وهمي مثل "if password == flag" في أي مكان — الطريقة الوحيدة للحصول على العلم هي تحقيق تنفيذ الأوامر فعليًا.
الحمولة المميزة لـ CVE-2024-4577 تستخدم %AD (واصلة ناعمة). هذه الحيلة تعمل فقط على Windows، لأن "ترميز الأحرف الأفضل ملاءمة" في Windows يحوّل البايت 0xAD إلى - حقيقية (0x2D) بعد أن يكون تصحيح CVE-2012-1823 في PHP قد فحص سلسلة الاستعلام بالفعل. هذا التحويل الترميزي يتم بواسطة Windows نفسه — ولا يحدث داخل حاوية Docker Linux عادية.
لذا، فإن مختبر Linux القابل للتشغيل على جهازك يعيد إنتاج نفس آلية RCE تمامًا — حقن خيارات php-cgi عبر الرابط ← -d auto_prepend_file=php://input ← تنفيذ الأوامر — باستخدام صيغة - الحرفية (وهي الثغرة الأم لـ CVE-2024-4577، وهي CVE-2012-1823). الاختلاف الوحيد عن هدف CVE-2024-4577 الحقيقي على Windows هو طبقة تجاوز الترميز %AD←-، والتي توثقها هذه الوثيقة بالكامل (انظر كيف تعمل الاستغلال وpoc.http).
| هذا المختبر على Linux | CVE-2024-4577 الحقيقي (Windows) | |
|---|---|---|
| المكوّن المعرض للخطر | php-cgi | php-cgi |
| آلية RCE | -d auto_prepend_file=php://input | مطابق |
| الفاصل في الرابط | - حرفية | %AD (أفضل ملاءمة ← -) |
| يتجاوز تصحيح 2012؟ | غير قابل للتطبيق (PHP أقدم من التصحيح) | نعم، عبر أفضل ملاءمة في Windows |
| يعمل على Win 11 Home + Docker Desktop | ✅ | ❌ (يتطلب حاويات Windows) |
إذا كنت تحتاج تحديدًا إلى إعادة إنتاج %AD الحرفية على Windows، فستحتاج إلى مضيف Docker يدعم حاويات Windows (Windows Server / Win Pro + Hyper-V) — لن يعمل على Windows 11 Home. حمولة Windows مضمّنة في poc.http كمرجع.
CVE-2024-4577 — حقن وسائط PHP CGI يؤدي إلى تنفيذ الأوامر عن بُعد. اكتُشفت بواسطة DEVCORE (Orange Tsai / Angelboy)، وأُفصح عنها في 2024-06-06.
عند نشر PHP في وضع CGI (أو كان ثنائي php-cgi.exe قابلًا للوصول بطريقة أخرى) على Windows مع بعض الإعدادات المحلية للنظام (الصينية التقليدية/المبسطة، اليابانية، وغيرها)، يمرر خادم الويب سلسلة استعلام HTTP إلى php-cgi كوسائط سطر أوامر. يمكن للمهاجم تهريب خيارات سطر أوامر php-cgi (-d ...) إلى تلك السلسلة. تحويل الأفضل ملاءمة لصفحة الرموز في Windows يحوّل البايت 0xAD (%AD) إلى واصلة ASCII -، مما يتجاوز تحصين CVE-2012-1823 ويسمح للمهاجم بتعيين توجيهات INI عشوائية في PHP — الأكثر فائدةً هو auto_prepend_file=php://input مع allow_url_include=1، مما ينفّذ نص الطلب المقدم من المهاجم كـ PHP. النتيجة: تنفيذ أوامر عن بُعد بدون مصادقة. تم تسليحها في البرية خلال أيام (مثل برمجية الفدية TellYouThePass).
CGI يمرر سلسلة الاستعلام كـ argv. وفقًا لـ RFC 3875، إذا كانت سلسلة استعلام طلب CGI لا تحتوي على = غير مشفّر، يقسمها الخادم على +، ويفك ترميز كل كلمة، ويمرر الكلمات إلى برنامج CGI كوسائط سطر أوامر. لذلك يتلقى php-cgi argv يتحكم فيه المهاجم.
php-cgi يحلل تلك argv كخيارات. تاريخيًا، كان php-cgi يفسر -d key=value، -T، إلخ من تلك argv. إدخال -d allow_url_include=1 -d auto_prepend_file=php://input يجعل PHP ينفّذ نص الطلب ككود ← CVE-2012-1823.
إصلاح CVE-2012-1823 غير مكتمل على Windows. أضاف تصحيح 2012 حارسًا في sapi/cgi/cgi_main.c: تقريبًا "إذا بدأت سلسلة الاستعلام (الخام) بـ - ولا تحتوي على =، فتخطَّ تحليل الخيارات (skip_getopt)." المهاجم الذي يرسل - حرفية أصبح محظورًا الآن.
ترميز أفضل ملاءمة يهزم الحارس (ثغرة 2024). على Windows، يحوّل PHP سطر الأوامر باستخدام صفحة رموز الإعداد المحلي مع تفعيل الأفضل ملاءمة. يرسل المهاجم %AD (البايت 0xAD، واصلة ناعمة). في لحظة فحص الحارس، البايت الأول هو 0xAD، وليس -، لذا لا يتم تعيين skip_getopt. لاحقًا، عندما يبني PHP فعليًا argv، يقوم Windows بتعيين 0xAD ← - عبر أفضل ملاءمة، لذا يرى getopt الآن -d. يحدث حقن الخيارات بعد الفحص الذي كان من المفترض أن يوقفه. هذا الترتيب (فحص ثم تحويل) هو الثغرة بأكملها.
في هذا المختبر على Linux، يتم إعادة إنتاج الخطوات 1–2 بالضبط مع php-cgi أقدم من تصحيح الخطوة 3، لذا تعمل صيغة
-الحرفية وتوضح نفس RCE. الخطوة 4 هي طبقة خاصة بـ Windows فقط، موثقة لكن غير منفذة (لا يوجد تحويل أفضل ملاءمة في Linux).
أُصلحت في 8.3.8، 8.2.20، 8.1.29. لذلك المعرضة للخطر:
الشروط: نظام تشغيل Windows؛ PHP يعمل كـ CGI أو php-cgi.exe مكشوف (إعداد XAMPP الافتراضي على Windows معرض للخطر)؛ إعداد محلي متأثر لمسار أفضل ملاءمة. (الثغرة الأم CVE-2012-1823 — الآلية التي يشغّلها هذا المختبر — تؤثر على أي نظام تشغيل يشغّل php-cgi قبل إصلاح 2012 في هذا التكوين.)
cve-2024-4577-lab/ ├── Dockerfile # builds the lab: compiles unpatched PHP 5.4.1 CGI + Apache ├── Dockerfile.vulhub # fallback: prebuilt vulnerable base image (if compile fails) ├── docker-compose.yml # one-command build+run, maps localhost:8080 -> 80 ├── start.sh # container entrypoint (Apache foreground) ├── exploit.sh # one-shot RCE PoC (bash + curl) ├── poc.http # raw HTTP requests (Linux payload + real Windows %AD payload) ├── app/ │ └── index.php # ordinary web page (NOT itself vulnerable) ├── config/ │ ├── apache-vhost.conf # the vulnerable Apache <-> php-cgi wiring │ └── php.ini # minimal php.ini (cgi.force_redirect=0, etc.) ├── flag.txt # the flag (copied to /flag.txt in the container) └── README.md # this file
## 5. المتطلبات الأساسية
- **Docker Desktop** (ويندوز/ماك) أو Docker Engine (لينكس).
ويندوز 11 Home: قم بتثبيت Docker Desktop مع خلفية **WSL 2** (الافتراضية).
→ https://www.docker.com/products/docker-desktop/
- `curl` للاستغلال (`curl.exe` مدمج في ويندوز 10/11؛ متوفر أيضًا في
Git Bash / WSL / ماك / لينكس).
- اتصال بالإنترنت **أثناء البناء** (يقوم بتنزيل كود مصدر PHP 5.4.1).
## 6. تعليمات البناء
افتح طرفية في مجلد `cve-2024-4577-lab/`.
### الخيار أ — docker compose (موصى به)```bash
docker compose up --build -d
أمر docker build:```bash docker build -t cve-2024-4577-lab .
**أمر تشغيل docker:**```bash
docker run --rm -d -p 8080:80 --name cve-2024-4577-lab cve-2024-4577-lab
يستغرق البناء تجميع PHP من المصدر (حوالي 2–5 دقائق في المرة الأولى). إذا فشل على جهازك (وضع عدم الاتصال، عدم وجود سلسلة أدوات، حظر museum.php.net)، فاستخدم صورة الأساس الاحتياطية:
docker build -f Dockerfile.vulhub -t cve-2024-4577-lab . docker run --rm -d -p 8080:80 --name cve-2024-4577-lab cve-2024-4577-lab
curl -s http://localhost:8080/ | head -n 20
يجب أن ترى HTML الخاص بـ **بوابة الحالة الداخلية لـ ACME**، والأهم من ذلك:```
<li>PHP version: <code>5.4.1</code></li>
<li>SAPI: <code>cgi-fcgi</code></li>
SAPI: cgi-fcgi (أي يتم تقديمه عبر php-cgi) يؤكد أن المكوّن القابل للاستغلال موجود في مسار الطلب. تحقق أيضًا من السجلات:```bash
docker logs cve-2024-4577-lab
## 8. خطوات الاستغلال
سلسلة الاستعلام المحقونة (مشفّرة بنظام URL بحيث لا يرى Apache أي **`=` حرفي** وبالتالي
يتعامل معها كوسائط CGI argv):```
?-d+allow_url_include%3d1+-d+auto_prepend_file%3dphp://input
التي يحللها php-cgi على النحو التالي:``` -d allow_url_include=1 -d auto_prepend_file=php://input
المحتوى **request body** يصبح مصدر PHP (يُقرأ عبر `php://input`) ويُشغَّل
*قبل* `index.php`.