
Oracle WebLogic ADF Faces के लिए प्री-ऑथेंटिकेशन रिमोट कोड एक्ज़ीक्यूशन एक्सप्लॉइट (CVE-2022-21445, CVSS 9.8)। इसमें पेनिट्रेशन टेस्टिंग के लिए विस्तृत पर्यावरण सेटअप, पेलोड जनरेशन और रिमोट डीबगिंग निर्देश शामिल हैं।
CVE-2022-21445 (CVSS स्कोर 9.8), यह कमजोरी अविश्वसनीय डेटा का डिक्रिप्शन है, जो ADF Faces घटक में मौजूद है, और हैकर्स द्वारा बिना प्रमाणीकरण (pre-authentication) के दूर से RCE निष्पादित करने के लिए शोषित किया जा सकता है।
उपरोक्त कमजोरी को दो साइबर सुरक्षा विशेषज्ञों द्वारा खोजा गया था: VNG Corporation के PeterJson और VNPT के Nguyen Jang। Oracle को यह रिपोर्ट अक्टूबर 2021 में प्राप्त हुई और पैच जारी करने में 6 महीने लगे, अर्थात् अप्रैल 2022 तक।
इस लेख में, शोषण Oracle Business Intelligence संस्करण 12.2.1.4.0 पर केंद्रित है।
शर्तें: विंडोज 10+ प्रो या विंडोज होम (x64) सक्रिय लाइसेंस के साथ या विंडोज सर्वर (Oracle उत्पादों को प्राथमिकता दें) स्थापित करें।
चरण 1: जावा स्थापित करें, jdk 8u112 या उच्चतर संस्करण (8Ux), डाउनलोड लिंक: JDKv8U112

चरण 2: Oracle Database 19c स्थापित करें, डाउनलोड लिंक: Oracle 19c
डेटाबेस स्थापित करने के लिए एक फ़ोल्डर तैयार करें, नीचे दिए गए पथ जैसा पथ बनाएं और डाउनलोड किए गए डेटाबेस ज़िप फ़ाइल को यहाँ अनज़िप करें C:\app\oracle\product\19c\db_home1
व्यवस्थापक अधिकारों के साथ setup.application फ़ाइल चलाएं

DB स्थापना मार्गदर्शिका में दिए गए निर्देशों के अनुसार चरण दर चरण प्रक्रिया करें।
अत्यंत महत्वपूर्ण:
चरण 8/17 पर, Create as Container database चुनना सुनिश्चित करें ताकि आगामी Fusion Middleware स्थापना प्रक्रिया के लिए एक प्लगेबल डेटाबेस खोला जा सके

चरण 9/17 पर, अक्षर सेट को यूनिकोड (AL32UTF8) चुनें



चरण 3: SQL Developer स्थापित करें, no-jre संस्करण, डाउनलोड लिंक: SQLDev-NoJRE

व्यवस्थापक अधिकारों के साथ sqldeveloper.application फ़ाइल चलाएं

नीचे दिए गए चित्र के अनुसार एक नए कनेक्शन के लिए पैरामीटर सेट करें, उपयोगकर्ता नाम और पासवर्ड बदलना सुनिश्चित करें (जैसा कि ऊपर दिए गए उदाहरण में hr है), होस्टनाम (डिफ़ॉल्ट localhost), पोर्ट (डिफ़ॉल्ट 1521), SID (चरण 2 में स्थापित वैश्विक डेटाबेस नाम)

यदि Test चुनने पर Success संदेश दिखाई देता है, तो कनेक्शन सफल है, Connect चुनें।
चरण 4: Fusion Middleware Infrastructure (FMW) संस्करण 12.2.1.3.0 स्थापित करें, डाउनलोड लिंक FMW_ver_12.2.1.3.0

चरण 5: Oracle Business Intelligence (OBIEE) संस्करण 12.2.1.4.0 स्थापित करें, डाउनलोड लिंक: OBIEE_ver_12.2.1.4.0
व्यवस्थापक अधिकारों के साथ setup_bi_platform-12.2.1.4.0_win64.exe फ़ाइल चलाएं

OBIEE स्थापना मार्गदर्शिका के अनुसार चरण दर चरण स्थापित करें।
ध्यान दें: BI का पथ FWM स्थापना पथ के समान होना चाहिए, जैसे कि यहाँ Oracle/Middleware/Oracle_Home है

चरण 6: Repository Creation Utility (RCU) का उपयोग करके BI स्कीमा सेट करें।
पथ C:\Oracle\Middleware\Oracle_Home\oracle_common\bin पर, व्यवस्थापक अधिकारों के साथ rcu.bat फ़ाइल चलाएं
निम्नलिखित चरणों का पालन करें:




चरण 7: OBIEE के लिए वातावरण चर सेट करें।

चरण 8: BI डोमेन बनाएं।





चरण 4 में, यदि सिस्टम fail to logon दिखाता है, तो डोमेन पासवर्ड की जाँच करें कि क्या यह सही है।
चरण 8 में, यदि सिस्टम नीचे दिए गए चित्र के अनुसार त्रुटि दिखाता है, तो जाँच करें कि क्या आपने विंडोज लाइसेंस सक्रिय किया है और क्या आपका विंडोज शर्तों में वर्णित है।
![]()
चरण 9: सेटअप पूरा करने के बाद, अभी बनाए गए bi डोमेन पर पथ $Oracle_Home\user_projects\domains\bi\servers\AdminServer\tmp_WL_user\adf.oracle.domain.webapp\i83uao पर जाएं।
यहाँ से सभी jar फ़ाइलों को एक अलग फ़ोल्डर में कॉपी करें, और इसे हमलावर मशीन (लैब वातावरण में ऐसा करें, वास्तविक हमले के दौरान हमलावर मशीन पर भी लक्ष्य मशीन की तरह ही स्थापित करना होगा ताकि स्रोत कोड प्राप्त किया जा सके) पर साझा करें।
पथ $Oracle_Home\coherence\lib से coherence.jar लाइब्रेरी को भी इस फ़ोल्डर में जोड़ें।
यह एक महत्वपूर्ण फ़ोल्डर है जो पेलोड की सफलता निर्धारित करता है क्योंकि FMW या BI के प्रत्येक संस्करण या प्रत्येक मशीन का वातावरण अलग-अलग होता है, इसलिए पेलोड संचरण के दौरान जोखिम या अपवादों को कम करने के लिए सटीक संस्करण की आवश्यकता होती है।
चरण 10 (केवल यदि रिमोट डीबगिंग आवश्यक हो तो करें; यदि वास्तविक वातावरण में परीक्षण कर रहे हैं, तो पीड़ित मशीन को स्वतंत्र रूप से सेट नहीं किया जा सकता, इसलिए हमलावर को अपनी मशीन पर लक्ष्य मशीन सेटअप भी करना होगा ताकि रिमोट डीबगिंग करके त्रुटियों की जांच की जा सके)।
मोज़िला स्थापित करें, पोर्ट 8181 के साथ बर्प प्रॉक्सी जोड़ें।
BI सर्वर पर रिमोट डीबग चालू करें।
localhost:9500/console पर जाएं।
डोमेन संरचना -> bi चुनें -> वातावरण -> सर्वर

दो सर्वर दिखाई देंगे: weblogic का AdminServer और BI का bi_server1।
चित्र 10.2: सर्वर सूची दिखाई देती है
बाएँ कोने में Lock & Edit चुनें, कॉन्फ़िगरेशन संपादित करने के लिए bi_server1 चुनें। यहाँ, कॉन्फ़िगरेशन -> सर्वर प्रारंभ -> अंत तक स्क्रॉल करें, एडवांस्ड चुनें (यदि उपलब्ध हो) -> आर्गुमेंट्स में जोड़ने के लिए चुनें -> डीबग पैरामीटर दर्ज करें:
-Xdebug -Xnoagent – Xrunjdwp:transport=dt_socket,address=5005,server=y,suspend=n
(यदि बाद में bi_server1 को पुनरारंभ करने में त्रुटि होती है, तो 0.0.0.0:5005 के साथ प्रयास करें)
weblogic पासवर्ड दर्ज करें (जो पहले कॉन्फ़िग BI डोमेन में सेट किया गया था) -> Apply change & Restart
टर्मिनल प्रशासक प्रारंभ करें -> पथ $Oracle_Home\user_projects\domains\bi\bitools\bin पर नेविगेट करें और ./stop.cmd और ./start.cmd चलाएं ताकि bi_server1 पुनरारंभ हो, पुनरारंभ प्रक्रिया के दौरान यदि कोई त्रुटि नहीं होती है, तो डीबग खुल गया है और उपरोक्त पोर्ट 5005 पर सुन रहा है। यदि त्रुटि होती है, तो ऊपर दिए गए डीबग पैरामीटर की जाँच करें कि कहीं अनावश्यक स्थान या पते में कोई त्रुटि तो नहीं है।
चरण 1: IntelliJ IDEA Ultimate डाउनलोड करें, github पर कोड खोजकर सक्रिय करें।
चरण 2 (यह चरण केवल तब करें यदि हमले की प्रक्रिया में 500 सर्वर त्रुटि, ... जैसी त्रुटि आती है, तो यह पेलोड में अपवाद के कारण होता है)
प्रोजेक्ट के jdk – sdk संस्करण को लक्ष्य मशीन के समान संस्करण में बदलें (स्थापना विधि लक्ष्य मशीन - चरण 1 के अनुसार)।
स्रोत कोड का विश्लेषण करने और रिमोट डीबगिंग के लिए एक खाली प्रोजेक्ट बनाएं।
लक्ष्य मशीन से प्राप्त फ़ोल्डर की सभी jar फ़ाइलों को इस प्रोजेक्ट में जोड़ें।
प्रोजेक्ट संरचना -> मॉड्यूल -> + चुनें -> 1 JARS या निर्देशिकाएँ -> पूरी jar निर्देशिका जोड़ें।


रिमोट डीबग सेट करें।
रन -> संपादन कॉन्फ़िगरेशन -> + -> रिमोट JVM डीबग

रिमोट डीबग चलाएं, यदि कंसोल में संदेश आता है: Connected … तो यह सफल है।

चरण 3:
इस रिपॉजिटरी से कोड को मशीन पर क्लोन करें, lib फ़ोल्डर से पुरानी coherence.jar फ़ाइल हटाएं और इसे पिछले चरण में लक्ष्य मशीन से प्राप्त फ़ाइल से बदलें।
इसके बाद, इसे IntelliJ का उपयोग करके चलाने वाले प्रोजेक्ट में जोड़ें, lib में सभी jar फ़ाइलों को लाइब्रेरी के रूप में जोड़ें विकल्प के साथ जोड़ें।
LambdaIdentity$.... का वर्ग नाम Weblogic संस्करण के अनुसार सही है या नहीं जाँचें, यदि कोई परिवर्तन है तो फ़ाइल को रीफैक्टर करें और उस फ़ाइल का नाम बदलें।
Weblogic 12.2.1.3: LambdaIdentity$E12ECA49F06D0401A9D406B2DCC7463A
Weblogic 12.2.1.4: LambdaIdentity$423B02C050017B24DB10DFF759AA56BF
Main.java फ़ाइल में LambdaIdentity$....class फ़ाइल के पथ को संपादित करें। सटीक पथ प्राप्त करने के दो तरीके हैं: javac jar फ़ाइल चलाकर .class फ़ाइल उत्पन्न करें; दूसरा तरीका main फ़ंक्शन के कोड को कमेंट करें, फिर इस प्रोजेक्ट को सामान्य रूप से चलाएं, वर्ग फ़ाइल का पथ target फ़ोल्डर में पाया जा सकता है।
प्रोजेक्ट का jdk और sdk लक्ष्य मशीन के समान है या नहीं जाँचें।
हम web.xml फ़ाइल देखते हैं, यह फ़ाइल servlet-mapping से संबंधित मैपिंग संबंधों का वर्णन करती है। "resources" एक servlet है जो सिस्टम संसाधनों से संबंधित है, इसमें महत्वपूर्ण डेटा और जानकारी होती है, इसलिए यह वह स्थान है जहाँ हमलावर अक्सर निशाना लगाते हैं।






RemoteApplicationResourceLoader.class में findResource() फ़ंक्शन का विश्लेषण

यह फ़ंक्शन एक विधि लौटाता है जिसमें कस्टम प्रोटोकॉल RAStreamHandler() शामिल है। RAStreamHandler() new RAURLConnection मान के साथ एक URLConnection ऑब्जेक्ट बनाएगा।

RAURLConnection फ़ंक्शन _getPathBean को कॉल करता है।

_getPathBean फ़ंक्शन में एक बीन ऑब्जेक्ट होता है जो getInstanceFromString() फ़ंक्शन को कॉल करके बनाया जाता है, जो इनपुट स्ट्रिंग को संसाधित करके संबंधित कुंजियाँ (फ़िल्टर) प्राप्त करता है।

इनपुट बीन स्ट्रिंग को SerializationUtils वर्ग के माध्यम से URL एन्कोडेड रूप से एक URLEncoderPathBean ऑब्जेक्ट में बदल दिया जाएगा। यदि सब कुछ ठीक रहता है, तो आगे का इनपुट fromURLEncodeString() फ़ंक्शन में पारित किया जाएगा।


यदि इनपुट स्ट्रिंग में त्रुटि होती है, तो एक अपवाद उत्पन्न होगा। अपवाद मुख्य रूप से पेलोड में उपयोग की जाने वाली लाइब्रेरी के कारण होता है, संस्करण बेमेल या Lambda फ़ाइल के पथ में त्रुटि के कारण।
fromURLEncodedString() फ़ंक्शन में, एक fromString फ़ंक्शन url पैरामीटर के साथ लौटाया जाता है, और इसका कोड इस प्रकार है:

fromString फ़ंक्शन में, डेटा readObject() द्वारा पढ़ा जाता है और वापस किया जाता है। यह देखा जा सकता है कि इनपुट किसी भी फ़िल्टरिंग के बिना है। यह कई फ़ंक्शनों से होकर बहता है और अंततः fromString() में डीसीरियलाइज़ होता है। यह शोषण के लिए सिंक है। सिंक मिल गया है, अब स्रोत खोजना बाकी है।
इसलिए, उपरोक्त क्लास को कॉल करने के लिए हमें “/.*/remote/(.*)” जैसे regex की आवश्यकता है। इसलिए, जब राउटर या इनपुट पथ /em/afr/foo/remote/payload जैसा होता है, तो यह इस फ़ाइल में निर्दिष्ट संरचना को संतुष्ट करेगा, तब RemoteApplicationResourceLoader का उपयोग doGet पर लोडर के रूप में किया जाएगा, और संबंधित क्लास फ़ाइल oracle.adfinternal.view.resource.rich.RemoteApplicationResourceLoader इसमें ओवरराइड किए गए findResource() फ़ंक्शन को कॉल करेगा। इसलिए यदि पेलोड सही पते पर भेजा जाता है, तो डेटा आसानी से प्रसारित हो जाएगा और फ़िल्टर में नहीं फंसेगा।
यह अंतिम URL है जिसका उपयोग शोषण के लिए किया जाता है:
__hostname:port/contextApp/afr/foo/remote/payload/__
जहाँ contextApp उन पथों में से एक है जो OBIEE स्थापित करने के बाद होते हैं जैसे /em; /bicomposer; ….
Foo कोई भी स्ट्रिंग है
Payload वह स्ट्रिंग है जो तैयार किए गए आक्रमण प्रोजेक्ट के Main फ़ंक्शन को चलाने पर उत्पन्न होती है।
### पेलोड बनाने के लिए कोड का विश्लेषण
यह प्रोजेक्ट CVE-2020-14644 के गैजेट चेन का अनुसरण करता है

Class LambdaIdentity$E12ECA49F06D0401A9D406B2DCC7463A AbstractRemotable से विरासत में मिला है और इसका उपयोग दूरस्थ प्रणाली के साथ इंटरैक्ट करने के लिए किया जाता है।
Java Reflection API का उपयोग करके, हमलावर वर्तमान निष्पादन थ्रेड से WorkAdapter आसानी से प्राप्त कर सकता है।
इसके बाद WorkAdapter का connectionHandler फ़ील्ड प्राप्त करेगा और connectionHandler से ServletRequest और ServletResponse प्राप्त करने के लिए क्वेरी करेगा।
इसके बाद, अनुरोध (ServletRequest) से "cmd" हेडर का मान प्राप्त करें, फिर जाँचें कि क्या "cmd" खाली नहीं है, तो वर्तमान चल रहे ऑपरेटिंग सिस्टम (Windows या Linux/Unix) के अनुसार एक शेल कमांड निष्पादित करें।
शेल कमांड से परिणाम पढ़ें और उस परिणाम को प्रतिक्रिया (ServletResponse) में भेजें।
यदि निष्पादन के दौरान कोई त्रुटि होती है, तो उन्हें printStackTrace() विधि के माध्यम से कंसोल स्क्रीन पर मुद्रित किया जाएगा।
LamdaIdentity वर्ग के नाम के पीछे का Id weblogic सर्वर के संस्करण पर निर्भर करता है, यह com.tangosol.internal.util.invoke.ClassIdentity वर्ग के MD5 हैश मान के अनुसार एन्कोडेड एक स्ट्रिंग है, और चूँकि प्रत्येक संस्करण में यह वर्ग अलग होता है, इसलिए जैसा कि कहा गया है, पेलोड में त्रुटि न हो इसके लिए इसकी सावधानीपूर्वक जाँच की जानी चाहिए।
यहाँ, इनपुट अनुरोध के हेडर से एक cmd वेरिएबल लिया जाता है, फिर इसे नीचे दिए गए Runtime.getRumtime.exec() कमांड में जोड़ा जाता है, md5 हेक्स कोड के रूप में एन्कोड और डीकोड किया जाता है, और OBIEE सिस्टम पर भेजे जाने के बाद deserialization मान लौटाता है।
अंत में, Main फ़ंक्शन में, एक RemoteConstructor ऑब्जेक्ट बनाया जाता है, जिसे SerializationUtils लाइब्रेरी के माध्यम से URL एन्कोडेड स्ट्रिंग में परिवर्तित किया जाता है। यह स्ट्रिंग सीधे स्रोत URL में डाली जाती है, जिससे हमलावरों को मनमाना __cmd__ कमांड डालने का अवसर मिलता है।

## शोषण का पुनरुत्पादन


## संदर्भ
1. https://peterjson.medium.com/miracle-one-vulnerability-to-rule-them-all-c3aed9edeea2
2. https://testbnull.medium.com/oracle-access-manager-pre-auth-rce-cve-2021-35587-analysis-1302a4542316
## भेद्यता के लेखक: Jang Nguyen और Duc PeterJson