
🐩 Poodle (Padding Oracle On Downgraded Legacy Encryption) हमला CVE-2014-3566 🐩
पूडल अटैक (Padding Oracle On Downgraded Legacy Encryption) का एक प्रूफ ऑफ कॉन्सेप्ट:
एक मैन-इन-द-मिडिल एक्सप्लॉइट जो इंटरनेट और सुरक्षा सॉफ़्टवेयर क्लाइंट्स के SSL 3.0 पर फ़ॉलबैक का फ़ायदा उठाता है
पूडल अटैक आपको क्लाइंट द्वारा सर्वर को भेजे गए एन्क्रिप्टेड डेटा को पुनर्प्राप्त करने की अनुमति देता है यदि उपयोग की जाने वाली ट्रांसपोर्ट लेयर सुरक्षा SSLv3 है। यह आपको अनुरोध को एन्क्रिप्ट करने के लिए उपयोग की गई निजी कुंजी को पुनर्प्राप्त करने की अनुमति नहीं देता है।

SSLv3 आपके डेटा को एन्क्रिप्ट/डिक्रिप्ट और सुरक्षित करने के लिए एक प्रोटोकॉल है। हमारे मामले में, यह CBC सिफर मोड चेनिंग का उपयोग करता है। प्लेनटेक्स्ट को एन्क्रिप्शन एल्गोरिथम (AES, DES, 3DES) के अनुसार ब्लॉकों में विभाजित किया जाता है और लंबाई 8 या 16 की गुणज होती है। यदि प्लेनटेक्स्ट लंबाई को नहीं भरता है, तो लापता स्थान को पूरा करने के लिए अंत में पैडिंग जोड़ी जाती है। मैं दृढ़ता से सलाह देता हूं कि इस रीडमी को पढ़ने के लिए आप एन्क्रिप्शन और डिक्रिप्शन की इन छवियों को खोलें।
| एन्क्रिप्शन | डिक्रिप्शन |
|---|---|
| Ci = Ek(Pi ⊕ Ci-1), and C0 = IV | Pi = Dk(Ci) ⊕ Ci-1, and C0 = IV |
मूल रूप से यह कुछ सरल XOR है, आप यह वीडियो भी देख सकते हैं (मैं नहीं) https://www.youtube.com/watch?v=0D7OwYp6ZEc।
HTTPS पर SSLv3 का उपयोग करके भेजा गया अनुरोध AES/DES और CBC मोड के साथ सिफर किया जाएगा। TLS1.x की तुलना में SSLv3 की विशेषता पैडिंग है। SSLv3 में पैडिंग रैंडम बाइट्स से भरी होती है, सिवाय अंतिम बाइट के जो पैडिंग की लंबाई के बराबर होती है।
उदाहरण:
T|E|X|T|0xab|0x10|0x02 जहां 0xab|0x10|0x02 पैडिंग है।
T|E|X|T|E|0x5c|0x01 जहां 0x5c|0x01 पैडिंग है।
इसके अलावा अंतिम ब्लॉक को पैडिंग के पूरे ब्लॉक से भरा जा सकता है, जिसका अर्थ है कि अंतिम ब्लॉक अंतिम बाइट को छोड़कर पूरी तरह से एक रैंडम बाइट हो सकता है।
T|E|X|T|E|0x5c|0x01|0x3c|0x09|0x5d|0x08|0x04|0x07 जहां |0x5c|0x01|0x3c|0x09|0x5d|0x08|0x04|0x07 पैडिंग है; केवल 0x07 ही हमलावर को ज्ञात है। इसलिए यदि कोई हमलावर पैडिंग ब्लॉक को प्रभावित करने में सक्षम है, तो वह जान सकेगा कि अंतिम ब्लॉक का अंतिम बाइट एक ब्लॉक की लंबाई के बराबर है।
एक हमलावर को पीड़ित से अनुरोध भेजने में सक्षम होना चाहिए (उदाहरण के लिए XSS का शोषण करके जावास्क्रिप्ट का उपयोग करके)। फिर वह प्रत्येक अनुरोध के पथ और डेटा को नियंत्रित कर सकता है:
उदाहरण:
GET / HTTP/1.1\r\nSECRET COOKIE\r\n\r\n
GET /AAA HTTP/1.1\r\nSECRET COOKIE\r\n\r\nDATA
इस तकनीक से वह पैडिंग को प्रभावित कर सकता है।
SSLv3 प्लेनटेक्स्ट की अखंडता की जांच करने और उसे प्रमाणित करने के लिए HMAC का भी उपयोग करता है।
कीड-हैश मैसेज ऑथेंटिकेशन कोड (HMAC) एक विशिष्ट प्रकार का मैसेज ऑथेंटिकेशन कोड (MAC) है जिसमें एक गुप्त क्रिप्टोग्राफिक कुंजी के साथ एक क्रिप्टोग्राफिक हैश फ़ंक्शन (इसलिए 'H') शामिल होता है।
इसके साथ, एक हमलावर अनुरोध को इंटरसेप्ट और बदलकर वापस नहीं भेज सकता। यदि सर्वर को कोई समस्या आती है, तो वह एक HMAC त्रुटि भेजेगा।
SSLv3 प्रोटोकॉल निम्नलिखित प्रक्रिया का उपयोग करता है: वह क्लाइंट से डेटा प्राप्त करता है, डेटा को डिक्रिप्ट करता है, HMAC के साथ अखंडता की जांच करता है।
MAC-then-Encrypt: सिफरटेक्स्ट पर कोई अखंडता प्रदान नहीं करता, क्योंकि संदेश को डिक्रिप्ट करने तक हम यह नहीं जान सकते कि यह वास्तव में प्रामाणिक था या नकली। प्लेनटेक्स्ट अखंडता। यदि सिफर योजना परिवर्तनशील (मैलिएबल) है, तो संदेश को वैध दिखने और वैध MAC रखने के लिए बदलना संभव हो सकता है। यह निश्चित रूप से एक सैद्धांतिक बिंदु है, क्योंकि व्यावहारिक रूप से MAC सीक्रेट > को सुरक्षा प्रदान करनी चाहिए। यहां, MAC प्लेनटेक्स्ट के बारे में भी कोई जानकारी नहीं दे सकता, क्योंकि यह एन्क्रिप्टेड है।
https://crypto.stackexchange.com/questions/202/should-we-mac-then-encrypt-or-encrypt-then-mac
इसका मतलब है कि हम सर्वर को जाने बिना सिफर किए गए टेक्स्ट को बदल सकते हैं। यह बहुत बढ़िया है, सच में :)
पहले अंतिम ब्लॉक को पैडिंग से भरा होना चाहिए, जैसा कि हमने पहले देखा, हमलावर अनुरोध के पथ का उपयोग करता है और अनुरोध की लंबाई की जांच करता है।
चूंकि अंतिम ब्लॉक अंतिम बाइट को छोड़कर रैंडम बाइट्स से भरा होता है, वह इस अंतिम ब्लॉक Cn को उस ब्लॉक Ci से बदल सकता है जिसे वह डिक्रिप्ट करना चाहता है। परिवर्तित अनुरोध सर्वर को भेजा जाता है।
सर्वर:
अंतिम ब्लॉक को बदलकर, हमलावर अंतिम ब्लॉक के अंतिम बाइट (पैडिंग की लंबाई) को भी बदल देता है। पैडिंग ब्लॉक में बदला गया अंतिम बाइट मूल के समान होने की 1/256 संभावना होती है, इस स्थिति में कोई पैडिंग त्रुटि नहीं होगी और हमलावर इस XOR ऑपरेशन का उपयोग करके ब्लॉक Ci के अंतिम बाइट को निम्नलिखित ऑपरेशन के माध्यम से पुनर्प्राप्त कर सकता है:
Pn = Dk(Cn) ⊕ Cn-1
Pn = Dk(Ci) ⊕ Cn-1
Pn = Dk(Ci) ⊕ Cn-1
xxxxxxx7 = Dk(Ci) ⊕ Cn-1
Dk(Ci) = xxxxxxx7 ⊕ Cn-1
Pi ⊕ Ci-1 = xxxxxxx7 ⊕ Cn-1
Pi = Ci-1 ⊕ xxxxxxx7 ⊕ Cn-1
(xxxxxxx7 या xxxxxxx15 और x रैंडम बाइट)
ब्लॉक का अंतिम बाइट पुनर्प्राप्त किया जा सकता है: Pi[7] = Ci-1[7] ⊕ xxxxxxx7 ⊕ Cn-1[7] पैडिंग के मामले में हमलावर को एक और हैंडशेक (नई AES कुंजी) करने के लिए SSL सत्र बंद करना होगा और नया सिफर प्राप्त करना होगा, फिर अंतिम ब्लॉक को बदलना होगा आदि। (आमतौर पर +300 हैंडशेक की आवश्यकता होती है)
एक बार एक बाइट पुनर्प्राप्त हो जाने पर, वह पथ में एक बाइट जोड़कर और डेटा में एक बाइट हटाकर ब्लॉक के अन्य सभी बाइट्स प्राप्त करेगा:
| बाइट E,I,K,O पुनर्प्राप्त करने का अनुरोध |
|---|
| GET /a SECRET_COOKIE dataazerty PADDING_7 |
| GET /aa SECRET_COOKIE dataazert PADDING_7 |
| GET /aaa SECRET_COOKIE dataazer PADDING_7 |
| GET /aaaa SECRET_COOKIE dataaze PADDING_7 |
हालांकि TLS विनिर्देशों के लिए सर्वरों को पैडिंग की जांच करना आवश्यक है, कुछ इम्प्लीमेंटेशन इसे ठीक से मान्य नहीं करते हैं, जिससे कुछ सर्वर SSL 3.0 अक्षम करने पर भी POODLE के प्रति संवेदनशील हो जाते हैं।
TLS सामान्यतः Poodle से सुरक्षित है, लेकिन कुछ इम्प्लीमेंटेशन पैडिंग की जांच नहीं करते हैं, यह ऐसा है जैसे हम SSLv3 का उपयोग कर रहे हों, यही कारण है कि कुछ TLS संस्करण संवेदनशील हैं।
इस रिपॉजिटरी में तीन फाइलें हैं:
यह पीओसी हमले के पीछे की क्रिप्टोग्राफी का पता लगाता है। यह फ़ाइल हमें सरल तरीके से समझने की अनुमति देती है कि हमला कैसे काम करता है।
python3 poodle-poc.py
parallelization-poodle.py फ़ाइल एक प्रोजेक्ट है, और एक विचार :) देखें https://github.com/mpgn/poodle-PoC/issues/1
python3 parallelization-poodle.py
यह वास्तविक एक्सप्लॉइट है। यदि पेंटेस्ट के दौरान क्लाइंट पुराने सर्वर और ब्राउज़र का उपयोग करता है, तो Poodle Attack के बारे में प्रूफ ऑफ कॉन्सेप्ट बनाने के लिए यह वास्तव में उपयोगी है। बस अपने मैलिशियस प्रॉक्सी का आईपी सही पोर्ट के साथ ब्राउज़र कॉन्फ़िग में डालें, बाकी का ध्यान प्रॉक्सी रखेगा।
आवश्यकता:
security.tls.version.min: 0 का उपयोग करके केवल SSLv3 को बाध्य करें। वैकल्पिक रूप से, यदि क्लाइंट TLS का भी उपयोग करता है, तो आप डाउनग्रेड को बाध्य कर सकते हैं।
💀 यदि आपके पास ये पूर्वापेक्षाएँ हैं, तो आप हमला शुरू कर सकते हैं 💀:
इस एक्सप्लॉइट के लिए दो विकल्प उपलब्ध हैं:
$> echo 1 > /proc/sys/net/ipv4/ip_forward
$> iptables -i vmnet1 -t nat -A PREROUTING -p tcp --dport 1337 -j REDIRECT --to-ports 1337
arpspoof, ettercap या bettercap टूल का उपयोग करें$> bettercap -iface vmnet1
net.show
set arp.spoof.internal true
arp.spoof on
⋊> ~/T/poodle-Poc on master ⨯ python3 poodle-exploit.py -h 13:10:24
usage: poodle-exploit.py [-h] [--start-block START_BLOCK]
[--stop-block STOP_BLOCK] [--simpleProxy SIMPLEPROXY]
proxy port server rport
Poodle Exploit by @mpgn_x64
positional arguments:
proxy ip of the proxy
port port of the proxy
server ip of the remote server
rport port of the remote server
optional arguments:
-h, --help show this help message and exit
--start-block START_BLOCK
start the attack at this block
--stop-block STOP_BLOCK
stop the attack at this block
--simpleProxy SIMPLEPROXY
Direct proxy, no ARP spoofing attack
$> python3 poodle-exploit.py 192.168.13.1 4443 192.168.13.133 443 --start-block 46 --stop-block 50
ब्लॉक चुनना: यदि आप ब्लॉक विकल्प निर्दिष्ट नहीं करते हैं, तो सभी ब्लॉक डिक्रिप्ट हो जाएंगे, लेकिन इसमें लंबा समय लग सकता है। मैं दृढ़ता से सलाह देता हूं कि आप जानें कि अनुरोध कैसे स्वरूपित किया जाएगा और जिस ब्लॉक को आप डिक्रिप्ट करना चाहते हैं उसे जानने के लिए request-splitter.py स्क्रिप्ट का उपयोग करें (आदर्श रूप से कुकी ब्लॉक! :)
फिर उदाहरण के लिए XSS का उपयोग करके संवेदनशील वेबसाइट में जावास्क्रिप्ट मैलिशियस कोड (poodle.js) डालें। पायथन स्क्रिप्ट लॉन्च करें और help टाइप करें, फिर search, और अंत में active। उस दौरान, जावास्क्रिप्ट के साथ केवल दो इंटरैक्शन की आवश्यकता होगी (search और active कमांड)।
अपडेट 01/04/2018: एक्सप्लॉइट में डाउनग्रेड विकल्प जोड़ा गया है। जब एक्सप्लॉइट TLS प्रोटोकॉल का पता लगाता है, तो SSLv3.0 पर डाउनग्रेड करने के लिए downgrade कमांड दर्ज करें।
यह कैसे काम करता है? हैंडशेक के दौरान (hello client के बाद), एक्सप्लॉइट एक handshake_failure 15030000020228 भेजता है, फिर ब्राउज़र को डिफ़ॉल्ट प्रोटोकॉल के रूप में SSLv3.0 के साथ hello client को फिर से भेजना चाहिए। Chrome संस्करण 15 पर परीक्षण किया गया, लेकिन यह Firefox पर काम नहीं कर रहा है (मुझे लगता है कि यह प्रोटोकॉल पुनर्वार्ता का समर्थन नहीं करता है), देखें #4
शोषण का पूरा वीडियो:

Asciinema: