• Java安全之Cas反序列化漏洞分析


    Java安全之Cas反序列化漏洞分析

    0x00 前言

    某次项目中遇到Cas,以前没接触过,借此机会学习一波。

    0x01 Cas 简介

    CAS 是 Yale 大学发起的一个开源项目,旨在为 Web 应用系统提供一种可靠的单点登录方法,CAS 在 2004 年 12 月正式成为 JA-SIG 的一个项目,开源的企业级单点登录解决方案。

    0x02 远程调试环境搭建

    下载地址,将环境war包下载,部署到tomcat即可

    tomcat目录bin文件下,startup_debug.bat

    call %EXECUTABLE%" start %CMD_LINE_ARGS%
    

    改为

    set JPDA_TRANSPORT=dt_socket
    set JPDA_ADDRESS=5005
    set JPDA_SUSPEND=n
    call "%EXECUTABLE%" jpda start %CMD_LINE_ARGS%
    

    IDEA中设置Remote远程调试5005即可完成。

    0x03 漏洞分析

    漏洞详情

    4.1.7版本之前存在一处默认密钥的问题,利用这个默认密钥我们可以构造恶意信息触发目标反序列化漏洞,进而执行任意命令。

    • 影响版本 Apereo CAS <= 4.1.7
      实际上 4.2.X也能打,但是 <= 4.1.7使用的是硬编码,而后者属于随机密钥
      感觉上和Shiro的 550有点类似

    解析流程分析

    看web.xml得知,该项目基于Spring MVC开发。

    上图请求路径是/login的这里来直接找login的处理方法进行跟踪。

    从web.xml中可见,交给了DispatcherServlet去处理。

    这时候可以查看springmvc的配置文件cas-servlet.xml

    注意loginHandlerAdapter这个配置的bean,其中的属性有supportedFlowId的值为"login",同时属性flowExecutor-ref的引用值为loginFlowExecutor

    再看loginFlowExecutor这个bean中所配置的登录流程属性引用值就是我们webflow上下文配置中的loginFlowRegistry这个属性。

    因此我们来看一下loginHandlerAdapter这个bean对应的类为org.jasig.cas.web.flow.SelectiveFlowHandlerAdapter所起的作用,是如何来处理登录动作的。先来看一下这个类的父类org.springframework.webflow.mvc.servlet.FlowHandlerAdapter,这个是Springmvc中的一个类。

    FlowHandlerAdapter实现接口HandlerAdapter,而SelectiveFlowHandlerAdapter继承自FlowHandlerAdapter

    SelectiveFlowHandlerAdapter类在cas-server-webapp-actions模块下的org.jasig.cas.web.flow包下。
    因此Spring的DispatcherServlet找到要处理的handleAdapterSelectiveFlowHandlerAdapte。并且根据地址http://localhost:8080/cas/login?service=XXX,得到handler的flowId="login",即流程:loginFlowRegistry

    然后进入下面的handle方法,开始调取流程:

    当有登录请求时,spring则会调用该org.jasig.cas.web.flow.SelectiveFlowHandlerAdapter

    跟进this.flowUrlHandler.getFlowExecutionKey(request)可见,该方法会获取请求中的execution参数。

    而后会进行调用 this.executionRepository.parseFlowExecutionKey(flowExecutionKey);获取到key。

    跟进查看

    可见从execution参数,后分割UUID和_后面部分,而后面部分进行base64解密。对返回id和data进行赋值,然后返回ClientFlowExecutionKey对象

    下面调用this.executionRepository.getFlowExecution(key);,将刚刚获取到的ClientFlowExecutionKey对象,即key变量传递。跟进。

    这地方进行了数据的反序列化操作。先来看到构造方法,使用AES/CBC/PKCS7加密方式,并且密钥使用默认的密钥进行加密。

    而在解密后还会对数据进行解压缩GZIPInputStream处理后进行反序列化。

    漏洞复现与利用

    根据以上数据解析分析,我们只需要将cas中加密部分扣出来,然后进行GZIPOutputStream处理,而后将他进行base64加密,将处理后的gadgets加入到execution参数里面即可,当然还需要构造一下前面UUID的值。

    从github找到现成工具

    发现该工具只能执行whoami,随手把回显位置做了些改动,加入GUI界面
    GITHUB:
    https://github.com/nice0e3/Cas_Exploit

    Reference

    https://www.anquanke.com/post/id/198842

    0x04 结尾

    除此外,还有一些值得探讨的地方例如,回显方式的构造

    WX:TG9yaTI1NDgyNjYxNDU= 欢迎各位师傅来一起做技术交流
  • 相关阅读:
    python基础(一)
    python之使用__future__
    python中动态导入模块
    getResource()和getResourceAsStream以及路径问题
    〖转〗request.getparameter()和request.getAttribute()的区别
    IntelliJ IDEA 中module的dependencies是其它module时的注意事项
    IntelliJ IDEA 的Project structure说明
    c#中关于virtual,override和new的理解
    为什么在头文件中只能放声明不能放定义
    sql server 2008 中的架构(schame)理解
  • 原文地址:https://www.cnblogs.com/nice0e3/p/14820166.html
Copyright © 2020-2023  润新知