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找到要處理的handleAdapter是SelectiveFlowHandlerAdapte。並且根據地址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 結尾
除此外,還有一些值得探討的地方例如,回顯方式的構造
