shiro反序列化分析

环境搭建

漏洞分析

参考:https://xz.aliyun.com/t/8997 查看CookieRememberMeManage file 加密解密并没有在这个类中实现,查看父类AbstractRememberMeManager 可以看到关键的一个密钥 file 调用AbstractRememberMeManager中的encrypt方法 file serialized参数为输入的账号root序列化后的值 使用Drop Frame跳到上一步查看 file 这里调用cipherService.encrypt file 第一个参数为serialized值为账户名root序列化后的值

使用的是AES加密 模式为CBC,128位,填充方式为PKCS5Padding file

ivBytes变量,值是随机生成的16个字节 file

然后跳到了这个类中的encrypt函数中

 return encrypt(plaintext, key, ivBytes, generate);
 plaintext 为 序列化的用户名
key 为 DEFAULT_CIPHER_KEY_BYTES 就是上面base64解码的那个密钥
ivBytes 为 随机生成的长度为16的字节
generate 为 true

这里就是加密的核心了 file 借个大佬的图 file 加密函数返回的output的值就是加密的结果 是将iv的值和aes加密的结果进行拼接 然后又回到了刚开始的地方 file file value就是上边的output 然后将value进行base64加密 并将结果设置为cookie中rememberMe的值 加密过程结束 加密过程为: 设定:密钥 = kPH+bIxk5D2deZiIxcaaaA== 1.获得明文 = 正常识序列化用户名后的字节(root) 2.以下步骤: 科普知识:正常的AES加密所需参数 = 想加密的字符串 + iv + key + CBC + padding shiro:AES加密 = 想加密的字符串 (明文) + iv(随机生成的长度为16的字节) + key(base64解码密钥的结果) + CBC + PKCS5Padding 3.随机生成的长度为16的字节 + AES加密结果 (就是拼接了一下) 4.base64加密 解密过程为: 设定:密钥 = kPH+bIxk5D2deZiIxcaaaA== 1.获得密文 = base64解密rememberMe参数传过来的值 2.以下步骤: 科普知识:正常的AES解密所需参数 = 想解密的字符串 + iv + key + CBC+PKCS5Padding shiro:AES解密 = 想解密的字符串(删除密文前16个字节的剩余字节)+iv(密文的前16个字节) + key(base64解码密钥的结果) + CBC + PKCS5Padding 3.对解密结果进行反序列化,触发payload

在解密处下断点 跟进找一下哪里触发了反序列化 这里运行了readobject 如果反序列化的恶意payload 就命令执行了 file

密钥爆破分析

当密钥不正确或类型转换异常时,目标Response包含Set-Cookie:rememberMe=deleteMe字段,而当密钥正确且没有类型转换异常时,返回包不存在Set-Cookie:rememberMe=deleteMe字段。 1)密钥不正确 Key不正确,解密时org.apache.shiro.crypto.JcaCipherService#crypt抛出异常 进而走进org.apache.shiro.web.servlet.impleCookie#removeFrom方法,在返回包中添加了rememberMe=deleteMe字段 于是获得的返回包包含了Set-Cookie:rememberMe=deleteMe字段。 2)类型转换异常 org.apache.shiro.mgt.AbstractRememberMeManager#deserialize进行数据反序列化,返回结果前有对反序列化结果对象做PrincipalCollection的强制类型转换 可以看到类型转换报错,因为我们的反序列化结果对象与PrincipalCollection并没有继承关系 反序列化方法捕获到该异 再次走到org.apache.shiro.web.servlet.SimpleCookie#removeFrom方法,为返回包添加了rememberMe=deleteMe字段 获得与第一种情况一样的返回包

根据上面的分析,我们需要构造payload排除类型转换错误,进而准确判断密钥。当序列化对象继承PrincipalCollection时,类型转换正常,SimplePrincipalCollection是已存在的可利用类 创建一个SimplePrincipalCollection对象并将其序列化

将序列化数据基于key进行AES加密并base64编码发起请求,当返回包不存在Set-Cookie:rememberMe=deleteMe字段时,说明密钥与目标匹配


shiro反序列化分析
http://example.com/2021/09/08/OldBlog/shiro反序列化分析/
作者
Autumn
发布于
2021年9月8日
许可协议