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 結尾

除此外,還有一些值得探討的地方例如,回顯方式的構造


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM