
# Docker-आधारित CTF लैब जो CVE-2024-4577 PHP-CGI आर्गुमेंट इंजेक्शन को प्रदर्शित करता है, जिससे RCE होता है। इसमें कमजोर PHP 5.4.1 CGI, एक्सप्लॉइट स्क्रिप्ट्स और फ्लैग प्राप्ति शामिल है।
एक स्व-निहित, शुरू से बनाया गया Docker lab जो CVE-2024-4577 के पीछे के वास्तविक
तर्क-इंजेक्शन → रिमोट कोड निष्पादन प्राइमिटिव को प्रदर्शित करता है।
इसे http://localhost:8080 पर एक्सप्लॉइट करें, शेल प्राप्त करें, और कंटेनर के अंदर से
फ्लैग पढ़ें।
यह एक वास्तविक कमजोरी है, सिम्युलेटेड नहीं। कंटेनर एक अनपैच्ड PHP 5.4.1 CGI बाइनरी को कंपाइल करता है और इसे Apache के पीछे ठीक उसी तरह वायर करता है जैसे वास्तविक कमजोर होस्ट कॉन्फ़िगर किए जाते हैं। कहीं भी कोई नकली "if password == flag" चेक नहीं है — फ्लैग पाने का एकमात्र तरीका वास्तव में कोड निष्पादन प्राप्त करना है।
CVE-2024-4577 का सिग्नेचर पेलोड %AD (एक सॉफ्ट हाइफ़न) का उपयोग करता है। यह ट्रिक
केवल Windows पर काम करती है, क्योंकि Windows की "बेस्ट-फिट" कैरेक्टर एन्कोडिंग
बाइट 0xAD को वास्तविक - (0x2D) में बदल देती है PHP के CVE-2012-1823
पैच द्वारा क्वेरी स्ट्रिंग की जाँच करने के बाद। यह एन्कोडिंग रूपांतरण Windows द्वारा ही
किया जाता है — यह सामान्य Linux Docker कंटेनर के अंदर नहीं होता।
इसलिए, एक वफादार, आपकी मशीन पर चलने योग्य Linux lab ठीक वही RCE प्राइमिटिव
पुनरुत्पादित करता है — URL के माध्यम से php-cgi विकल्प इंजेक्शन → -d auto_prepend_file=php://input → कोड निष्पादन — शाब्दिक - फॉर्म का उपयोग करके
(जो CVE-2024-4577 का मूल बग, CVE-2012-1823 है)। वास्तविक Windows CVE-2024-4577
लक्ष्य से एकमात्र अंतर %AD→- एन्कोडिंग-बायपास परत है, जिसे यह README पूर्ण रूप से
दस्तावेज़ित करता है (देखें यह कैसे काम करता है
और poc.http)।
| यह Linux lab | वास्तविक CVE-2024-4577 (Windows) | |
|---|---|---|
| कमजोर घटक | php-cgi | php-cgi |
| RCE प्राइमिटिव | -d auto_prepend_file=php://input | समान |
| URL में डिलीमीटर | शाब्दिक - | %AD (बेस्ट-फिट → -) |
| 2012 पैच को बायपास करता है? | N/A (PHP पैच से पहले का है) | हाँ, Windows बेस्ट-फिट के माध्यम से |
| Win 11 Home + Docker Desktop पर चलता है | ✅ | ❌ (Windows कंटेनर चाहिए) |
यदि आपको विशेष रूप से बिट-दर-बिट Windows %AD पुनरुत्पादन की आवश्यकता है, तो आपको
Windows-कंटेनर-सक्षम Docker होस्ट (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 हार्डनिंग से फिसल जाता है और हमलावर को
मनमाने PHP INI निर्देश सेट करने देता है — सबसे उपयोगी रूप से
auto_prepend_file=php://input के साथ allow_url_include=1, जो हमलावर द्वारा आपूर्ति
किए गए अनुरोध बॉडी को PHP के रूप में निष्पादित करता है। परिणाम: अप्रमाणित रिमोट कोड
निष्पादन। इसे दिनों के भीतर जंगली में हथियार बना दिया गया (जैसे TellYouThePass
रैंसमवेयर)।
CGI क्वेरी स्ट्रिंग को argv के रूप में पास करता है। RFC 3875 के अनुसार, यदि CGI अनुरोध की
क्वेरी स्ट्रिंग में कोई अनएन्कोडेड = नहीं है, तो सर्वर इसे + पर विभाजित करता है,
प्रत्येक शब्द को URL-डिकोड करता है, और शब्दों को CGI प्रोग्राम को कमांड-लाइन तर्क के रूप में
पास करता है। इसलिए php-cgi हमलावर-नियंत्रित argv प्राप्त करता है।
php-cgi उन argv को विकल्पों के रूप में पार्स करता है। ऐतिहासिक रूप से php-cgi उस argv से
-d key=value, -T, आदि की व्याख्या करेगा। -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 lab में, चरण 1–2 को एक php-cgi के साथ ठीक से पुनरुत्पादित किया गया है जो चरण 3 के पैच से पहले का है, इसलिए शाब्दिक
-फॉर्म काम करता है और समान RCE प्रदर्शित करता है। चरण 4 केवल Windows-विशिष्ट परत है, दस्तावेज़ित लेकिन निष्पादित नहीं (Linux में कोई बेस्ट-फिट रूपांतरण नहीं है)।
8.3.8, 8.2.20, 8.1.29 में फिक्स किया गया। इसलिए कमजोर:
शर्तें: Windows OS; PHP CGI के रूप में चल रहा है या php-cgi.exe उजागर है
(डिफ़ॉल्ट XAMPP on Windows कॉन्फ़िगरेशन कमजोर है); बेस्ट-फिट पथ के लिए एक प्रभावित
लोकेल। (मूल बग CVE-2012-1823 — वह प्राइमिटिव जो यह lab चलाता है — किसी भी OS को प्रभावित
करता है जो इस कॉन्फ़िगरेशन में पूर्व-2012-फिक्स php-cgi चला रहा है।)
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** (Windows/macOS) या Docker Engine (Linux)।
Windows 11 Home: **WSL 2** बैकएंड (डिफ़ॉल्ट) के साथ Docker Desktop इंस्टॉल करें।
→ https://www.docker.com/products/docker-desktop/
- शोषण के लिए `curl` (`curl.exe` Windows 10/11 में अंतर्निहित है; यह
Git Bash / WSL / macOS / Linux में भी उपलब्ध है)।
- **बिल्ड के दौरान** इंटरनेट एक्सेस (PHP 5.4.1 स्रोत डाउनलोड करता है)।
## 6. बिल्ड निर्देश
`cve-2024-4577-lab/` फ़ोल्डर में एक टर्मिनल खोलें।
### विकल्प A — docker compose (अनुशंसित)```bash
docker compose up --build -d
docker build कमांड:```bash docker build -t cve-2024-4577-lab .
**docker run कमांड:**```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