
विस्तृत विश्लेषण और प्रूफ-ऑफ-कॉन्सेप्ट एक्सप्लॉइट CVE-2017-9822 के लिए, जो DotNetNuke CMS में एक XXE/असुरक्षित डिसीरियलाइज़ेशन कमजोरी है, जो कुकी हेरफेर के माध्यम से रिमोट कोड निष्पादन की ओर ले जाती है।
DotNetNuke (जिसे अक्सर DNN के रूप में संक्षिप्त किया जाता है) Microsoft के ASP.NET तकनीक पर आधारित एक CMS (सामग्री प्रबंधन प्रणाली) और वेब एप्लिकेशन फ्रेमवर्क है।
प्रभावित उत्पाद: DotNetNuke (DNN प्लेटफॉर्म) – एक लोकप्रिय .NET CMS/पोर्टल।
प्रकाशन तिथि: जुलाई 2017।
गंभीरता: गंभीर (CVSS ~9.8)।
कमजोरी का प्रकार: XML एक्सटर्नल एंटिटी (XXE) / असुरक्षित डिसीरियलाइज़ेशन → रिमोट कोड एक्ज़ीक्यूशन (RCE)।
प्रभाव: संस्करण 9.1.1 से पहले कुकी के माध्यम से रिमोट कोड निष्पादन संभव है।
यहाँ मैं प्रोग्राम को सेटअप और डीबग करने के लिए विंडोज 10 का उपयोग कर रहा हूँ। मैं जो संस्करण स्थापित कर रहा हूँ वह 9.1.0 है। आप स्थापना का तरीका यहाँ देख सकते हैं। और पूरा होने पर परिणाम इस प्रकार है:


मैंने जो रिपोर्ट पढ़ी हैं, उनके अनुसार यह कमजोरी DotNetNuke के कुकी प्रसंस्करण में स्थित है।
DNN, DNNPersonalization कुकी के लिए असुरक्षित डिसीरियलाइज़ेशन (unsafe deserialization) का उपयोग करता है।

.dll या .exe से स्रोत कोड देखने, विश्लेषण करने और संपादित करने की अनुमति देता है। इसे यहाँ से स्थापित किया जा सकता है। डीबगिंग के लिए हमें दो संस्करण डाउनलोड करने होंगे।
DotNetNuke.dll खोलें और Edit Assembly Attributes (C#) चुनें।
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default |
DebuggableAttribute.DebuggingModes.DisableOptimizations |
DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints |
DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]

फिर इसे सहेज लें।
64-बिट संस्करण को व्यवस्थापक अधिकारों के साथ खोलें और Attach to Process चुनें।

w3wp.exe चुनें।
w3wp.exe चुनने का कारण है:
w3wp.exe = IIS Worker Process।
यह IIS में एप्लिकेशन पूल की निष्पादन प्रक्रिया है।
जब वेबसाइट पर कोई HTTP अनुरोध भेजा जाता है, तो IIS उस अनुरोध को संसाधित करने के लिए एक w3wp.exe बनाता या पुन: उपयोग करता है (ASP.NET कोड चलाना, मॉड्यूल, मिडलवेयर, डेटाबेस कनेक्शन आदि संभालना)।
प्रत्येक एप्लिकेशन पूल में कॉन्फ़िगरेशन (वेब गार्डन, रीसाइक्लिंग) के आधार पर एक या अधिक w3wp.exe प्रक्रियाएँ हो सकती हैं।
इसके बाद Debug -> Window -> Modules चुनें।

पूरा होने पर मॉड्यूल दिखाई देंगे, किसी पर राइट-क्लिक करें और Open All Modules चुनें।

और अंत में DNN से संबंधित सभी असेंबली दिखाई देंगी।

DotNetNuke.dll -> PersonalizationController#LoadProfile(int, int) में जाएँ।
यह फ़ंक्शन DNN पोर्टल में उपयोगकर्ता की प्रोफ़ाइल (वैयक्तिकरण डेटा) लोड करने के लिए उपयोग होता है।
यदि उपयोगकर्ता लॉग इन है → प्रोफ़ाइल डेटाबेस + कैश से प्राप्त करें।
यदि उपयोगकर्ता अज्ञात (लॉग इन नहीं) है → प्रोफ़ाइल कुकी DNNPersonalization से प्राप्त करें।
यहाँ हमें DNNPersonalization पर ध्यान केंद्रित करना चाहिए।
यदि userId अमान्य है (अनाम उपयोगकर्ता)।
जाँचें कि अनुरोध में DNNPersonalization कुकी है या नहीं।
यदि है → इस कुकी से XML मान लें।
हम वेबसाइट पर 404 अनुरोध भेजेंगे और कोई भी DNNPersonalization कुकी का उपयोग करेंगे, फिर dnSpy में DotNetNuke.dll -> PersonalizationController#LoadProfile(int, int) पर ब्रेकपॉइंट रखकर डीबग करेंगे।


PortalSettings वर्ग के विश्लेषण पर ध्यान केंद्रित करेंगे।
ध्यान देने वाली बात यह है कि यहाँ if शर्त का उपयोग करके जाँच की जा रही है कि वर्तमान अनुरोध IsAuthenticated है या नहीं।
और हमारे द्वारा भेजा गया अनुरोध 404 है -> unauthenticated।
कॉल स्टैक में, हम Handle404OrException पर ध्यान केंद्रित करते हैं।

context.User null है या नहीं, यदि हाँ, तो context.User को वर्तमान थ्रेड उपयोगकर्ता पर सेट करता है।

हम देख सकते हैं कि Handle404OrException में IsAuthenticated वेरिएबल अब true है और उपयोगकर्ता IIS सर्वर का है, इसलिए अनुरोध एक प्रमाणित उपयोगकर्ता के रूप में निष्पादित होता है।
इस समस्या का कारण इस कोड खंड में है:
else if (transfer)
{
if (context.User == null)
{
context.User = Thread.CurrentPrincipal;
}
response.TrySkipIisCustomErrors = true;
IHttpHandler handler = new CDefault();
context.Handler = handler;
server.Transfer("~/" + text, true);
}
यदि context.User मौजूद नहीं है → Thread.CurrentPrincipal (अर्थात् थ्रेड की वर्तमान पहचान) सेट करें।
यह अनुरोध को आगे की प्रक्रिया में उपयोगकर्ता/भूमिका जानकारी प्राप्त करने में मदद करता है।
=> जब हम DNNPersonalization वेरिएबल वाली कुकी में कोई भी सामग्री भेजते हैं, तो यह एक सामान्य उपयोगकर्ता के रूप में निष्पादित होती है।
अभी भी DotNetNuke.dll -> PersonalizationController#LoadProfile(int, int) में।
हम देखते हैं कि text वेरिएबल कुकी वैल्यू से मान प्राप्त करता है और फिर इसे Globals.DeserializeHashTableXml() में इनपुट के रूप में डाला जाता है।

Globals.DeserializeHashTableXml() में जाएँ।