原因:Apache Shiro框架提供了记住我的功能(RememberMe),用户登陆成功后会生成经过加密并编码的cookie,在服务端接收cookie值后,Base64解码–>AES解密–>反序列化。攻击者只要找到AES加密的密钥,就可以构造一个恶意对象,对其进行序列化–>AES加密–>Base64编码,然后将其作为cookie的rememberMe字段发送,Shiro将rememberMe进行解密并且反序列化,最终造成反序列化漏洞。
影响范围:Shiro框架 验证手法: 验证是否存在shiro框架 1.返回包中存在 rememberMe=deleteMe 2.请求中cookie中加入 rememberMe=deleteMe 返回rememberMe=deleteMe
在反序列化时,不会对其进行过滤,所以如果传入恶意代码将会造成安全问题 在 1.2.4 版本前,是默认ASE秘钥,Key: kPH+bIxk5D2deZiIxcaaaA==,可以直接反序列化执行恶意代码 而在1.2.4之后,ASE秘钥就不为默认了,需要获取到Key才可以进行渗透
key获取方法:shiro高版本要求开发者自己设置,如果开发者没有设置,则默认动态生成,降低了固定密钥泄漏的风险。 但有可能存在代码复用的可能,可以在github上搜索"securityManager.setRememberMeManager(rememberMeManager); Base64.decode(“或"setCipherKey(Base64.decode(”) Guns框架内部集成了shiro并进行二次开发,作者自定义密钥并固定,此时用户若不对密钥进行再次修改,即使升级shiro版本,也依旧存在固定密钥的风险。
脚本跑(shiro-exploit ) 旧版本(1.2.4之前)使用AES-CBC加密模式,新版是使用AES-GCM加密模式。 shiro-exploit -v CBC加密版本 Version 为1 ,GCM加密版本 Version 为2 -u 参数可将payload发送至指定url,如不指定url将输出base64编码后的payload用于手工利用 -k 参数可指定shiro加密所用的key,如不指定将使用默认key kPH+bIxk5D2deZiIxcaaaA== 可修改文件头部的key来更换默认key python shiro-exploit.py check -u http://10.xxx.xxx.72 脚本爆破key shiro-exploit 内置6条tomcat回显链, [CommonsCollectionsK1/CommonsCollectionsK2/CommonsBeanutils1/CommonsBeanutils2/Jdk7u21/Jdk8u20]
python3 shiro-exploit.py echo -g CommonsCollectionsK1 ##不指定,默认为whoami python3 shiro-exploit.py echo -g CommonsCollectionsK1 -c ipconfig Shiro反序列化注入内存马 通过TemplatesImpl去加载恶意类,然后把动态注册Filter的代码写在反序列化的类的static方法中。 不同利用链有不同的内存马,不同点利用不同方式获取到standardContext 详情请看p牛的项目(https://github.com/phith0n/JavaThings。) CommonsBeanutils1Shiro内存马
|