hacktricks/cryptography/padding-oracle-priv.md

15 KiB

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

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

CBC - Cipher Block Chaining

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

CBC encryption

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

CBC decryption

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

संदेश पैडिंग

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

एक 8 बाइट लंबाई के 2 ब्लॉक के साथ और अधिक उदाहरणों पर ध्यान दें:

byte #0 byte #1 byte #2 byte #3 byte #4 byte #5 byte #6 byte #7 byte #0 byte #1 byte #2 byte #3 byte #4 byte #5 byte #6 byte #7
P A S S W O R D 1 2 3 4 5 6 0x02 0x02
P A S S W O R D 1 2 3 4 5 0x03 0x03 0x03
P A S S W O R D 1 2 3 0x05 0x05 0x05 0x05 0x05
P A S S W O R D 0x08 0x08 0x08 0x08 0x08 0x08 0x08 0x08

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

पैडिंग ऑरेकल

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

इस व्यवहार को पहचानने पर, आप एन्क्रिप्टेड डेटा को डिक्रिप्ट कर सकते हैं और यहां तक कि कोई साफ-टेक्स्ट एन्क्रिप्ट कर सकते हैं।

उत्पीडन कैसे करें

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

sudo apt-get install padbuster

एक साइट के कुकी को क्या विकल्पनशील है यह जांचने के लिए आप निम्नलिखित कोशिश कर सकते हैं:

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

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

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

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

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

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) के साथ XORed किया जाएगा। इसलिए:

  • 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 को ब्रूट-फोर्स करना होगा।

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

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

सुरक्षितता की खोज

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

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

संदर्भ

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

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