Java DNS Deserialization, GadgetProbe and Java Deserialization Scanner
DNS अनुरोध पर डेसिरियलाइजेशन
क्लास java.net.URL
Serializable
को लागू करता है, इसका मतलब है कि यह क्लास सीरियलाइज किया जा सकता है।
यह क्लास का अजीब व्यवहार है। दस्तावेज़ से: “दो होस्ट को समान माना जाता है यदि दोनों होस्ट नामों को समान IP पतों में हल किया जा सके।”
फिर, हर बार जब एक URL ऑब्जेक्ट equals
या hashCode
में से किसी भी फ़ंक्शन को कॉल करता है, तो IP पता प्राप्त करने के लिए एक DNS अनुरोध भेजा जाएगा।
hashCode
फ़ंक्शन को एक URL ऑब्जेक्ट से कॉल करना काफी आसान है, बस इस ऑब्जेक्ट को एक HashMap
में डालना पर्याप्त है जिसे डेसिरियलाइज़ किया जाने वाला है। इसका कारण यह है कि readObject
फ़ंक्शन के अंत में HashMap
से यह कोड निष्पादित होता है:
यह चल रहा है putVal
को HashMap
के अंदर हर मान के साथ निष्पादित करने के लिए। लेकिन, अधिक प्रासंगिक है hash
को हर मान के साथ कॉल करना। यह hash
फ़ंक्शन का कोड है:
जैसा कि आप देख सकते हैं, जब डीसिरियलाइज़ किया जाता है एक HashMap
को, तो फ़ंक्शन hash
हर ऑब्जेक्ट के साथ निष्पादित होने जा रहा है और hash
निष्पादन के दौरान यह ऑब्जेक्ट का .hashCode()
निष्पादित करेगा। इसलिए, यदि आप एक HashMap
जिसमें एक URL ऑब्जेक्ट है, डीसिरियलाइज़ करते हैं, तो URL ऑब्जेक्ट .hashCode()
को निष्पादित करेगा।
अब, चलिए URLObject.hashCode()
के कोड पर नज़र डालते हैं:
जैसा कि आप देख सकते हैं, जब एक URLObject
.hashCode()
को निष्पादित करता है, तो इसे hashCode(this)
कहा जाता है। आगे आप इस फ़ंक्शन का कोड देख सकते हैं:
आप देख सकते हैं कि एक getHostAddress
डोमेन पर निष्पादित किया गया है, DNS क्वेरी लॉन्च कर रहा है।
इसलिए, इस क्लास का दुरुपयोग किया जा सकता है ताकि DNS क्वेरी लॉन्च की जा सके और दर्शाने के लिए कि डिसेरियलाइजेशन संभव है, या यहां तक कि जानकारी निकालने के लिए (आप एक कमांड निष्पादन के आउटपुट को उपडोमेन के रूप में जोड़ सकते हैं)।
URLDNS पेलोड कोड उदाहरण
आप URDNS पेलोड कोड ysoserial से यहाँ पा सकते हैं। हालाँकि, इसे कोड करना समझने में आसान बनाने के लिए मैंने अपना खुद का PoC बनाया (जो ysoserial से आधारित है):
अधिक जानकारी
मूल विचार में कॉमन कलेक्शंस पेलोड को DNS क्वेरी करने के लिए बदला गया था, यह प्रस्तावित विधि की तुलना में कम विश्वसनीय था, लेकिन यह पोस्ट है: https://www.gosecure.net/blog/2017/03/22/detecting-deserialization-bugs-with-dns-exfiltration/
GadgetProbe
आप GadgetProbe को Burp Suite App Store (Extender) से डाउनलोड कर सकते हैं।
GadgetProbe यह पता लगाने की कोशिश करेगा कि क्या कुछ Java क्लासेस मौजूद हैं सर्वर की Java क्लास पर ताकि आप जान सकें क्या यह किसी ज्ञात एक्सप्लॉइट के लिए संवेदनशील है।
यह कैसे काम करता है
GadgetProbe पिछले अनुभाग के समान DNS पेलोड का उपयोग करेगा लेकिन DNS क्वेरी चलाने से पहले यह एक मनमानी क्लास को डीसिरियलाइज़ करने की कोशिश करेगा। यदि मनमानी क्लास मौजूद है, तो DNS क्वेरी भेजी जाएगी और GadgetProbe नोट करेगा कि यह क्लास मौजूद है। यदि DNS अनुरोध कभी नहीं भेजा गया, तो इसका मतलब है कि मनमानी क्लास को सफलतापूर्वक डीसिरियलाइज़ नहीं किया गया इसलिए या तो यह मौजूद नहीं है या यह सीरियलाइज़ेबल/एक्सप्लॉइटेबल नहीं है।
गिटहब के अंदर, GadgetProbe में कुछ वर्डलिस्ट हैं जिनमें परीक्षण के लिए Java क्लासेस हैं।
अधिक जानकारी
Java Deserialization Scanner
यह स्कैनर Burp App Store (Extender) से डाउनलोड किया जा सकता है। एक्सटेंशन में पैसिव और सक्रिय क्षमताएँ हैं।
पैसिव
डिफ़ॉल्ट रूप से यह पैसिवली सभी अनुरोधों और प्रतिक्रियाओं की जांच करता है Java सीरियलाइज्ड मैजिक बाइट्स की तलाश में और यदि कोई पाया जाता है तो एक संवेदनशीलता चेतावनी प्रस्तुत करेगा:
सक्रिय
मैनुअल परीक्षण
आप एक अनुरोध का चयन कर सकते हैं, राइट-क्लिक करें और Send request to DS - Manual Testing
चुनें।
फिर, Deserialization Scanner Tab --> Manual testing tab के अंदर आप इंसर्शन पॉइंट का चयन कर सकते हैं। और परीक्षण शुरू करें (उपयुक्त हमले का चयन करें जो उपयोग की गई एन्कोडिंग के आधार पर हो)।
हालांकि इसे "मैनुअल परीक्षण" कहा जाता है, यह काफी स्वचालित है। यह स्वचालित रूप से जांच करेगा कि डिसिरियलाइजेशन किसी भी ysoserial पेलोड के लिए संवेदनशील है या नहीं, वेब सर्वर पर मौजूद पुस्तकालयों की जांच करके और संवेदनशील वाले को हाइलाइट करेगा। संवेदनशील पुस्तकालयों की जांच करने के लिए आप Javas Sleeps, CPU खपत के माध्यम से sleeps, या पहले उल्लेखित DNS का उपयोग करने का चयन कर सकते हैं।
एक्सप्लॉइटिंग
एक बार जब आप एक संवेदनशील पुस्तकालय की पहचान कर लेते हैं, तो आप अनुरोध को Exploiting Tab में भेज सकते हैं। इस टैब में आपको फिर से इंजेक्शन पॉइंट का चयन करना होगा, और पेलोड बनाने के लिए संवेदनशील पुस्तकालय और कमांड लिखना होगा। फिर, बस उपयुक्त हमला बटन दबाएं।
Java Deserialization DNS Exfil जानकारी
अपने पेलोड को कुछ इस तरह निष्पादित करें:
अधिक जानकारी
Last updated