
PHP2Shell एक्सपोज़र हंटिंग और संबंधित विश्लेषण के लिए रिपॉज़िटरी
PHP2Shell (CVE-2026-109618 / CVE-2026-109619) के लिए Defender XDR एक्सपोज़र हंटिंग।
v3.3 · 22 अक्टूबर 2026
उद्देश्य: ऐसे ऑनबोर्ड किए गए डिवाइस खोजें जो सक्रिय रूप से PHP चला रहे हैं और जो PHP2Shell के संपर्क में आ सकते हैं।
दायरा: Defender XDR Advanced Hunting · ऑनबोर्ड किए गए Windows और Linux एंडपॉइंट · डिफ़ॉल्ट रूप से 30-दिन का लुकबैक · केवल सक्रिय PHP। शामिल नहीं: निष्क्रिय इंस्टॉल और अनमैनेज्ड डिवाइस। Sentinel में नहीं चलाया जा सकता, क्योंकि इंस्टॉल किए गए सॉफ़्टवेयर (TVM) तालिका केवल Defender XDR में क्वेरी की जा सकती है।
| हंट | Windows | Linux | प्रश्न |
|---|---|---|---|
| 1 | windows/01-any-php.kql | linux/01-any-php.kql | कोई PHP? प्रति डिवाइस हाँ/नहीं। |
| 2 | windows/02-evidence-breakout.kql | linux/02-evidence-breakout.kql | संस्करणों के साथ साक्ष्य ब्रेकआउट। |
| 3 | windows/03-safety-net.kql | linux/03-safety-net.kql | सेफ़्टी नेट: वेब पोर्ट पर सेवा देने वाले डिवाइस, लिसनिंग प्रोसेस, और PHP स्थिति। |
सभी इवेंट जाँचें एक ही लुकबैक विंडो का उपयोग करती हैं, प्रत्येक हंट के शीर्ष पर let Lookback = 30d;। IP पते पिछले 7 दिनों में प्रति एडाप्टर की नवीनतम रिपोर्ट से आते हैं। इंस्टॉल किया गया सॉफ़्टवेयर वर्तमान TVM स्नैपशॉट है। केवल ऑनबोर्ड किए गए एंडपॉइंट की जाँच की जाती है (OnboardingStatus == "Onboarded", DeviceCategory == "Endpoint")।
एक डिवाइस को PHP देखा गया माना जाता है यदि इनमें से कोई एक भी मेल खाता है।
नाम कैसे मिलाए जाते हैं:
^…$) है, इसलिए इसे पूरे फ़ाइल नाम से मेल खाना चाहिए, कभी भी उसके किसी भाग से नहीं।startswith "php", साथ ही दोनों OSes पर frankenphp और Linux पर lsphp। फिर रेगेक्स केवल बचे हुए नामों पर चलता है।php9.dll) स्वचालित रूप से मेल खाती हैं।patterns.test.js प्रत्येक रेगेक्स को इन उदाहरणों के विरुद्ध चलाता है। यदि आप कोई रेगेक्स बदलते हैं, तो वहाँ के उदाहरण अपडेट करें।Windows
| जाँच | तालिका | मेल खाता है | यह क्यों मायने रखता है |
|---|---|---|---|
| PHP एक्ज़ीक्यूटेबल्स शुरू हुए | DeviceProcessEvents | रेगेक्स ^(php(-cgi|-win)?|frankenphp)\.exe$, जो ठीक चार नामों की अनुमति देता है: php.exe (CLI), php-cgi.exe (FastCGI वर्कर), php-win.exe (CLI, बिना कंसोल), frankenphp.exe (वेब सर्वर में एम्बेडेड PHP)। phpstorm64.exe और अन्य php* टूल मेल नहीं खाते | सिद्ध करता है कि PHP चला। हंट 2 बाइनरी की संस्करण जानकारी (ProcessVersionInfoProductVersion) से संस्करण दिखाता है |
| PHP इंजन DLLs लोड हुए | DeviceImageLoadEvents | रेगेक्स ^php\d*(ts|isapi|apache[\w_]*)?\.dll$: php, कोई भी संस्करण संख्या, एक वैकल्पिक ts / isapi / apache… सफ़िक्स, फिर .dll। उदाहरण नीचे DLL तालिका में हैं। एक्सटेंशन DLLs (php_curl.dll और अन्य php_*.dll) मेल नहीं खाते, क्योंकि php के ठीक बाद अंडरस्कोर की अनुमति नहीं है | किसी अन्य प्रोसेस, जैसे IIS या Apache, के अंदर चल रहे PHP को देखने का यही एकमात्र तरीका है, जहाँ कोई php*.exe शुरू नहीं होता। हंट 2 DLL और उसे लोड करने वाली प्रोसेस दिखाता है |
| इंस्टॉल किया गया सॉफ़्टवेयर | DeviceTvmSoftwareInventory | रेगेक्स नहीं: SoftwareName has "php" (नाम में php एक पूरे शब्द के रूप में) या SoftwareVendor =~ "php" (सटीक, केस-असंवेदनशील) | पंजीकृत इंस्टॉल को पकड़ता है। Zip इंस्टॉल (Windows का सामान्य तरीका) आमतौर पर पंजीकृत नहीं होते |
Windows पैटर्न जिन PHP इंजन DLLs से मेल खाता है, उनके उदाहरण
| DLL | यह क्या है | विशिष्ट होस्ट प्रक्रिया (hunt 2 में दिखाई गई) |
|---|---|---|
php8.dll, php7.dll | इंजन, नॉन-थ्रेड-सेफ बिल्ड | php-cgi.exe (IIS, nginx या Apache mod_fcgid के अंतर्गत FastCGI), php.exe |
php8ts.dll, php7ts.dll, php5ts.dll | इंजन, थ्रेड-सेफ बिल्ड | httpd.exe (Apache मॉड्यूल), php.exe |
php8apache2_4.dll, php7apache2_4.dll, php5apache2_2.dll | Apache मॉड्यूल लोडर | httpd.exe |
php5isapi.dll | लीगेसी IIS ISAPI मॉड्यूल (PHP 5.2 और पहले, असमर्थित) | w3wp.exe |
तालिका सामान्य नामों को सूचीबद्ध करती है, अनुमति-सूची नहीं: पैटर्न से मेल खाने वाला कोई भी नाम मेल खाता है। DLL नाम केवल प्रमुख संस्करण देता है। सटीक संस्करण उसी डिवाइस पर php-cgi.exe या php.exe प्रक्रिया पंक्ति से, या इंस्टॉल किए गए सॉफ़्टवेयर से आता है।
Linux
| जाँच | तालिका | मेल | यह क्यों मायने रखता है |
|---|---|---|---|
| PHP बाइनरी प्रारंभ हुईं | DeviceProcessEvents | Regex ^(php[\d.]*|php-(fpm|cgi)[\d.]*|lsphp[\d.]*|frankenphp)$: php, php-fpm, php-cgi या lsphp (LiteSpeed), प्रत्येक में अंकों और बिंदुओं से बना वैकल्पिक संस्करण, साथ ही frankenphp। उदाहरण: php, php8.3, php83, php-fpm8.3, php-cgi8.2, lsphp83। phpunit, phpize और php-config जैसे टूल मेल नहीं खाते, क्योंकि आधार नाम के बाद केवल अंक और बिंदु ही आ सकते हैं | सिद्ध करता है कि PHP चला। Hunt 2 एक major.minor संकेत दिखाता है, जो नाम, पथ या कमांड लाइन से दूसरे regex, php-?(?:fpm|cgi)?/?(\d+\.\d+) द्वारा निकाला जाता है (उदाहरण के लिए php-fpm8.3 या /etc/php/8.3/ से 8.3.x मिलता है) |
| इंस्टॉल किए गए पैकेज | DeviceTvmSoftwareInventory | Regex नहीं: SoftwareName contains "php" (सबस्ट्रिंग, इसलिए php8.3-fpm और libapache2-mod-php8.3 जैसे संस्करणयुक्त नाम मेल खाते हैं) या SoftwareVendor =~ "php" | Apache mod_php और विंडो से पहले से चल रहे php-fpm के लिए एकमात्र जाँच: Linux में यहाँ कोई लाइब्रेरी-लोड जाँच नहीं है, और फोर्क किए गए php-fpm वर्कर प्रक्रिया प्रारंभ नहीं बनाते |
| जाँच | तालिका | मेल | यह क्यों मायने रखता है |
|---|---|---|---|
| सक्रिय वेब सर्विंग | DeviceNetworkEvents | पोर्ट की एक निश्चित सूची पर InboundConnectionAccepted: 80, 443, 8080, 8443। लूपबैक बाहर रखा गया है (RemoteIPType != "Loopback")। विशिष्ट और सार्वजनिक स्रोत, साथ ही स्वीकार करने वाली प्रक्रिया (via <process>) दिखाता है | सिद्ध करता है कि कोई डिवाइस सर्विंग कर रहा है, भले ही उसका वेब सर्वर लुकबैक विंडो से पहले शुरू हुआ हो। ntoskrnl.exe = HTTP.sys (IIS, ADFS, RD Gateway, Windows Admin Center, SSTP) |
| वेब सर्वर प्रारंभ हुआ | DeviceProcessEvents | Regex नहीं: सटीक नामों की एक निश्चित सूची, केस-असंवेदनशील (in~)। Windows: w3wp.exe, httpd.exe, nginx.exe, caddy.exe, lighttpd.exe, frankenphp.exe। Linux: httpd, apache2, nginx, lshttpd, litespeed, openlitespeed, caddy, lighttpd, frankenphp | विंडो में शुरू हुआ और कोई PHP लोड न करने वाला वेब सर्वर उच्च विश्वास के साथ "Not seen" देता है। Windows w3wp.exe कमांड लाइन से regex -ap\s+"?([^"\s]+) द्वारा निकाले गए IIS ऐप पूल नाम भी दिखाता है |
hunt 3 में PHP कॉलम मान
| मान | अर्थ |
|---|---|
PHP seen (see hunt 2) | कम से कम एक PHP डिटेक्शन जाँच मेल खाई। |
Not seen | कोई PHP साक्ष्य नहीं, और या तो विंडो में कोई वेब सर्वर शुरू हुआ (उच्च विश्वास) या डिवाइस वेब सर्विंग नहीं कर रहा। |
Not seen - no web server start in <N>d (N = Lookback) | वेब पोर्ट पर सर्विंग, लेकिन निरीक्षण के लिए कोई वेब-सर्वर प्रक्रिया प्रारंभ नहीं। यह अवशिष्ट ब्लाइंड स्पॉट है: होस्ट पर via प्रक्रिया की जाँच करें। |