
# पावरशेल मूल्यांकन स्क्रिप्ट विंडोज़ सिस्टम में CVE-2025-47981 (SPNEGO NEGOEX हीप ओवरफ्लो) की जांच करने वाली पावरशेल स्क्रिप्ट, जो कर्नेल संस्करण, PKU2U रजिस्ट्री कुंजी और उजागर SPNEGO पोर्ट्स की पुष्टि करती है। सुधार के चरण और पहचान संबंधी मार्गदर्शन प्रदान करती है।
प्रकार: भेद्यता आकलन — पहचान / अनुपालन जाँच CVE: CVE-2025-47981 CVSS: 9.8 क्रिटिकल (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H) CWE: CWE-122 — हीप-आधारित बफर ओवरफ्लो उपनाम: "SPNEGO Nightmare" / "Windows Authentication Wormable RCE" पैच: KB5062560 | जुलाई 2025 पैच मंगलवार
PowerShell आकलन स्क्रिप्ट जो जाँचती है कि क्या कोई Windows सिस्टम CVE-2025-47981 के प्रति संवेदनशील है — SPNEGO Extended Negotiation (NEGOEX) तंत्र में हीप-आधारित बफर ओवरफ्लो जो बिना प्रमाणीकरण के RCE की अनुमति देता है। एक्सप्लॉइट निष्पादित नहीं करता — केवल एक्सपोज़र और पैच स्थिति का मूल्यांकन करता है।
Developed by: HKK$ cat ./vulnerability_summary.txtCVE-2025-47981 NEGOEX प्रोटोकॉल में एक हीप-आधारित बफर ओवरफ्लो है — Windows के SPNEGO प्रमाणीकरण तंत्र की आंतरिक एक्सटेंशन परत। यह भेद्यता गैर-प्रमाणित हमलावरों को मनमाना दूरस्थ कोड निष्पादित करने की अनुमति देती है, संभावित रूप से सिस्टम पर पूर्ण नियंत्रण प्राप्त कर लेती है।
विश्लेषकों ने पहले ही CVE को "एक महत्वपूर्ण समस्या बनने की दुर्भाग्यपूर्ण विशेषताओं" वाला बताया है, जिसमें wormable क्षमता है — उपयोगकर्ता के इंटरैक्शन के बिना संवेदनशील सिस्टम के बीच स्वचालित रूप से प्रसारित होने में सक्षम।
यह भेद्यता Windows 10 (संस्करण 1607 और उससे आगे) और Windows Server 2008 R2 से Server 2025 तक सभी को प्रभावित करती है, जिसमें Server Core वेरिएंट भी शामिल हैं — x64, x86 और ARM64 आर्किटेक्चर पर 33 से अधिक विभिन्न Windows और Server कॉन्फ़िगरेशन संवेदनशील पुष्टि किए गए हैं।
$ cat ./technical_background.txtSPNEGO (Simple and Protected GSSAPI Negotiation Mechanism) प्रमाणीकरण हैंडशेक परत है जिसे Windows प्रत्येक प्रमाणित सत्र से पहले उपयोग करता है। एप्लिकेशन को अक्सर एक प्रोटोकॉल तय किए बिना प्रमाणीकरण की आवश्यकता होती है — Windows एक वातावरण में Kerberos, दूसरे में NTLM, या एक अलग ट्रस्ट मॉडल में एक विस्तारित प्रमाणीकरण तंत्र का उपयोग कर सकता है। SPNEGO वह नेगोशिएशन तंत्र है जो तय करता है कि कौन सा प्रमाणीकरण प्रोटोकॉल उपयोग करना है।
क्लाइंट सर्वर
│ │
│──── SPNEGO Negotiation ────────►│
│ MechTypeList: │
│ [Kerberos, NTLM, NEGOEX] │
│ │
│◄─── Selected Mechanism ─────────│
│ │
│──── Auth Exchange ─────────────►│ ← यहाँ NEGOEX में ओवरफ्लो
NEGOEX SPNEGO के भीतर एक्सटेंशन तंत्र है — यह PKU2U (पीयर-टू-पीयर) प्रमाणीकरण और अन्य कस्टम तंत्रों को नेगोशिएट करने की अनुमति देता है। यह भेद्यता ntoskrnl!SpnegoHandleExtended फ़ंक्शन में है, जो कई फ़्रैगमेंट में भेजे गए अत्यधिक बड़े SPNEGO_TOKEN संरचनाओं को प्रोसेस करता है, जिससे कर्नेल के हीप में ओवरफ्लो होता है।
जोखिम उन सिस्टमों पर अधिक है जहाँ Group Policy "Network security: Allow PKU2U authentication requests to this computer to use online identities" सक्षम है। यह कॉन्फ़िगरेशन, जो कई Windows डिप्लॉयमेंट में डिफ़ॉल्ट रूप से सक्षम है, पीयर-टू-पीयर प्रमाणीकरण की अनुमति देकर NEGOEX की हमले की सतह को बढ़ाता है जो उन एंडपॉइंट्स पर संवेदनशील NEGOEX कोड पथ को सक्रिय करता है जो अन्यथा इसे एक्सपोज़ नहीं करते।
$ cat ./architecture.txt┌─────────────────────────────────────────────────────────────────────────┐
│ CVE-2025-47981 ASSESSMENT SCRIPT — FLOW │
│ │
│ ┌──────────────────────────────────────────────────────────────────┐ │
│ │ CHECK 1: Windows Version │ │
│ │ Get-CimInstance Win32_OperatingSystem → .Version │ │
│ │ संदर्भ: पैच के साथ सहसंबंध के लिए सटीक बिल्ड की पहचान करता है │ │
│ └──────────────────────────────────────────────────────────────────┘ │
│ │ │
│ ┌──────────────────────────────────────────────────────────────────┐ │
│ │ CHECK 2: ntoskrnl.exe Version │ │
│ │ Get-Item C:\Windows\System32\ntoskrnl.exe │ │
│ │ तुलना: स्थापित < 10.0.14393.8246 → संवेदनशील │ │
│ │ तुलना: स्थापित ≥ 10.0.14393.8246 → KB5062560 लागू │ │
│ └──────────────────────────────────────────────────────────────────┘ │
│ │ │
│ ┌──────────────────────────────────────────────────────────────────┐ │
│ │ CHECK 3: PKU2U Registry Key │ │
│ │ HKLM:\SYSTEM\...\Lsa\pku2u\AllowOnlineID │ │
│ │ 1 → PKU2U सक्षम → हमले की सतह बढ़ी हुई │ │
│ │ 0 → PKU2U अक्षम → PKU2U वेक्टर कम हुआ │ │
│ │ मौजूद नहीं → डिफ़ॉल्ट कॉन्फ़िगरेशन (GPO के माध्यम से मूल्यांकन) │ │
│ └──────────────────────────────────────────────────────────────────┘ │
│ │ │
│ ┌──────────────────────────────────────────────────────────────────┐ │
│ │ CHECK 4: एक्सपोज़्ड SPNEGO पोर्ट्स │ │
│ │ Get-NetTCPConnection → 135, 445, 5985, 3389, 80, 443, 25 │ │
│ │ प्रत्येक खुला पोर्ट = एक्सप्लॉइट डिलीवरी वेक्टर │ │
│ └──────────────────────────────────────────────────────────────────┘ │
│ │ │
│ Format-Table -AutoSize │
│ (पेंटेस्ट रिपोर्ट के लिए पठनीय आउटपुट) │
└─────────────────────────────────────────────────────────────────────────┘
$ cat ./design_decisions.mdntoskrnl.exe के माध्यम से संस्करण जाँच$kernelPath = [System.IO.Path]::Combine($env:SystemRoot, "System32\ntoskrnl.exe")
$requiredVersion = "10.0.14393.8246"
$installedVersion = (Get-Item $kernelPath).VersionInfo.FileVersion
if ([version]$installedVersion -lt [version]$requiredVersion) {
"Vulnerável - Patch ausente ($missingKB)"
}
ntoskrnl.exe क्यों और Get-HotFix क्यों नहीं?
Get-HotFix स्थापित KBs को सूचीबद्ध करता है, लेकिन इसकी ज्ञात सीमाएँ हैं:
DISM या Windows Update के माध्यम से साइलेंट मोड में लागू KBs का पता नहीं लगाताntoskrnl.exe के संस्करण की सीधे जाँच करना अधिक विश्वसनीय है — फ़ाइल केवल तभी पैच किया गया संस्करण प्राप्त करती है जब KB प्रभावी रूप से लागू किया गया हो और सिस्टम पुनः प्रारंभ किया गया हो। रीबूट लंबित KB वाले सिस्टम में अभी भी मेमोरी में पुराना कर्नेल संस्करण होगा।
[version] कास्ट: PowerShell डिफ़ॉल्ट रूप से स्ट्रिंग्स की लेक्सिकोग्राफ़िक रूप से तुलना करता है — "10.0.14393.8246" -lt "10.0.14393.800" $false (गलत) होगा। [version] में कास्ट प्रति-ऑक्टेट सही संख्यात्मक तुलना सुनिश्चित करता है।
[System.IO.Path]::Combine($env:SystemRoot, ...): हार्डकोडेड C:\Windows के बजाय SystemRoot का उपयोग करता है — विभिन्न ड्राइव पर Windows स्थापित सिस्टमों के लिए पोर्टेबल।
10.0.14393.824610.0.14393.xxxx → Windows 10 संस्करण 1607 / Windows Server 2016
│
└─ 8246 = KB5062560 लागू के साथ बिल्ड
यह विशिष्ट बिल्ड क्यों?
Windows Server 2016 (आधार बिल्ड 14393) पैच के लिए सबसे महत्वपूर्ण वातावरणों में से एक है — DCs, फ़ाइल सर्वर और कॉर्पोरेट आंतरिक सेवाओं में व्यापक रूप से उपयोग किया जाता है। संस्करण 8246 KB5062560 (जुलाई 2025) लागू करने के बाद कर्नेल के बिल्ड से मेल खाता है।
अन्य ऑपरेटिंग सिस्टमों के लिए, आवश्यक न्यूनतम बिल्ड संख्या अलग है — स्क्रिप्ट को प्रति-OS संस्करणों की तालिका के साथ विस्तारित किया जा सकता है।
AllowOnlineID$regPath = "HKLM:\SYSTEM\CurrentControlSet\Control\Lsa\pku2u"
$regName = "AllowOnlineID"
यह कुंजी क्या नियंत्रित करती है?
यह भेद्यता मुख्य रूप से उन सिस्टमों को प्रभावित करती है जहाँ Group Policy "Allow PKU2U authentication requests to this computer to use online identities" डिफ़ॉल्ट रूप से सक्षम है, जो Windows 10 संस्करण 1607 और उससे आगे के लिए मामला है।
AllowOnlineID कुंजी उस Group Policy का registry प्रतिनिधित्व है। जब सक्षम (= 1), सिस्टम PKU2U प्रमाणीकरण स्वीकार करता है — NEGOEX कोड पथ को सक्रिय करता है जिसमें ओवरफ्लो होता है।
| मान | स्थिति | जोखिम |
|---|---|---|
1 | PKU2U सक्षम | उच्च — NEGOEX वेक्टर सक्रिय |
0 | PKU2U अक्षम | निम्न — वेक्टर कम हुआ (पैच अभी भी आवश्यक) |
| मौजूद नहीं | सिस्टम डिफ़ॉल्ट | GPO पर निर्भर — gpresult /r के माध्यम से जाँचें |
-ErrorAction SilentlyContinue: कुंजी सभी सिस्टमों पर मौजूद नहीं हो सकती — स्क्रिप्ट त्रुटि उत्पन्न किए बिना अनुपस्थिति को शालीनता से संभालती है।
$ports = @(135, 445, 5985, 3389, 80, 443, 25)
हमलावर SMB (पोर्ट 445/TCP), RDP (पोर्ट 3389/TCP), HTTP/S (पोर्ट 80, 443/TCP) और SMTP (पोर्ट 25/TCP) जैसी संवेदनशील सेवाओं को दुर्भावनापूर्ण पैकेट भेजकर बिना प्रमाणीकरण के दूरस्थ रूप से दोष का शोषण कर सकते हैं जो SPNEGO प्रमाणीकरण का उपयोग करती हैं।
| पोर्ट | प्रोटोकॉल | SPNEGO किसके लिए उपयोग किया जाता है |
|---|---|---|
135 | RPC Endpoint Mapper | RPC प्रमाणीकरण नेगोशिएशन |
445 | SMB | फ़ाइल शेयर, नामित पाइप्स का प्रमाणीकरण |
5985 | WinRM (HTTP) | PowerShell रिमोटिंग, प्रबंधन |
3389 | RDP | Remote Desktop प्रमाणीकरण |
80 | HTTP | IIS Windows Authentication (Negotiate) |
443 | HTTPS | TLS के माध्यम से IIS Windows Authentication |
25 | SMTP | Exchange Extended Protection |
Get-NetTCPConnection -LocalPort $port जाँचता है कि पोर्ट स्थानीय सिस्टम पर LISTEN स्थिति में है या नहीं — प्रत्येक खुला पोर्ट एक्सप्लॉइट के लिए एक स्वतंत्र डिलीवरी वेक्टर का प्रतिनिधित्व करता है।
$ cat ./mitre_mapping.yml# हमलावर का दृष्टिकोण (स्क्रिप्ट क्या पता लगाती है/रोकती है)
tactic: Initial Access
- T1190 # Exploit Public-Facing Application
# बिना प्रमाणीकरण के SPNEGO हीप ओवरफ्लो के माध्यम से RCE
# वेक्टर: Negotiate auth वाला कोई भी पोर्ट (445, 5985, 3389...)
tactic: Execution
- T1203 # Exploitation for Client Execution
# ntoskrnl!SpnegoHandleExtended में हीप ओवरफ्लो
# कर्नेल हीप भ्रष्टाचार के माध्यम से RIP/EIP नियंत्रण
tactic: Lateral Movement
- T1210 # Exploitation of Remote Services
# Wormable: बिना क्रेडेंशियल्स के SMB/RPC के माध्यम से अन्य होस्ट्स का शोषण
- T1550.002 # Pass-the-Hash
# पोस्ट-RCE: SYSTEM एक्सेस LSASS हैश निष्कर्षण की अनुमति देता है
tactic: Privilege Escalation
- T1068 # Exploitation for Privilege Escalation
# कर्नेल संदर्भ में बफर ओवरफ्लो → तत्काल ring 0
# रक्षक का दृष्टिकोण (assessment स्क्रिप्ट क्या निष्पादित करती है)
tactic: Discovery (Blue Team)
- T1082 # System Information Discovery
# पैच मूल्यांकन के लिए OS और ntoskrnl.exe संस्करण एकत्र करता है
- T1012 # Query Registry
# HKLM:\...\pku2u\AllowOnlineID जाँचता है
- T1049 # System Network Connections Discovery
# एक्सपोज़्ड SPNEGO पोर्ट्स मैप करने के लिए Get-NetTCPConnection
$ cat ./detection_opportunities.md# NEGOEX प्रमाणीकरण विसंगति — अत्यधिक बड़े SPNEGO पैकेट
# स्रोत: Windows Security Event Log / ETW
EventID: 4625 (Logon Failure) SubStatus 0xC000006D के साथ
+ स्रोत: बाहरी होस्ट्स
+ आवृत्ति: उच्च (स्कैन/एक्सप्लॉइट प्रयास)
+ TargetUserName: ANONYMOUS LOGON या खाली
# विकल्प: Sysmon Event 3 (Network Connection)
EventID: 3
शर्त:
DestinationPort: 445 या 5985 या 135
Initiated: false (इनबाउंड कनेक्शन)
Image: System या lsass.exe
# असफल एक्सप्लॉइट के बाद कर्नेल क्रैश
# स्रोत: Windows Event Log → System
EventID: 1001 (BugCheck)
BugCheckCode: 0x00000050 (PAGE_FAULT_IN_NONPAGED_AREA)
या
BugCheckCode: 0x0000007E (SYSTEM_THREAD_EXCEPTION_NOT_HANDLED)
संदर्भ: ntoskrnl.exe में क्रैश → संभावित एक्सप्लॉइट प्रयास
# Snort/Suricata — अत्यधिक बड़ा SPNEGO टोकन (अवधारणात्मक)
alert tcp any any -> $HOME_NET [445,5985,3389] (
msg:"CVE-2025-47981 SPNEGO NEGOEX oversized token";
content:"|60|"; # SPNEGO OID मार्कर
content:"|a0|"; # MechTypeList मार्कर
dsize:>4096; # वैध टोकन शायद ही कभी 4KB से अधिक होते हैं
threshold:type both, track by_src, count 3, seconds 10;
sid:2025479810;
)
$ cat ./remediation.mdप्राथमिकता: क्रिटिकल — तत्काल पैच (CVSS 9.8, wormable)
1. पैच (मुख्य कार्रवाई):
Windows Update → KB5062560 (जुलाई 2025 पैच मंगलवार)
WSUS: सभी Windows 10 1607+ सिस्टमों के लिए KB5062560 अनुमोदित करें
पैच के बाद पुनः प्रारंभ करें — ntoskrnl.exe केवल रीबूट के बाद प्रतिस्थापित होता है
2. पोस्ट-पैच सत्यापन:
इस स्क्रिप्ट को फिर से चलाएँ
अपेक्षित परिणाम:
ntoskrnl.exe Installed Version: 10.0.14393.8246 (या अधिक)
Vulnerability Result: सुरक्षित - पैच लागू
3. अस्थायी शमन (यदि तत्काल पैच संभव नहीं है):
Group Policy के माध्यम से PKU2U अक्षम करें:
Computer Configuration → Windows Settings → Security Settings →
Local Policies → Security Options →
"Network security: Allow PKU2U authentication requests..." → DISABLED
या registry के माध्यम से:
Set-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control\Lsa\pku2u"
-Name AllowOnlineID -Value 0
4. नेटवर्क ब्लॉकिंग (defense-in-depth):
फ़ायरवॉल: इनबाउंड 135, 445, 5985 को अधिकृत होस्ट्स तक सीमित करें
DCs और महत्वपूर्ण सर्वरों को सख्त ACLs वाली VLANs में विभाजित करें
5. विशेष प्राथमिकता — Domain Controllers:
DCs सभी सूचीबद्ध पोर्ट्स को एक्सपोज़ करते हैं (RPC, SMB, LDAP)
Wormable + समझौता किया गया DC = AD डोमेन का पूर्ण समझौता
पहले उपलब्ध विंडो में DCs को पैच करें
$ cat ./usage.sh# आकलन स्क्रिप्ट चलाएँ (बुनियादी पढ़ने के लिए एडमिन विशेषाधिकारों की आवश्यकता नहीं है,
# लेकिन कुछ registry जाँचों के लिए एलिवेशन की आवश्यकता हो सकती है)
powershell.exe -ExecutionPolicy Bypass -File cve_2025_47981_check.ps1
# संवेदनशील सिस्टम पर अपेक्षित आउटपुट:
Name Value
---- -----
ntoskrnl.exe Installed Version 10.0.14393.7906
ntoskrnl.exe Required Version 10.0.14393.8246
PKU2U AllowOnlineID 1
Portas SPNEGO abertas {135, 445, 5985, 3389}
Vulnerability Result संवेदनशील - पैच अनुपस्थित (KB5062560)
Windows Version 10.0.14393.7906
# पैच किए गए सिस्टम पर अपेक्षित आउटपुट:
Vulnerability Result सुरक्षित - पैच लागू
PKU2U AllowOnlineID 0
$ cat ./affected_versions.txtप्रभावित (33+ कॉन्फ़िगरेशन):
Windows 10: 1607, 1809, 21H2, 22H2
Windows 11: 22H2, 23H2, 24H2
Windows Server: 2008 R2, 2012, 2012 R2, 2016, 2019, 2022, 2025
आर्किटेक्चर: x64, x86, ARM64
Server Core: हाँ (उपरोक्त सभी संस्करण)
उच्च जोखिम कारक:
PKU2U GPO सक्षम (Win10 1607+ में डिफ़ॉल्ट)
पोर्ट्स 135/445/5985 बाहरी या अविश्वसनीय नेटवर्क से सुलभ
पैच:
KB5062560 → जुलाई 2025 पैच मंगलवार
ntoskrnl.exe न्यूनतम → 10.0.14393.8246 (Windows Server 2016)
प्रति-संस्करण विशिष्ट बिल्ड्स msrc.microsoft.com पर जाँचें
$ cat ./lessons_learned.txt[+] स्ट्रिंग के बजाय [version] की तुलना बिल्ड तुलनाओं में गलत नकारात्मक से बचाती है
[+] ntoskrnl.exe पैच स्थिति के लिए प्राथमिक सत्य स्रोत है — Get-HotFix से अधिक विश्वसनीय
[+] PKU2U AllowOnlineID जोखिम का प्रवर्धक है — इसके बिना सिस्टमों की सतह कम होती है
[+] Get-NetTCPConnection स्थानीय रूप से एक्सपोज़्ड हमले की सतह को तेज़ी से मैप करता है
[+] Format-Table -AutoSize पेंटेस्ट रिपोर्ट में कॉपी करने के लिए तैयार आउटपुट उत्पन्न करता है
[-] स्क्रिप्ट केवल Windows Server 2016 (14393) जाँचती है — अन्य बिल्ड्स तक विस्तार आवश्यक है
[-] gpresult के माध्यम से GPO स्थिति की जाँच नहीं करती — registry प्रभावी नीति से भिन्न हो सकती है
[-] दूरस्थ कनेक्टिविटी का परीक्षण नहीं करती — केवल जाँचती है कि पोर्ट्स स्थानीय रूप से खुले हैं
[-] JSON/CSV में आउटपुट नहीं — स्वचालित अनुपालन पाइपलाइनों में एकीकृत करना कठिन
[→] सुधार: प्रति-OS संस्करणों की तालिका, JSON में आउटपुट, Invoke-Command के माध्यम से दूरस्थ जाँच,
भेद्यता सहसंबंध के लिए Qualys/Tenable के साथ एकीकरण
CVE Assessment · CVSS 9.8 · Wormable · July 2025 Patch Tuesday · Detection only · No exploit