
CVE-2020-2551 POC इंटरनेट पर उपयोग करने के लिए
टेस्ट POC (इंटरनेट परीक्षण के लिए उपलब्ध)
python CVE-2020-2551.py [HOST] [IP]
codebase को संशोधित करके दूरस्थ क्लास लोडिंग का प्रयास (विफल)
python CVE-2020-TEST.py [HOST] [IP]
(पहली बार Anquanke पर प्रकाशित, मूल लिंक)
इस भेद्यता को सीखने के लिए कुछ पूर्वापेक्षित ज्ञान आवश्यक है, जैसे CORBA और RMI।
संक्षेप में एक अवलोकन:
CORBA, OMG द्वारा विकसित एक तकनीकी मानक है, जिसका उपयोग वितरित अनुप्रयोगों के लिए किया जाता है। इसमें क्रॉस-भाषा समर्थन के लिए IDL का उपयोग होता है, और क्लाइंट तथा सर्वर के बीच संचार IIOP प्रोटोकॉल के माध्यम से होता है।
RMI एक अन्य वितरित अनुप्रयोग तकनीक है; Java में JNDI का उपयोग करके इसे सरल बनाया जा सकता है। क्लाइंट और सर्वर JRMP प्रोटोकॉल के माध्यम से संचार करते हैं, हालाँकि weblogic में RMI T3 प्रोटोकॉल का उपयोग करता है। इस संबंध में पहले भी कई भेद्यताएँ सामने आ चुकी हैं।
RMI-IIOP RMI और CORBA दोनों की अपनी-अपनी खूबियों को जोड़ता है और IIOP प्रोटोकॉल के माध्यम से RMI अनुप्रयोगों को तैनात करता है।
आधिकारिक दस्तावेज़ में भी उल्लेख है:
RMI सर्वर ऑब्जेक्ट IIOP प्रोटोकॉल का उपयोग कर सकते हैं और किसी भी भाषा में लिखे गए CORBA क्लाइंट ऑब्जेक्ट के साथ संचार कर सकते हैं।
फिलहाल weblogic पर ध्यान केंद्रित न करते हुए, पहले देखें कि RMI-IIOP उदाहरण कैसे लिखा जाता है:
क्लाइंट कोड के लिए, Java में RMI, JNDI, LDAP, JRMP, JMX, JMS वाली बातें (भाग 1) में दिए गए परीक्षण प्रोजेक्ट को देख सकते हैं। आप HelloClient और HelloServer को स्वयं कंपाइल कर सकते हैं, या परीक्षण प्रोजेक्ट में पहले से कंपाइल किए गए बाइनरी का उपयोग कर सकते हैं।
कमांड लाइन पर नेम सर्वर (Java के साथ आता है) प्रारंभ करें:
start orbd -ORBInitialPort 1050
कमांड लाइन से HelloServer सर्वर प्रारंभ करें और रिमोट डिबगिंग कॉन्फ़िगर करें। IDEA से रिमोट डिबगिंग कैसे करें, इसके लिए यहाँ के आरंभ में बताई गई विधि देखें।
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 HelloServer
बेशक, रिमोट डिबगिंग के बिना भी सीधे परिणाम देख सकते हैं; सीधे चलाएँ:
java HelloServer
कमांड लाइन से क्लाइंट प्रारंभ करें:
Java HelloClient
इस समय एक कैलकुलेटर खुलेगा। यदि रिमोट डिबगिंग सफल होती है, तो आप निम्न कॉल स्टैक देख सकते हैं:

EvilMessage.readObejct() में कमांड निष्पादित होता है

एक अलग बात: weblogic की स्थापना और डिबगिंग पर लेख
तो weblogic में RMI-IIOP कैसा है? Java में RMI-IIOP के बारे में लेख में weblogic RMI-IIOP के शोषण का उल्लेख है; उसी के आधार पर कुछ शोध किए गए। WebLogic के IIOP पर RMI का उपयोग करना में weblogic द्वारा RMI-IIOP क्लाइंट का उपयोग करने के कई तरीके बताए गए हैं, जिनमें शामिल हैं:
पहले दो तरीकों के बीच अंतर केवल JNDI_FACTORY सेटिंग में प्रतीत होता है।

पहले जब weblogic T3 डिसीरियलाइज़ेशन का अध्ययन किया, तो weblogic पर एक Helloserver एप्लिकेशन तैनात किया था, जिसमें sayhello() विधि का उपयोग किया जा सकता है। दोनों JNDI_FACTORY सेटिंग्स आज़माने के बाद, दूसरी JNDI_FACTORY से sayHello() विधि सफलतापूर्वक कॉल हुई।

तो हमने weblogic T3 प्रोटोकॉल के POC को संशोधित किया — वास्तव में केवल RMI को IIOP में बदला। देखा कि jtaTransactionManager शोषण श्रृंखला सफलतापूर्वक निष्पादित हुई और स्थानीय jrmplisten को एक jrmp अनुरोध भेजा।

ट्रैफ़िक देखें; जब remove() विधि कॉल होती है, तो remove__java_lang_Object अनुरोध भेजा जाता है। ट्रैफ़िक में दुर्भावनापूर्ण डेटा है, लेकिन aced मैजिक हेडर नहीं मिला।

अनुमान है कि सर्वर पक्ष पर विशेष पार्सिंग के बाद डेटा का डिसीरियलाइज़ेशन होता है। कॉल स्टैक देखने पर पता चलता है कि बाद वाला भाग पहले वाले नेटिव RMI-IIOP निष्पादन श्रृंखला के समान है। पहले यह CDRInputStream.read_value() से ट्रिगर होता था; यहाँ यह weblogic में IIOPInputStream.read_value() से ट्रिगर होता है। (यह read_value बिंदु 2019 की प्रस्तुति में भी उल्लिखित है।)

यहाँ अनुरोध पहले clusterableServerRef.invoke() को दिया जाता है, और विभिन्न invoker के अनुसार this.invoker.invoke() कॉल होता है। फिर यहाँ Mejb_dj5nps_HomeImpl_WLSkel.invoke() कॉल होता है। चूँकि यह "remove" है, यह case 6 ब्रांच में जाता है और IIOPInputStream.readObject() को कॉल करता है; read_value() विधि में IIOPInputStream डेटा पार्स होकर डिसीरियलाइज़ेशन ट्रिगर होता है। यह remove() विधि का उपयोग करने वाला POC है।
Lucifaer के [विश्लेषण लेख](https://lucifaer.com/2020/02/25/WebLogic WLS核心组件RCE分析(CVE-2020-2551)/?from=timeline&isappinstalled=0#2-2-Weblogic解析流程) में bind() विधि के माध्यम से शोषण का उल्लेख है; यह इंटरनेट पर मुख्यधारा का शोषण तरीका भी है। कॉल स्टैक का अनुसरण करें।

पहले जैसे ही, यहाँ अनुरोध पहले clusterableServerRef.invoke() को दिया जाता है, और विभिन्न invoker के अनुसार this.invoker.invoke() कॉल होता है। यहाँ CobraServerRef.invoke() कॉल होता है, फिर _NamingContextAnyImplBase._invoke() में, चूँकि va1 "bind_any" है, यह case 0 ब्रांच में जाता है और IIOPInputStream.read_any() विधि कॉल करता है; आगे भी IIOPInputStream.read_value() कॉल होकर डिसीरियलाइज़ेशन ट्रिगर करता है। पहले कहा गया था कि ट्रैफ़िक में aced मैजिक हेडर नहीं दिखा, इसका कारण यह है कि IIOPInputStream में एक पार्सिंग विधि है। IIOPInputStream का hex-value रूप निम्न है, जिसमें क्लास नाम और फ़ील्ड जानकारी शामिल होती है:

अंततः दुर्भावनापूर्ण क्लास की readObejct() विधि कॉल होती है।

पैच देखने पर पता चला कि यह 2015 में T3 डिसीरियलाइज़ेशन शोषण के पैच के समान स्थान पर है।