CVE-2016-4437 - Shiro反序列化
CVE-2016-4437 - Shiro反序列化
0x00 漏洞概述
Apache Shiro是一款开源的java安全框架,执行身份验证、授权、密码和会话管理。 Apache Shiro 1.2.4及以前版本中,加密的用户信息序列化后存储在名为rememberMe的Cookie中。攻击者可以使用Shiro的默认密钥伪造用户Cookie,触发Java反序列化漏洞,进而在目标机器上执行任意命令。
0x01 影响范围
Apache Shiro <=1.2.4
0x02 环境搭建
使用vulhub搭建环境
$ docker-compose up -d
0x03 漏洞原理
Shrio550
shrio550如果打开源码来进行审计的话,源码当中将AES加密的秘钥固定在源码当中,如果程序员没有去更改他或者程序员使用一些常用的秘钥的话,攻击者可以通过固定秘钥或者枚举秘钥的方式,然后就可以完成cookie当中的这个字段的破解
用户在使用正确的账号密码登录,服务器认证通过之后,会经过序列化–>AES加密–>base64编码,最后得到一个cookie信息一般是rememberMe字段,然后一cookie的方式返回 到客户端,客户端就把这个cookie信息存下来,在下一次用户浏览器关闭后在登录到这个站点后,通过cookie当中的rememberMe信息,又传到服务器,服务器就是用反过的方式,首先先进性base64编码–>AES解密–>反序列化
shrio721
shrio的721的区别跟shrio550的区别在于加密算法,shrio721使用的是AES128-CBC的一个分组,AES128-CBC是什么意思呢,AES是对称加密的算法128是表示一个分组的长度以128个字节为一组,CBC是分组秘钥连接模式,他的一个过程是这样子的,首先会将我们的加密明文案进行分组,以128位进行分组,这时候就一定有一组是不足128位的,这时候就使用了一个pkcs5填充方式,后面缺少多少位就填充多少位,在这时候就可能受到一个oracle的填充攻击,能在不知道 秘钥的情况下能够去破解出他的明文,第二点可以通过字节翻转的攻击在不知道秘钥的时候可以进行字符串的更改,所以就可以通过oracle填充攻击,去破解AES128-CBC的加密方式,然后就可以将恶意的cookie信息和之前的cookie信息拼接到一起构造恶意的payload,前提条件就是需要获取一次合法用户的cookie信息且服务器含有可以利用的攻击链
0x04 漏洞检测
尝试登录,登录的返回包中有rememberMe=deleteMe字段
或者不登录,发送一个GET请求登录页面的包,把cookie改成rememberMe=1,返回包中也存在rememberMe=deleteMe字段
则可判断使用了shiro框架,接下来使用工具ShiroExploit 检测是否存在shiro反序列化漏洞
https://github.com/feihong-cs/ShiroExploit-Deprecated/releases/tag/v2.51
当命令框可输入,代表存在漏洞
可以勾选便捷操作,反弹shell,输入攻击机的ip和端口号,并在攻击机监听端口,可成功获取目标shell