Oracle Access Manager是Oracle公司出品的一款单点登陆认证管理系统。提供了基于Web的身份4管理,以及对运行于异类环境中的Web应用程序和资源的访问控制。它提供用户和组管理、委托管理、口令管理和自助服务功能,以便在复杂的、以目录为中心的环境中管理大量用户。
近日Oracle官方通报了Oracle Access Manager存在命令执行漏洞CVE-2021–35587:
这是一个匿名反序列化漏洞,下面给小伙伴们分享一下漏洞触发原理,并提供命令执行利用链和命令回显思路。
Oracle Access Manager搭建过程比较繁琐,经过无数次失败尝试,最终通过docker成功搭建Oracle Access Manager v12.2.1.4版本的研究环境(除了Oracle Access Manager之外,还需要搭建一个Oracle数据库,也通过docker方式完成)。Oracle Access Manager docker搭建可以参考:
Oracle Access Manager搭建
https://docs.oracle.com/en/middleware/idm/access-manager/12.2.1.4/tutorial-oam-docker/]
启动Admin Server:
查看内置的Java版本为1.8.281:
然后再启动Manage Server:
为了方便分析,配置远程调试。与Weblogic一样,修改`bin/setDomainEnv.sh`添加调试设置:
重新构建docker进程并启动:
从公开信息来看,漏洞位于`AMServlet`接口:
`AMServlet`接口位于`pbl.jar`:
执行`AMServlet.handleRequest`:
在`PBLFlowManager.processRequest`中根据请求URL`/oam/server/opensso/sessionservice`获取EVENT类型,每一个URL对应一个事件处理:
接下来继续执行`PBLFlowManager.handleBaseEvent`,这个函数中有几个值得说明的点:
-
首先根据`baseEventMint`的值,调用`getRequestHandler`获取处理Handler,最后获得处理类`AgentRequestHandler`;
-
通过`requestHandler.process`执行`AgentRequestHandler.process`,用于检查输入的XML数据;
-
继续执行`delegateToMasterController`,该函数最终会调用到`Unmarshell`危险反序列化函数。
首先来看`AgentRequestHandler.process`函数,它调用了`handleXMLRequest`验证XML数据:
`handleXMLRequest`提取XML内容后调用`handleRequest`方法:
接下来调用`isValid`验证数据合法性,然后调用`getServiceHandler`和`handler.process`:
`isValid`检查数据中必须包含特定属性,值从XML数据中读取,示例请求如下:
<RequestSet vers="vers123" svcid="session" reqid="req_1"><Request dtdid="dtd1" sid="sid1">Data</Request></RequestSet>
`getServiceHandler`返回处理接口,分为四种类型。这里调试的时候并不能执行到`new SessionRequestHandler`语句:
接下来执行`SessionRequestHandler`函数继续处理XML数据:
读取`requester`的值并base64解码:
至此绕过了`Process`检查:
接下来在`PBLFlowManager.handleBaseEvent`中调用执行:
delegateToMasterController
-> MasterController.process
-> MasterController.processRequest
-> OpenssoEngineController.processEvent
`ProcessEvent`函数包含一个很大的Switch语句,`OPENSSO_CHECK_VALID_SESSION`调用了`unmarshal`:
`unmarshal`函数检查`requester`内容,当数据以`object:`开头时调用了`readObject`反序列化函数:
Oracle Access Manager是基于Weblogic进行构建的,可以尝试直接利用Weblogic的反序列化利用链进行测试,分析发现存在黑名单过滤机制:
黑名单列表如下:
!org.codehaus.groovy.runtime.ConvertedClosure;
!org.codehaus.groovy.runtime.ConversionHandler;
!org.codehaus.groovy.runtime.MethodClosure;
!org.springframework.transaction.support.AbstractPlatformTransactionManager;
!java.rmi.server.UnicastRemoteObject;
!java.rmi.server.RemoteObjectInvocationHandler;
!com.bea.core.repackaged.springframework.transaction.support.AbstractPlatformTransactionManager;
!java.rmi.server.RemoteObject;!org.apache.commons.collections.functors.*;
!com.sun.org.apache.xalan.internal.xsltc.trax.*;
!javassist.*;
!java.rmi.activation.*;
!sun.rmi.server.*;
!org.jboss.interceptor.builder.*;
!org.jboss.interceptor.reader.*;
!org.jboss.interceptor.proxy.*;
!org.jboss.interceptor.spi.metadata.*;
!org.jboss.interceptor.spi.model.*;
!com.bea.core.repackaged.springframework.aop.aspectj.*;
!com.bea.core.repackaged.springframework.aop.aspectj.annotation.*;
!com.bea.core.repackaged.springframework.aop.aspectj.autoproxy.*;
!com.bea.core.repackaged.springframework.beans.factory.support.*;
!org.python.core.*
从黑名单来看,一些Weblogic较新的gadget是可以使用的,比如CVE-2020–14644,但是发现在触发反序列化时,会提示`ClassNotFound`,回顾Weblogic反序列化漏洞分析历程,发现可以将其包裹到一个上下文环境中,比如`BasicServiceContext`:
最终实现RCE:
通过内存搜索可以找到HTTP请求与响应对象:
但是这种方式有点繁琐。由于底层是Weblogic框架,也可以利用Weblogic自带的Request和Response对象实现命令回显:
由于传播、利用此文档提供的信息而造成任何直接或间接的后果及损害,均由使用本人负责,且听安全团队及文章作者不为此承担任何责任。
点关注,不迷路!
关注公众号回复“漏洞”获取环境搭建教程
原文始发于微信公众号(且听安全):【最新漏洞预警】CVE-2021–35587 Oracle Access Manager反序列化漏洞分析与命令回显构造