Basic .Net deserialization (ObjectDataProvider gadget, ExpandedWrapper, and Json.Net)
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
यह पोस्ट यह समझने के लिए समर्पित है कि ObjectDataProvider गैजेट का उपयोग कैसे किया जाता है RCE प्राप्त करने के लिए और कैसे Serialization पुस्तकालयों Json.Net और xmlSerializer का दुरुपयोग किया जा सकता है उस गैजेट के साथ।
दस्तावेज़ से: ObjectDataProvider क्लास एक ऑब्जेक्ट को लपेटता है और बनाता है जिसका आप एक बाइंडिंग स्रोत के रूप में उपयोग कर सकते हैं। हाँ, यह एक अजीब व्याख्या है, तो चलो देखते हैं कि इस क्लास में ऐसा क्या है जो इतना दिलचस्प है: यह क्लास एक मनमाना ऑब्जेक्ट लपेटने की अनुमति देती है, MethodParameters का उपयोग करके मनमाने पैरामीटर सेट करने के लिए, और फिर MethodName का उपयोग करके मनमाने ऑब्जेक्ट के मनमाने फ़ंक्शन को कॉल करने के लिए। इसलिए, मनमाना ऑब्जेक्ट डिसेरियलाइज़ करते समय पैरामीटर के साथ एक फ़ंक्शन निष्पादित करेगा।
System.Windows.Data नामस्थान, जो PresentationFramework.dll में C:\Windows\Microsoft.NET\Framework\v4.0.30319\WPF
पर पाया जाता है, वह जगह है जहाँ ObjectDataProvider परिभाषित और कार्यान्वित किया गया है।
dnSpy का उपयोग करके आप उस क्लास का कोड निरीक्षण कर सकते हैं जिसमें हम रुचि रखते हैं। नीचे दी गई छवि में हम PresentationFramework.dll --> System.Windows.Data --> ObjectDataProvider --> Method name का कोड देख रहे हैं।
जैसा कि आप देख सकते हैं जब MethodName
सेट किया जाता है base.Refresh()
को कॉल किया जाता है, चलो देखते हैं कि यह क्या करता है:
ठीक है, चलो देखते हैं कि this.BeginQuery()
क्या करता है। BeginQuery
को ObjectDataProvider
द्वारा ओवरराइड किया गया है और यह यह करता है:
ध्यान दें कि कोड के अंत में this.QueryWorke(null)
को कॉल किया जा रहा है। चलो देखते हैं कि यह क्या निष्पादित करता है:
ध्यान दें कि यह QueryWorker
फ़ंक्शन का पूरा कोड नहीं है लेकिन यह इसके दिलचस्प भाग को दिखाता है: कोड this.InvokeMethodOnInstance(out ex);
को कॉल करता है यह वह पंक्ति है जहाँ मेथड सेट को लागू किया जाता है।
यदि आप यह जांचना चाहते हैं कि केवल MethodName सेट करने पर यह निष्पादित होगा, आप यह कोड चला सकते हैं:
ध्यान दें कि आपको System.Windows.Data
को लोड करने के लिए संदर्भ के रूप में C:\Windows\Microsoft.NET\Framework\v4.0.30319\WPF\PresentationFramework.dll जोड़ने की आवश्यकता है।
पिछले शोषण का उपयोग करते समय ऐसे मामले होंगे जहाँ object को ObjectDataProvider उदाहरण के रूप में deserialized किया जाएगा (उदाहरण के लिए DotNetNuke vuln में, XmlSerializer का उपयोग करते हुए, object को GetType
का उपयोग करके deserialized किया गया था)। फिर, ObjectDataProvider उदाहरण में लिपटे object type के बारे में कोई जानकारी नहीं होगी (उदाहरण के लिए Process
)। आप DotNetNuke vuln के बारे में अधिक जानकारी यहाँ पा सकते हैं।
यह वर्ग उन object types को निर्दिष्ट करने की अनुमति देता है जो एक दिए गए उदाहरण में संलग्न हैं। इसलिए, इस वर्ग का उपयोग एक स्रोत object (ObjectDataProvider) को एक नए object type में संलग्न करने और हमें आवश्यक गुण प्रदान करने के लिए किया जा सकता है (ObjectDataProvider.MethodName और ObjectDataProvider.MethodParameters)। यह पहले प्रस्तुत मामले जैसे मामलों के लिए बहुत उपयोगी है, क्योंकि हम _ObjectDataProvider** को एक **ExpandedWrapper _ उदाहरण के अंदर wrap कर सकेंगे और जब deserialized किया जाएगा तो यह वर्ग OjectDataProvider object बनाएगा जो MethodName में निर्दिष्ट function को execute करेगा।
आप निम्नलिखित कोड के साथ इस wrapper की जांच कर सकते हैं:
आधिकारिक वेब पृष्ठ में यह संकेत दिया गया है कि यह पुस्तकालय Json.NET के शक्तिशाली JSON सीरियलाइज़र के साथ किसी भी .NET ऑब्जेक्ट को सीरियलाइज़ और डीसिरियलाइज़ करने की अनुमति देता है। इसलिए, यदि हम ObjectDataProvider गैजेट को डीसिरियलाइज़ कर सकें, तो हम केवल एक ऑब्जेक्ट को डीसिरियलाइज़ करके RCE का कारण बन सकते हैं।
सबसे पहले, आइए देखें कि इस पुस्तकालय का उपयोग करके एक ऑब्जेक्ट को सीरियलाइज़/डीसिरियलाइज़ करने का एक उदाहरण:
Using ysoserial.net मैंने एक्सप्लॉइट बनाया:
इस कोड में आप शोषण का परीक्षण कर सकते हैं, बस इसे चलाएँ और आप देखेंगे कि एक कैलकुलेटर निष्पादित होता है:
सीखें और AWS हैकिंग का अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE) सीखें और GCP हैकिंग का अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE)