网站首页 设为首页  收藏本站  注册  登录
要闻 城事 娱乐 文化 财富 房产 爆料 社会 时事 旅游 体育 教育 女性 汽车 视觉 龙江 健康家园 专题 生活社区
您当前的位置 :要闻 正文
ElasticSearchGroovy脚本远程代码执行漏洞分析(CVE-2015-1427)
http://mingche2.cn 2019-05-15

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

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


0x00 前言


ElasticSearch是一个JAVA开发的搜索分析引擎。2014年,曾经被曝出过一个远程代码执行漏洞(CVE-2014-3120),漏洞出现在脚本查询模块,由于搜索引擎支持使用脚本代码(MVEL),作为表达式进行数据操作,攻击者可以通过MVEL构造执行任意java代码,后来脚本语言引擎换成了Groovy,并且加入了沙盒进行控制,危险的代码会被拦截,结果这次由于沙盒限制的不严格,导致远程代码执行,目前网上还没看到公开的poc,经过一番研究,发现了利用方式,下面来看看漏洞是如何产生的。


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


0x01 细节


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


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就是执行结果:



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


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": "new java.lang.ProcessBuilder(\“calc\”)" } } }


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



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



从上面的白名单中可以看到,允许构造对象和方法调用的类,都是一些常规类,没有我们可以利用的类,而且如果我们想要利用反射去调用我们想调用的类,方法黑名单中又限制了getClass的调用,我们无法通过getClass方法获取Class对象,但是我们可以看到方法白名单中,并没有对forName方法进行限制,也就是说,如果我们能获取到Class对象,再调用forName方法就可以获取到我们想访问的类。 那么我们如何能够获取一个Class对象呢?首先我想到的是通过java.lang.String.class这样的方式,通过class让JVM返回String类的class对象,可以看到的确获取到了Class对象:



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



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



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


POST http://127.0.0.1:9200/_search?pretty HTTP/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\”)" } } }


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



0x02 参考

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


相关阅读:
九州娛樂城 http://tsts777.com

编辑:何双印
22.8K
相关报道
ElasticSearchGroovy脚本远程代码执行漏洞分析(CVE-2015-1427)
什么样的防辐射服好,唯有婧麒
什么食物降血压
描写景物的优美句子段落
港媒曝黄晓明Baby已分手 因男方偷搭“小三”
美国安全局NSA被曝在全球硬盘中藏间谍软件
西部欢迎谁
加强性功能的中药有哪些
沅纸学“雷峰活了”
再障性贫血是怎么引起的?
 
 
 热门新闻排行
· 什么样的防辐射服好,唯有婧麒
· 什么食物降血压
· 加强性功能的中药有哪些
· 冬季胃病多发,养胃食谱不可少
· 母校?伴我一路成长
· 王祖蓝娇妻为亿万豪宅选家具 宽衣脸圆孕味浓(图)
· 什么使记忆力下降呢
· 千方百计强健实体经济
· 初中体育教育教学反思
· 【产品动态】《九阳神功》迎来全新版本,六杰降世风云涌动
 推荐
· 描写景物的优美句子段落
· 港媒曝黄晓明Baby已分手 因男方偷搭“小三”
· 沅纸学“雷峰活了”
· 婴儿放屁使劲还会哭闹
· 北京社保网上服务平台官网+取号
· 上半年茅台销售额微增长 专家称416亿目标难实现
· 妇科霉菌是怎么回事
· 雷诺集团2017年销量达376万 同比增长8.5%
· 有米布局海外市场,力推开发者合作平台Adxmi
· 全国首个抢单作弊器大案被提起公诉 滴滴出行全面封禁作弊软件
要闻 | 龙江新闻 | 时事 | 社会 | 娱乐 | 文化 | 财富 | 房产 | 汽车 | 健康 | 论坛 | 旅游 | 体育 | 教育 | 女性 | 视觉新闻 | 金色夕阳 首页
麻城日报报业集团版权所有,未经允许不得镜像、复制、下载
麻城日报报业集团
黑ICP备11001326号-2