漏洞环境搭建参考:
-
https://k21academy.com/oracle-accesss-manager/oracle-access-manager-12c-12-2-1-3-0-download-installation-part/
-
https://k21academy.com/oracle-accesss-manager/oracle-access-manager-12c-rcu-configure-domain-12-2-1-3-0-part2/
在这篇文章中,我将详细介绍 OAM 12c 版本中的漏洞。使用 OAM 11g 版本,将需要更复杂的条件来 RCE。
让我们首先看一下由oracle.security.am.pbl.transport.http.AMServlet
类处理的 URL 路由/oam/server/opensso/sessionservice
:
AMServlet.doPost()
并没有做太多的工作,它只是调用 handleRequest()
然后调用 PBLFlowManager.processRequest()
来处理传入的请求:
在 PBLFlowManager.processRequest()
中,我们传入的 URI /oam/server/opensso/sessionservice
映射到一个名为 OPENSSO_CHECK_VALID_SESSION
的事件名称(eventName):
接下来,根据给定的 eventName 创建一个 EventHint,然后使用该 eventHint 从映射中获取 requestHandler:
在这种情况下,requestHandler
是 AgentRequestHandler
的一个实例,还有一个更大的这些处理程序URL映射的列表:
从 PBLFlowManager.handleBaseEvent()
中,请求流分为两部分:
-
第一部分:调用
requestHandler.process()
解析、验证传入的XML数据 -
第二部分:调用
PBLFlowManager.delegateToMasterController()
处理当前请求的逻辑特性
在第一部分,AgentRequestHandler.process()
将调用 handleXMLRequest()
将传入的数据解析为 XML 数据:
成功将数据解析为 XML 请求后,该方法继续跳转到 AgentRequestHandler.handleRequest()
要通过 isValid()
方法,传入的请求必须遵循以下形式:
<?xml version=”1.0" encoding=”UTF-8" standalone=”yes”?>
<RequestSet vers=”vers123" svcid=”session” reqid=”req_1”>
<Request dtdid=”dtd1" sid=”sid1">
Data
</Request>
</RequestSet>
然后,它将使用参数serviceId
(可控)调用 getServiceHandler()
:
serviceHandler
类型的svcid
有 4 种类型:
-
NamingService:com.iplanet.am.naming
-
AuthXMLHandler:auth
-
SessionRequestHandler:session
-
PolicyXMLHandler:policy
在这里,我们专注于 SessionRequestHandler
:
确定SessionRequestHandler
后,AgentRequestHandler.handleRequest()
会继续调用我们给定的sessionHandler.process()
,现在是SessionRequestHandler.process()
。
在 SessionRequestHandler.process()
中,它将从名为Request
的 xml 标记中获取数据,并将该数据再次解析为 XML 数据:
只需注意 SessionRequestParser.parseXML()
,如果传入的 xml 请求包含名为requester
的属性,则其数据将被 base64 解码并设置为名为Requester
的属性:
此时,我们的请求数据如下所示:
看这个分析文章听起来很直接,但构造完成这些数据并不容易!
成功解析传入的 XML 数据后,我们继续第二部分分析,PBLFlowManager.handleBaseEvent()
将继续调用 delegateToMasterController()
-> MasterController.process()
-> MasterController.processRequest()
-> OpenssoEngineController.processEvent()
,这是调用栈帧:
OpenssoEngineController
由上面提到的给定 EventHint
确定。
在 OpenssoEngineController.processEvent()
中,有一个 switch case 语句来处理每种事件类型,在我们的例子中,它是 OPENSSO_CHECK_VALID_SESSION
:
跟随这个分支,我们将看到对 OpenssoEngineController.unmarshal()
方法的调用,并带有给定的“requester”变量:
这是 unmarshal()
方法的内容:
我们可以很快看出,如果“requester”变量的形式是object:<base64 data>
,那么这个数据会直接反序列化,不做任何过滤。
这就是这个漏洞的来源,长话短说,请求是这样的:
OAM 建立在 weblogic 之上,并且 OAM 的类加载器还包含 weblogic 的库。所以是的,我们可以使用一些 weblogic gadgetchain 来RCE。
在尝试了许多旧的gadgetchain之后,我们发现CVE-2020-14644
gadgetchain仍然没有被全局序列化过滤器阻止。而我们最终的 PoC 也使用了这个gadgetchain来获得RCE!
在为OAM 12c打上最新补丁后,该漏洞poc失效了。起初,我们认为 Oracle 已经知道这个漏洞并设法修补它。在查看补丁并检查旧版本后,我们知道他们并没有修补该漏洞。
原因是:在最近的 OAM 12c 补丁中,他们放弃了对 OpenSSO 的支持,因此入口点/oam/server/opensso/sessionservice
也被意外删除了。但在 OAM 11g 中仍然适用,我们发现易受攻击的入口点仍然存在于完全更新的 OAM 11g 中。
在 OAM 11g 中,CVE-2020-14644 的gadget不存在,因此需要更多的工作来构建gadget。
Weblogic 10.3.6 和 OAM 11g 已经停产,2022 年 1 月 1 日之后没有针对它们的补丁。
这意味着:在 OAM 11g 中,此 Pre-Auth RCE 没有补丁。
漏洞分析文章翻译自:
https://testbnull.medium.com/oracle-access-manager-pre-auth-rce-cve-2021-35587-analysis-1302a4542316
原文始发于微信公众号(信安文摘):【安全记录】- Oracle Access Manager前台RCE (CVE-2021–35587)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论