CVE-2020-14882\CVE-2020-14883漏洞分析

阅读量    170624 |

分享到: QQ空间 新浪微博 微信 QQ facebook twitter

 

引言

前几天外部爆出了oracle 14882和14883漏洞配合使用的poc,通过两个漏洞的配合可以直接造成rce漏洞,是一个十分值得重视的问题,而这个漏洞的利用poc当然是不止目前曝光出来的一种的,所以这里着重分析一下漏洞的成因,同时为各位大佬把poc玩出新的花样提供一个思路。

 

漏洞分析

首先来看POC

http://127.0.0.1:7001/console/images/%252E%252E%252Fconsole.portal?_nfpb=false&_pageLabel=&handle=com.tangosol.coherence.mvel2.sh.ShellSession(%22java.lang.Runtime.getRuntime().exec(%27whoami%27);%22);

看到POC基本能锁定这个漏洞主要的三个触发因子:

  1. 1、访问一些console后台的资源文件的时候,是不需要登录的。(当然这个设定大部分网站都有,不是什么大问题。)
  2. 2、weblogic会对提交的url进行两次url编码。(这一点似乎就和大部分中间件不太相似了)
  3. 3、weblogic的后管提供了具有代码执行能力的功能。

通过1和2的配合,可以通过/console/images/%252E%252E%252Fconsole.portal来实现路径跳跃,从而绕过了后管的登录限制。

通过3,就可以达到RCE的目的。

接下来我们对三个问题逐一进行分析。

问题一,weblogic的console中,哪些资源文件的访问不需要登录。
这个逻辑的处理代码在ServletSecurityManager.checkAccess中,首先应用会对路径进行分析,看一下是否是访问资源文件的,

跟进this.webAppSecurity.getConstraint直至StandardURLMapping.getExactOrPathMatch,在这里会去查看访问的url是否在资源文件的map中,这里无需多做分析,基于路径的资源文件名单自然是以包含作为匹配的依据,所以只要路径中包含map中的值,consloe在处理请求的时候,就不要求登录态,

具体的权限检查调用逻辑如下,首先在ChainedSecurityModule.checkAccess中会检测路径是否包含登录接口(j_security_check),

如果不包含,则进入CertSecurityModule.checkUserPerm,在这个函数中会检测配置常量protectResourceIfUnspecifiedConstraint的值(默认为false),如果是false就会进入WebAppSecurityWLS.hasPermission,查看是否有这个文件的访问权限,当然,资源文件的访问权限自然是有的,

于是应用就判断这条请求是具有权限的,checkAccess返回true,进入接下来的调用。

接下来就是问题二,weblogic究竟在哪个位置进行了二次url编码,一次url编码肯定是正常的 ,这是每个中间件都会做的事情,那我们顺着这条调用栈继续往下跟进,这段代码位于UIServletInternal.getTree处,在这里应用对已经进行了一次url编码的URI进行了第二次url编码

由于在后续的一系列操作中weblogic并没有在对路径穿越进行防范,从而造成了CVE-2020-14882漏洞,即后管权限绕过。

接下来就可以进入第三个问题了,命令执行的原因。
先从漏洞触发的入口类进行分析,BreadcrumbBacking.init类在处理后管请求的时候会去看一下提交的参数中是否有handle参数,

具体的操作逻辑在findFirstHandle中,

如果存在handle参数,就会把它的值传给HandleFactory.getHandle函数,而在这个函数中,会将形如aaa.bbb.class(“ccc”)的handleStr分解为两块,aaa.bbb.class作为被实例化的类,ccc作为参数,然后将ccc传入aaa.bbb.class的构造函数,并进行调用。

接下来就是一个gadgets的寻找问题了,什么类的构造函数调用后会造成rce的效果,目前公开的poc是coherence.jar中的类ShellSession,本文也就去分析一下这一条gadgets,看一下调用栈,

ShellSession类会把传入构造函数的值交给MVELInterpretedRuntime.parse,而MVELInterpretedRuntime会通过反射去执行java代码,从而造成了RCE。

这里可以看到MVELInterpretedRuntime是一个具有代码执行功能的类,在后续的漏洞挖掘中这个类说不定会再次登场。

 

总结

关于poc的重构造是有两个地方可以思考的,

第一点. 资源文件路径可以随意从上文中列出的map中寻找,这点很简单。

第二点. gadgets主要就是寻找构造函数具有反射或者代码执行能力的类即可。

分享到: QQ空间 新浪微博 微信 QQ facebook twitter
|推荐阅读
|发表评论
|评论列表
加载更多