
अत्यधिक कॉन्फ़िगरेबल उपकरण, CVE-2023-44487 के विरुद्ध सर्वर की कमजोरी की जांच करने के लिए तेजी से HEADERS और RST_STREAM फ्रेम भेजकर और सर्वर की प्रतिक्रियाओं का दस्तावेजीकरण करके।
CVE-2023-44487, HTTP2 प्रोटोकॉल के विरुद्ध एक शोषण है। HTTP2 में, डेटा के अनुरोध HEADERS फ्रेम भेजकर शुरू किए जाते हैं। यह फ्रेम प्राप्त करने के बाद, सर्वर आपके अनुरोध को प्रोसेस करना शुरू करेगा, बाद में सभी डेटा ट्रांसमिट होने तक DATA फ्रेम भेजेगा। HTTP2 ने RST_STREAM फ्रेम भी निर्दिष्ट किया है, जिसका उपयोग किसी भी बिंदु पर स्ट्रीम को बंद करने के लिए किया जा सकता है। हमलों को रोकने के लिए, सर्वर आमतौर पर एक साथ खुली स्ट्रीम की अधिकतम संख्या को सीमित करते हैं (डिफ़ॉल्ट रूप से 100 तक)। यदि ग्राहक वास्तव में सभी संसाधनों के खपत होने की प्रतीक्षा करते हैं, तो यह सीमा शायद ही कभी पहुँची जाती है। हमला एक सरल कारण से काम करता है: एक क्लाइंट किसी भी बिंदु पर RST_STREAM फ्रेम भेज सकता है। RST_STREAM फ्रेम एक स्ट्रीम को बंद कर देता है, और बंद स्ट्रीम को समवर्ती स्ट्रीम के रूप में नहीं गिना जाता है। इसका मतलब है कि एक क्लाइंट अनुरोध भेजने के तुरंत बाद कनेक्शन बंद करके, इस सीमा को कभी भी हिट किए बिना तेज़ी से अनुरोध भेज सकता है। हमला किए जा रहे सर्वर, कुछ मामलों में, अभी भी डेटा लोड करना शुरू करेगा, जिससे अत्यधिक लोड उत्पन्न होगा।
यह उपकरण इस हमले के लिए सर्वर की भेद्यता की जांच करने का लक्ष्य रखता है। यह एक या अधिक समवर्ती HTTP2 कनेक्शन स्थापित करता है और फिर निर्दिष्ट संख्या में HEADER फ्रेम भेजता है, उसके बाद RST_STREAM फ्रेम भेजता है।
यह कई अन्य कॉन्फ़िगरेशन विकल्प भी प्रदान करता है, जैसे HEADERS और RST_STREAM फ्रेम के बीच देरी, खोलने के लिए स्ट्रीम की संख्या, प्रति स्ट्रीम भेजे जाने वाले फ्रेम की मात्रा, इत्यादि। हमला पूरा होने के बाद, यह एक सारांश प्रिंट करता है जिसमें प्राप्त फ्रेम की संख्या, साथ ही त्रुटियों और प्राप्त GOAWAY फ्रेम की संख्या के बारे में जानकारी होती है। यह आपको यह पहचानने में सहायता कर सकता है कि आपकी सेवाएँ CVE-2023-44487 के प्रति संवेदनशील हैं या नहीं।
अभी के लिए, यह उपकरण केवल स्रोत कोड के रूप में वितरित किया जाता है, जिसका अर्थ है कि go install आवश्यक है। उपकरण को go run main.go <options> चलाकर निष्पादित किया जा सकता है। एक python स्क्रिप्ट भी है जिसका उपयोग monitor.log फ़ाइल में लिखी गई विलंबता जानकारी को प्लॉट करने के लिए किया जा सकता है।
इसके अलावा, मैंने अधिक सटीक और व्यापक माप के लिए एक नया python उपकरण (tooling) बनाया है। tooling फ़ोल्डर में स्थित runner.py फ़ाइल आपके config.py (विवरण के लिए config-sample.py देखें) में परिभाषित मानों को पढ़ेगी और सभी परिभाषित डॉकर कंटेनरों के लिए सभी परीक्षण चलाएगी। यह फिर paths ऐरे में परिभाषित सभी पथों के लिए सबसे सफल परीक्षण (उच्चतम माध्यिका + मीन विलंबता) चलाएगा। यह प्रत्येक चलाए गए परीक्षण के लिए प्लॉट और लॉग फ़ाइलें आउटपुट करेगा। यह उपकरण अभी भी विकास के अधीन है। मैंने इसे केवल इसलिए बनाया क्योंकि मैं अपने शोध पत्र के लिए ये सभी परीक्षण मैन्युअल रूप से चलाने में बहुत आलसी था। बेझिझक इसे साफ करने या वास्तव में हमारे उपयोग के मामले से अधिक के लिए उपयोगी बनाने के लिए PR सबमिट करें।
वर्तमान में, निम्नलिखित CLI विकल्प लागू किए गए हैं:
उपकरण बहुत सारी डीबग जानकारी, साथ ही एक सारांश प्रिंट करेगा। डीबग जानकारी में कनेक्शन स्थापित करने के तरीके और वर्तमान प्रगति तथा वर्तमान में भेजे जा रहे फ्रेम के प्रकार के बारे में जानकारी होती है।
सारांश कुछ इस प्रकार दिखेगा (आपके कॉन्फ़िगरेशन पर निर्भर करता है)
####################SUMMARY####################
Packet types received:
PING: 2
HEADERS: 12
SETTINGS: 0
DATA: 11
GOAWAY: 3
RSTSTREAM: 0
WINDOWUPDATE: 0
UNKNOWN: 0
Attack ending reasons (per receiving thread):
GoAway events: 3
Timeout events: 0
Error events: 0
Summary for connection 2
PING: 1
HEADERS: 9
SETTINGS: 0
DATA: 6
GOAWAY: 1
RSTSTREAM: 0
WINDOWUPDATE: 0
UNKNOWN: 0
Reason for stopping to listen for more packets: GoAway - the server responded as expected.
Summary for connection 1
PING: 1
HEADERS: 3
SETTINGS: 0
DATA: 5
GOAWAY: 1
RSTSTREAM: 0
WINDOWUPDATE: 0
UNKNOWN: 0
Reason for stopping to listen for more packets: GoAway - the server responded as expected.
Summary for connection 0
PING: 0
HEADERS: 0
SETTINGS: 0
DATA: 0
GOAWAY: 1
RSTSTREAM: 0
WINDOWUPDATE: 0
UNKNOWN: 0
Reason for stopping to listen for more packets: GoAway - the server responded as expected.
यदि आपको लगता है कि अन्य आँकड़े एकत्र करने की आवश्यकता है - तो मुझसे संपर्क करने या एक मुद्दा (issue) बनाने में संकोच न करें!
यह उपकरण केवल शोध उद्देश्यों के लिए है। इसका उद्देश्य आपके स्वामित्व या प्रबंधन में नहीं आने वाले सर्वरों के विरुद्ध हमले चलाना नहीं है। मैं प्रदान किए गए आँकड़ों की सटीकता, न ही सर्वरों और सेवाओं के लिए हमलों और उनके परिणामों की कोई जिम्मेदारी लेता हूँ।
| Flag | Default | Meaning |
|---|
| frames | 1 | किसी भी स्ट्रीम पर भेजे जाने वाले HEADERS और RST_STREAM फ्रेम की संख्या |
| connections | 1 | हमला चलाने के लिए TLS कनेक्शनों की संख्या (समवर्ती) |
| consecutiveSends | 1 | RST_STREAM फ्रेम भेजने से पहले भेजे जाने वाले HEADERS फ्रेम की संख्या (प्रति प्रवाह) |
| connectAttempts | 1 | लगातार कनेक्शनों की संख्या जिन पर परीक्षण चलाना है (प्रति कनेक्ट-रूटीन) |
| delay | 0 | HEADERS और RST_STREAM फ्रेम भेजने के बीच प्रतीक्षा का समय (ms में) |
| ignoreGoAway | false | यदि true है, तो GOAWAY स्ट्रीम प्राप्त करने वाली रूटीन को समाप्त नहीं करेंगी। इसके बजाय, यह तब तक प्रतीक्षा करेगी जब तक 10 सेकंड से अधिक समय तक कोई फ्रेम प्राप्त न हो। |
| monitor | false | प्रदर्शन निगरानी सक्षम करें |
| monitorDelay | 100 | प्रतिक्रिया विलंबता के परीक्षण के बीच प्रतीक्षा का समय (ms में) |
| monitorLog | ./monitor.log | मॉनिटर विलंब लॉग लिखने के लिए फ़ाइल |
| routines | 1 | हमला करने के लिए स्ट्रीम की संख्या |
| skipValidation | true | यदि true है, तो सर्वर प्रमाणपत्र सत्यापित नहीं किया जाएगा (यह डिफ़ॉल्ट है - हम सुरक्षा की परवाह नहीं करते क्योंकि हम वैसे भी हमलावर हैं) |
| timeout | 1000 | नए फ्रेम की प्रतीक्षा करने का समय, इससे पहले कि कनेक्शन प्रयास को अमान्य मानकर रोक दिया जाए |
| url | https://localhost:433/ | हमला चलाने के लिए URL |