• 新闻动态
  • 行业动态
  • 公司新闻
  • 关于我们
  • 公司简介
  • 经典活动
  • 经验总结
    Apache Shiro反序列化识别那些事
    2020-06-12 11:15

    1.1 关于Apache Shiro

    Apache shiro是一个Java安全框架,提供了认证、授权、加密和会话管理功能,为解决应⽤安全提供了相应的API:

    1.认证-⽤用户身份识别,常被称为用户”登录”

    2.授权-访问控制

    3.密码加密-保护或隐藏数据防止被偷窥

    4.会话管理-用户相关的时间敏感的状态

    1.2 Shiro反序列化

    1.2.1 反序列化漏洞

    Shiro550:

    shiro≤1.2.4版本,默认使⽤了CookieRememberMeManager,由于AES使用的key泄露,导致反序列化的cookie可控,从而引发反序列化攻击。(理论上只要AES加密钥泄露,都会导致反序列化漏洞)

    1.2.2 Shiro识别

    要想识别Apache Shiro反序列列化漏洞,首先应该判断相关的Web站点是否使⽤了shiro框架。主要有以下⽅式:

    ● rememberMe

    可以在 cookie 追加一个 rememberMe=xx 的字段,这个字段是rememberMeManager默认的,然后看响应头部可以看看是否有 Set-Cookie: rememberMe=deleteMe; 的字段则可判断使⽤了shiro框架:

    1.png

    ● 自定义的 rememberMe字段

    前⾯通过在Cookie追加rememberMe字段进⾏判断,实际上这个默认字段的命名是可以修改的,Shiro支持在rememberMe管理器中自定义名称,可以通过在配置⽂件进⾏配置,例如下⾯的例子,将rememberMe设置成了了rememberMeTK: 

    1111.jpg

    同理,在springboot集成Shiro时也可以通过在shiro配置类中添加rememberMeManager的配置,修改默认命名为rememberMeTK:

    2222.jpg

    然后在securityManager中注册: 

    3333.jpg

    通过上述方式配置后,在cookie中添加rememberMe就不会有deleteMe返回了:

    2.png

    当使⽤我们设置的rememberMeTK字段尝试探测时,响应中成功返回熟悉的deleteMe:

    3.png

    这种方式从一定程度上增加了探测识别shiro框架的难度,但是如果可以正常登录的话,是可以得到相关的值的,

    因为这个rememberMe本身是Shiro 提供了记住我(RememberMe)的功能,比如访问如淘宝等一些站时,关闭了浏览 器下次再打开时还是能记住你是谁,下次访问时需再登录即可访问。

    基本流程是先在登录页面选中 RememberMe 然后登录成功;如果是浏览器登录一般会把 相关 的Cookie字段,也就是我们探测的关键字段(例例如rememberMeTK)写到客户端并保存下来。那么此时只要去浏览器本地查看即可。

    可以通过burp插件的⽅方式,在每一个请求发起时自动在cookie中追加探测字段(例如rememberMe=tkswifty),如果响应中包含=deleteMe则直接亮显示,那么就可以很便捷的发现使⽤了shiro的站点,进一步进行漏洞发现利了:

    4.png

    ● 相关cms

    一些cms本身就是基于shiro进⾏开发的,例如jeesite、 jeecg、 ......

    1.2.3 关键因素

    整个漏洞简单的cookie处理流程是:得到rememberMe的cookie值-->Base64解码-->AES解密-->反序列化。除了找到相关的参数(默认rememberMe)以外,还需要结合如下因素:

    ● key

    shiro在1.4.2版本之前, AES的模式为CBC, IV是随机生成的,并且IV并没有真正使用起来。所以整个AES加解密过程的key就很重要了,正是因为AES使用默认的KEY/常见的KEY/KEY泄露导致反序列化的cookie可控,从⽽引发反序列化漏洞。

    常见的key如下:

    4444.jpg

    有时候可能存在未知key的情况,那么可以采取 Shiro-721 的报错逻辑来进⾏遍历key(前提是正常登录得到一个rememberMe的值):

    Shiro721:

    rememberMe cookie通过AES-128-CBC模式加密,易受到Padding Oracle攻击。可以通过结合有效的rememberMe cookie作为Padding Oracle攻击的前缀,然后精⼼制作rememberMe来进⾏反序列化攻击。

    Tip:可以结合JRMP gadget使⽤用,可以⼤大幅减少生成序列化数据的长度,同时在1.4.2版本后,shiro已经更换 AES-CBC AES-CBC 为 AES-GCM AES-GCM ,无法再通过Padding Oracle遍历key。

    ● 可用gadget

     利⽤链(gadget chains),俗称gadget。通俗来说就是一种利⽤方法,它是从触发位置开始到执⾏命令的位置结束,也可以说是漏洞验证方法(POC)。shiro反序列化中常⽤的有(遇到过的):

    5555.jpg

    1.2.4漏洞识别

    ● 基于OOB

    可以使用ysoserial-URLDNS-gadget结合dnslog进⾏检测,其不受JDK版本和安全策略影响, 除非存在千赢国际注册限制DNS不能出网。构造好对应的请求后,若dnslog成功记录到记录,则可以说明漏洞存在。

    并且这种方式也是遍历key很不错的方法,通过在dnslog域名前加⼊对应key的randomNum,记录到对应请求时即可直接定位对应的key了: 

    5.png

    ● 基于时间延迟

    在不出网的情况下,可以结合SQL盲注的思路,可以考虑结合时间延迟进⾏判断和获取数据,可以通过改写ysoserial,执⾏对应的时间延迟代码,例如这里如果系统不是windows类型的话则会进行时间延迟: 

    6666.jpg

    具体效果

    6.png

    ● 基于报错

    在不出⽹的情况下,若相关web应⽤未屏蔽报错信息,可以考虑结合触发Java异常进⾏判断和获取数据,可以通过改写ysoserial,执⾏对应的代码进⾏异常抛出,例如下⾯的代码,通过抛出NoClassDefFoundError异常,在异常信息中输出shiro-vul-discover关键字进⾏判断

    7777.jpg

    具体效果

    7.png

    1.3日志审计

    在⽇志信息⾥是可以看到序列化报错的信息的,可以根据相关日志查看相关应⽤是否遭到shiro反序列化攻击尝试

    以在Tomcat的报错⽇志 catalina.out 为例,关注RememberMeManager的相关信息可以看到相关的异常:

    8888.jpg

    9999.jpg

    qq.jpg

    aa.jpg

    zz.jpg

    合千赢官方下载安实验室:CVE-2019-0192 Apache Solr远程反序列化代码执行漏洞

    上一篇:今天你pwn了吗(二)
    下一篇:无参数读文件和RCE总结
    版权所有 合天智汇信息技术有限公司 2013-2020 湘ICP备14001562号-6
    Copyright © 2013-2020 Heetian Corporation, All rights reserved
    4006-123-731