Padding Oracle

Reading time: 6 minutes

tip

AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE)

HackTricks का समर्थन करें

CBC - Cipher Block Chaining

CBC मोड में पिछला एन्क्रिप्टेड ब्लॉक IV के रूप में उपयोग किया जाता है अगले ब्लॉक के साथ XOR करने के लिए:

https://defuse.ca/images/cbc_encryption.png

CBC को डिक्रिप्ट करने के लिए विपरीत ऑपरेशंस किए जाते हैं:

https://defuse.ca/images/cbc_decryption.png

ध्यान दें कि एन्क्रिप्शन की और IV का उपयोग करना आवश्यक है।

Message Padding

चूंकि एन्क्रिप्शन फिक्स्ड साइज ब्लॉक्स में किया जाता है, पैडिंग आमतौर पर अंतिम ब्लॉक में इसकी लंबाई को पूरा करने के लिए आवश्यक होती है।
आमतौर पर PKCS7 का उपयोग किया जाता है, जो पैडिंग जेनरेट करता है ब्लॉक को पूरा करने के लिए आवश्यक बाइट्स की संख्या को दोहराते हुए। उदाहरण के लिए, यदि अंतिम ब्लॉक में 3 बाइट्स की कमी है, तो पैडिंग होगी \x03\x03\x03

आइए 8 बाइट्स की 2 ब्लॉक्स के साथ और उदाहरण देखें:

byte #0byte #1byte #2byte #3byte #4byte #5byte #6byte #7byte #0byte #1byte #2byte #3byte #4byte #5byte #6byte #7
PASSWORD1234560x020x02
PASSWORD123450x030x030x03
PASSWORD1230x050x050x050x050x05
PASSWORD0x080x080x080x080x080x080x080x08

ध्यान दें कि अंतिम उदाहरण में अंतिम ब्लॉक पूरा था इसलिए केवल पैडिंग के साथ एक और उत्पन्न किया गया

Padding Oracle

जब एक एप्लिकेशन एन्क्रिप्टेड डेटा को डिक्रिप्ट करता है, तो यह पहले डेटा को डिक्रिप्ट करेगा; फिर यह पैडिंग को हटा देगा। पैडिंग की सफाई के दौरान, यदि अमान्य पैडिंग एक पहचान योग्य व्यवहार को ट्रिगर करती है, तो आपके पास पैडिंग ऑरेकल भेद्यता है। पहचान योग्य व्यवहार एक त्रुटि, परिणामों की कमी, या धीमी प्रतिक्रिया हो सकता है।

यदि आप इस व्यवहार का पता लगाते हैं, तो आप एन्क्रिप्टेड डेटा को डिक्रिप्ट कर सकते हैं और यहां तक कि किसी भी क्लियरटेक्स्ट को एन्क्रिप्ट कर सकते हैं।

How to exploit

आप इस प्रकार की भेद्यता का शोषण करने के लिए https://github.com/AonCyberLabs/PadBuster का उपयोग कर सकते हैं या बस करें

sudo apt-get install padbuster

किसी साइट के कुकी की संवेदनशीलता का परीक्षण करने के लिए आप कोशिश कर सकते हैं:

bash
perl ./padBuster.pl http://10.10.10.10/index.php "RVJDQrwUdTRWJUVUeBKkEA==" 8 -encoding 0 -cookies "login=RVJDQrwUdTRWJUVUeBKkEA=="

Encoding 0 का मतलब है कि base64 का उपयोग किया गया है (लेकिन अन्य उपलब्ध हैं, मदद मेनू की जांच करें)।

आप इस कमजोरियों का दुरुपयोग करके नए डेटा को एन्क्रिप्ट कर सकते हैं। उदाहरण के लिए, कल्पना करें कि कुकी की सामग्री "user=MyUsername" है, तो आप इसे "_user=administrator_" में बदल सकते हैं और एप्लिकेशन के अंदर विशेषाधिकार बढ़ा सकते हैं। आप इसे paduster का उपयोग करके -plaintext पैरामीटर निर्दिष्ट करके भी कर सकते हैं:

bash
perl ./padBuster.pl http://10.10.10.10/index.php "RVJDQrwUdTRWJUVUeBKkEA==" 8 -encoding 0 -cookies "login=RVJDQrwUdTRWJUVUeBKkEA==" -plaintext "user=administrator"

यदि साइट कमजोर है तो padbuster स्वचालित रूप से यह पता लगाने की कोशिश करेगा कि पैडिंग त्रुटि कब होती है, लेकिन आप -error पैरामीटर का उपयोग करके त्रुटि संदेश को भी इंगित कर सकते हैं।

bash
perl ./padBuster.pl http://10.10.10.10/index.php "" 8 -encoding 0 -cookies "hcon=RVJDQrwUdTRWJUVUeBKkEA==" -error "Invalid padding"

सिद्धांत

संक्षेप में, आप सभी विभिन्न पैडिंग बनाने के लिए उपयोग किए जा सकने वाले सही मानों का अनुमान लगाकर एन्क्रिप्टेड डेटा को डिक्रिप्ट करना शुरू कर सकते हैं। फिर, पैडिंग ऑरेकल अटैक अंत से शुरू होकर सही मान का अनुमान लगाते हुए बाइट्स को डिक्रिप्ट करना शुरू करेगा जो 1, 2, 3, आदि की पैडिंग बनाता है।

कल्पना करें कि आपके पास कुछ एन्क्रिप्टेड टेक्स्ट है जो 2 ब्लॉक्स में फैला हुआ है जो E0 से E15 तक के बाइट्स से बना है।
अंतिम ब्लॉक (E8 से E15) को डिक्रिप्ट करने के लिए, पूरा ब्लॉक "ब्लॉक सिफर डिक्रिप्शन" के माध्यम से जाता है जिससे मध्यवर्ती बाइट्स I0 से I15 उत्पन्न होते हैं।
अंत में, प्रत्येक मध्यवर्ती बाइट को पिछले एन्क्रिप्टेड बाइट्स (E0 से E7) के साथ XOR किया जाता है। तो:

  • C15 = D(E15) ^ E7 = I15 ^ E7
  • C14 = I14 ^ E6
  • C13 = I13 ^ E5
  • C12 = I12 ^ E4
  • ...

अब, यह संभव है कि E7 को इस तरह से संशोधित करें कि C15 0x01 हो, जो एक सही पैडिंग भी होगी। तो, इस मामले में: \x01 = I15 ^ E'7

तो, E'7 को खोजकर, I15 की गणना करना संभव है: I15 = 0x01 ^ E'7

जो हमें C15 की गणना करने की अनुमति देता है: C15 = E7 ^ I15 = E7 ^ \x01 ^ E'7

C15 को जानकर, अब C14 की गणना करना संभव है, लेकिन इस बार पैडिंग \x02\x02 को ब्रूट-फोर्स करते हुए।

यह BF पिछले एक के रूप में जटिल है क्योंकि यह E''15 की गणना करना संभव है जिसका मान 0x02 है: E''7 = \x02 ^ I15 इसलिए केवल E'14 को खोजने की आवश्यकता है जो C14 को 0x02 के बराबर बनाता है।
फिर, C14 को डिक्रिप्ट करने के लिए वही कदम उठाएं: C14 = E6 ^ I14 = E6 ^ \x02 ^ E''6

इस श्रृंखला का पालन करें जब तक आप पूरे एन्क्रिप्टेड टेक्स्ट को डिक्रिप्ट न कर लें।

भेद्यता का पता लगाना

एक रजिस्टर और खाता बनाएं और इस खाते से लॉग इन करें।
यदि आप कई बार लॉग इन करते हैं और हमेशा एक ही कुकी प्राप्त करते हैं, तो संभवतः एप्लिकेशन में कुछ गलत है। कुकी हर बार लॉग इन करते समय अद्वितीय होनी चाहिए। यदि कुकी हमेशा एक ही है, तो यह संभवतः हमेशा मान्य होगी और इसे अमान्य करने का कोई तरीका नहीं होगा।

अब, यदि आप कुकी को संशोधित करने की कोशिश करते हैं, तो आप देख सकते हैं कि आपको एप्लिकेशन से एक त्रुटि मिलती है।
लेकिन यदि आप पैडिंग को BF करते हैं (उदाहरण के लिए padbuster का उपयोग करते हुए) तो आप एक अन्य उपयोगकर्ता के लिए मान्य कुकी प्राप्त करने में सफल होते हैं। यह परिदृश्य padbuster के लिए अत्यधिक संभावित रूप से संवेदनशील है।

संदर्भ

tip

AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE)

HackTricks का समर्थन करें