
इस रिपॉजिटरी में CVE-2019-0217 के लिए एक प्रूफ ऑफ कॉन्सेप्ट एक्सप्लॉइट है, साथ ही एक Dockerfile भी है जो CVE के प्रति संवेदनशील वेब सर्वर स्थापित करने के लिए है।
Apache HTTP Server 2.4 रिलीज़ 2.4.38 और उससे पहले के संस्करणों में, थ्रेडेड सर्वर पर चलने पर mod_auth_digest में एक रेस कंडीशन किसी वैध क्रेडेंशियल वाले उपयोगकर्ता को किसी अन्य उपयोगकर्ता नाम का उपयोग करके प्रमाणित करने की अनुमति दे सकती है, जिससे कॉन्फ़िगर किए गए एक्सेस कंट्रोल प्रतिबंधों को बायपास किया जा सकता है।
जब कोई क्लाइंट HTTP डाइजेस्ट प्रमाणीकरण के पीछे किसी संसाधन तक पहुँचने का प्रयास करता है, तो सर्वर 401 स्टेटस कोड के साथ WWW-Authenticate हेडर भेजता है, लगभग नीचे दिए गए प्रारूप में:
Digest realm="rlm", nonce="TToc8M0jBgA=7afa4f292c97632a6c17eec458d3db31021b111f", algorithm=MD5, qop="auth"
क्लाइंट HA1 की गणना करता है, जो A1 का md5 डाइजेस्ट होता है (यानी username:realm:password), और फिर इसमें nonce और cnonce जैसे अन्य मेटाडेटा जोड़कर A2 प्राप्त करता है, जिसका md5 डाइजेस्ट बदले में HA2 देता है, जिसे क्लाइंट username, cnonce और अन्य मेटाडेटा के साथ Authentication हेडर में प्रतिक्रिया के रूप में भेजता है:
'Digest username="attacker", realm="rlm", nonce="TToc8M0jBgA=7afa4f292c97632a6c17eec458d3db31021b111f", uri="/scripts/userprofile.cgi", response="bcb433e4071fa228fe0c9452a7495efd", algorithm="MD5", qop="auth", nc=00000001, cnonce="2309510923095109"
^^^^^^^^^^
जैसा कि नीचे वर्णित है, उपरोक्त हेडर के हाइलाइट किए गए भाग में हेरफेर करके एक्सप्लॉइट के काम करने के लिए आवश्यक रेस कंडीशन बनाई जा सकती है।
इस भेद्यता को इस कमिट द्वारा ठीक किया गया था।
mod_auth_digest मॉड्यूल के कोड (विशेष रूप से mod_auth_digest.c में get_hash फ़ंक्शन) को देखने पर, यह स्पष्ट है कि सर्वर सबसे पहले Authentication हेडर को पार्स करता है ताकि यह निर्धारित किया जा सके कि username= के बाद उद्धरणों के भीतर क्या है, जिसे वह अनुरोध से जुड़े उपयोगकर्ता (r->user) के रूप में मानता है। फिर यह जाँचता है कि क्या यह "उपयोगकर्ता" अनुरोधित संसाधन तक पहुँच रखता है या नहीं। यदि रखता है, तो get_hash फ़ंक्शन प्रमाणीकरण फ़ाइल से संबंधित HA1 प्राप्त करता है।
भेद्यता-सुधार कमिट से पहले, इस प्रकार प्राप्त HA1 को conf = (digest_config_rec *) ap_get_module_config(r->per_dir_config,&auth_digest_module) चर में संग्रहीत किया जाता था, जो स्पष्ट रूप से थ्रेड-सुरक्षित नहीं है।
जो हमें एक्सप्लॉइट देता है:
ऊपर दिए गए भेद्यता विश्लेषण अनुभाग के आधार पर, वैध Authentication हेडर वाले अनुरोधों के साथ-साथ जाली Authentication हेडर वाले अनुरोध भेजकर रेस कंडीशन बनाना संभव होना चाहिए (जो वैध हेडर के समान है, लेकिन username= का मान लक्षित उपयोगकर्ता पर सेट होता है (अर्थात वह उपयोगकर्ता जिसके रूप में हमलावर प्रमाणित करना चाहता है))।
इस एक्सप्लॉइट में प्रयुक्त शब्दावली: - हमलावर: वह उपयोगकर्ता जो इस एक्सप्लॉइट को चलाता है। उनके पास अपने स्वयं के खाते के लिए एक वैध उपयोगकर्ता नाम और पासवर्ड होता है। - पीड़ित: वह उपयोगकर्ता जिसके रूप में हमलावर प्रस्तुत होना चाहता है। पीड़ित का उपयोगकर्ता नाम ज्ञात है, लेकिन पासवर्ड (स्पष्ट रूप से) नहीं है।
मैं इस विधि को पायथन थ्रेड्स की एक भीड़ को स्पैम करके चला सका, जिनमें से कुछ पहले प्रकार के अनुरोध भेजते थे और अन्य दूसरे प्रकार के, लेकिन यह अविश्वसनीय था और सफल होने के लिए बड़ी संख्या में अनुरोधों की आवश्यकता होती थी। इसने मुझे burp के turbo intruder (मुफ्त) का उपयोग करने के लिए प्रेरित किया, जो अनुरोधों को समानांतर में विश्वसनीय रूप से भेजता है। दुर्भाग्य से, turbo intruder का cli समर्थन टूटा हुआ है, इसलिए एक्सप्लॉइट के कुछ हिस्सों को GUI का उपयोग करके निष्पादित करने की आवश्यकता होती है।
इस रिपॉजिटरी में शामिल नमूना संवेदनशील सर्वर का उपयोग करने के लिए, चलाएँ:
$ cd sample_vulnerable_server
$ docker build -t poc_httpd .
$ docker run -p 8038:80 poc_httpd
generate_turbo_intruder_script.py चलाएँ, शीर्ष पर दिए गए चरों को कॉन्फ़िगर करने के बाद:
# Configuration
URL = 'http://localhost:8038/scripts/userprofile.cgi' # location to the resource protected by digest auth
ATTACKER_USERNAME = 'attacker'
ATTACKER_PASSWORD = 'known'
VICTIM_USERNAME = 'victim'
NUMBER_OF_REQUESTS = 2000 # number of concurrent requests sent to catch a glimpse of the race condition
यह स्क्रिप्ट फिर वर्तमान निर्देशिका में दो फ़ाइलें, generated/turbo_intruder_script.py और generated/request.txt उत्पन्न करती है।
अब BurpSuite Community Edition खोलें, और यदि आपने पहले से नहीं किया है, तो Extensions -> BApp Store पर जाकर "Turbo Intruder" एक्सटेंशन इंस्टॉल करें।
burp repeater खोलें। लक्ष्य का होस्ट और पोर्ट सेट करें:

generated/request.txt की सामग्री को Request अनुभाग में पेस्ट करें:

Request अनुभाग में कहीं भी राइट क्लिक करें, और 'Extensions->Turbo Intruder->Send to Turbo Intruder' चुनें।

generated/turbo_intruder_script.py की सामग्री को script अनुभाग में पेस्ट करें:

अंत में, Turbo Intruder विंडो के नीचे Attack बटन पर क्लिक करें। इसे परिणामी स्क्रीन पर कोई भी सफल परिणाम दिखाना चाहिए:
