Apache Shiro 在 Java 的權限及安全驗證框架中占用重要的一席之地,在它編號為550的 issue 中爆出嚴重的 Java 反序列化漏洞。下面,我們將模擬還原此漏洞的場景以及分析過程。
復現過程
一、 搭建漏洞環境
有大佬已經搭建了docker環境可以直接使用。在安裝docker后執行命令拉取環境運行就有了漏洞環境了。(docker真是個好東西啊)
1.拉取環境到本地
docker pull medicean/vulapps:s_shiro_1
2.啟動環境
docker run -d -p 80:8080 medicean/vulapps:s_shiro_1
因為我已經拉下來過了dockers環境了所以直接啟動docker,在docker中將shiro環境的8080端口映射到了主機的80端口,所以直接訪問127.0.0.1就可以了。
二、 漏洞分析
從官方的 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了。
三、 編寫POC
POC肯定是py寫快一點鴨,需要用到java的反序列化工具ysoserial(在文末附上這個jar包的下載鏈接),py的Crypto模塊,這個模塊安裝可能會出問題但是kali里py環境集成了這個模塊。這里是一個簡易版的POC只是生成一個payload然后使用,沒有實現自動化。
POC代碼如下:
四、 漏洞利用
先登陸,勾選remberme
然后抓包隨便點一個頁面包含有cookie參數的,這里抓的是登陸后的第一個包
在vps或同網段虛擬機中執行“python –m SimpleHTTPServer 8080”, 然后再使用poc生成payload,這里執行的是“wget http://127.0.0.1:7080/”,讓其去訪問我的服務器執行命令
修復建議
1、升級shiro版本
2、修改文件中硬編碼的密鑰